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

时间:2017-04-07 20:42:32

标签: php mysql rest pdo slim

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

  

常规错误:1366不正确的整数值:' NULL'对于列' last_login'在第1行

验证每个参数似乎是一项令人筋疲力尽的任务。我想知道这是我唯一的选择,还是我缺少的东西。

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

表格设计

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'消息' SQLSTATE [HY093]:参数无效   number:参数未定义

我认为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

在excute上添加jsonSerialize()后,insert方法可以正常工作。尝试从index.php调用addUser()并将数据插入到数据库中。

很抱歉这篇长篇文章,但为了简单起见,我试图删除很多字段而不留下任何相关代码。

1 个答案:

答案 0 :(得分:0)

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

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

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