这是我第一次尝试使用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()并将数据插入到数据库中。
很抱歉这篇长篇文章,但为了简单起见,我试图删除很多字段而不留下任何相关代码。
答案 0 :(得分:0)
Request对象中的所有数据都是字符串。因此,如果是字符串"NULL"
,则需要手动将其转换为null
。
解决此问题的最简单方法是停止插入user_id
,因为它是一个自动增量字段。即准备的正确SQL语句是:
$query = $this->connection->prepare('INSERT INTO ' . TABLE_USERS
. ' (name, last_login) VALUE (:name, :last_login)');