Slim 3 - getParsedBody() 不正确的整数值:'NULL'

Slim 3 - getParsedBody() Incorrect integer value: 'NULL'

这是我在 Slim 3 上的第一次尝试。我正在尝试制作一个简单的 Web 应用程序,但每当我尝试检索 NULL/Empty 请求参数时,它始终是一个字符串,并试图保存该值进入数字列将导致

General error: 1366 Incorrect integer value: 'NULL' for column 'last_login' at row 1

验证每个参数似乎是一项艰巨的任务。我想知道这是我唯一的选择还是我遗漏了什么。

我在尝试将具有私有字段的对象保存到数据库中时也遇到了一些问题,因此非常感谢您对我的方法提出任何意见。

Table设计

CREATE TABLE `users` (
  `user_id` int(10) unsigned NOT NULL AUTO_INCREMENT,
  `name` varchar(50) NOT NULL,
  `last_login` datetime DEFAULT NULL,
  PRIMARY KEY (`user_id`)
)

用户模型

class User implements JsonSerializable
{

    private $user_id;
    private $name;
    private $last_login;

    public function __construct($user_id = null, $name = null, $last_login = null)
    {
        if ($user_id !== null) $this->user_id = $user_id;
        if ($name !== null) $this->name = $name;
        if ($last_login !== null) $this->last_login = $last_login;
    }

    /**
     *  Getters and setters
     */

    function jsonSerialize()
    {

        return get_object_vars($this);
    }
}

UserDAO

class UserDAO
{

    public function addUser(User $user)
    {

        $query = $this->connection->prepare('INSERT INTO ' . TABLE_USERS . ' VALUE (:user_id, :name, :last_login)');
        $result = $query->execute((array)$user->jsonSerialize());

        return $result;
    }
}

不在执行时调用 jsonSerialize() 将导致

'PDOException' with message 'SQLSTATE[HY093]: Invalid parameter number: parameter was not defined

我假设 PDO 无法访问模型的私有字段,但我可能错了。


路线

$app->post('/user/add', function (Request $request, Response $response) {

    $input = $request->getParsedBody();

    $userDAO = new UserDAO();

    $id = $input['user_id'];
    $name = $input['name'];
    $last = $input['last_login'];

    // Set ID as NULL to show the difference dump between ID and Last_login
    $user = new User(null, $name, $last);

    var_dump($input);
    var_dump($user);

    $userDAO->addUser($user);
});

转储结果

C:\wamp64\www\Rest\app\core\Routes.php:61:
array (size=3)
  'user_id' => string 'NULL' (length=4)
  'name' => string 'B' (length=1)
  'last_login' => string 'NULL' (length=4)

C:\wamp64\www\Rest\app\core\Routes.php:62:
object(User)[59]
  private 'user_id' => null
  private 'name' => string 'B' (length=1)
  private 'last_login' => string 'NULL' (length=4)

我想这就是整个问题,如何以有效的方式将此 字符串 'NULL' 转换为 NULL


插入方法在执行时添加 jsonSerialize() 后工作正常。尝试从 index.php 调用 addUser() 并将数据插入数据库。

抱歉这么长 post,但为了简单起见,我尝试删除了很多字段,但没有留下任何相关代码。

Request对象中的所有数据都是字符串。因此,如果它是字符串 "NULL",您需要手动将其转换为 null

解决此问题的最简单方法是停止插入 user_id,因为它是一个自动递增字段。即要准备的正确 SQL 语句是:

$query = $this->connection->prepare('INSERT INTO ' . TABLE_USERS 
    . ' (name, last_login) VALUE (:name, :last_login)');