Php Slim 3-getParsedBody()整数值不正确:';空';

Php Slim 3-getParsedBody()整数值不正确:';空';,php,mysql,rest,pdo,slim,Php,Mysql,Rest,Pdo,Slim,这是我第一次尝试Slim 3。我试图创建一个简单的web应用程序,但每当我试图检索NULL/Empty请求参数时,它总是一个字符串,并且试图将值保存到数字列中会导致 一般错误:1366第1行“上次登录”列的整数值不正确:“NULL” 验证每个参数似乎是一项累人的任务。我想知道这是我唯一的选择还是我遗漏了什么 我在试图将带有私有字段的对象保存到数据库中时也遇到了一些问题,因此,如果您对我的方法有任何意见,我将不胜感激 表格设计 CREATE TABLE `users` ( `user_id`

这是我第一次尝试Slim 3。我试图创建一个简单的web应用程序,但每当我试图检索NULL/Empty请求参数时,它总是一个字符串,并且试图将值保存到数字列中会导致

一般错误:1366第1行“上次登录”列的整数值不正确:“NULL”

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

我在试图将带有私有字段的对象保存到数据库中时也遇到了一些问题,因此,如果您对我的方法有任何意见,我将不胜感激

表格设计

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()将导致

带有消息“SQLSTATE[HY093]”的“PDOException”:参数无效 编号:未定义参数

我假设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(),并将数据插入数据库


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

请求对象中的所有数据都是字符串。因此,如果它是字符串
“NULL”
,则需要手动将其转换为
NULL

解决此问题的最简单方法是停止插入
user\u id
,因为它是一个自动递增字段。i、 e.要准备的正确SQL语句是:

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

显示您正在执行的实际卷曲请求。听起来您发送的字符串值是“NULL”而不是NULL。@MikaTuupola这是由PhpStorm rest工具或Postman(Chrome扩展)处理的。基本上是要填充的字段,正如Rob在回复中提到的,它总是以字符串的形式出现。我只是认为除了手动转换所有字段之外,必须有一种更简单的方法来处理这个问题。特别是在大量领域,而且必须单独完成。至于
用户id
我把它放在那里只是为了测试。我在很多表中有太多可空的数字字段,在其中插入
“null”
显然是一个问题。使用zend inputfilter之类的筛选和验证库,并为其创建一个
“null”
空的
筛选器?很抱歉,花了这么长时间,但这实际上非常有用,因此我将其标记为答案。