我在PHP中使用PDO连接到MySQL。我的项目是一个聊天应用
每次有人发送新消息时,我都会将该消息插入表chat_messages
中,并更新表chat_users
中的时间戳,以表明那是用户最后一次活动。
$sql = "INSERT INTO chat_messages
(email_sender, message, sent)
VALUES ('" . $email . "', '" . $message . "', '" . time() . "')";
$query = $pdo->prepare($sql);
if ($query->execute()) {
$sql2 = "UPDATE chat_users SET last_active = UNIX_TIMESTAMP()
WHERE email = '$email'";
$pdo->prepare($sql2)->execute();
// to test my query syntax is correct:
echo $sql2;
}
未在数据库中更新时间戳。当我将echo $sql2
的输出粘贴到phpMyAdmin中时,查询有效。
我在做什么错了?
谢谢
答案 0 :(得分:4)
如果您像这样将变量合并到SQL中,则您确实会错失使用准备好的语句的许多好处。如果您准备使用占位符并绑定值,那么它可能会解决您的问题,并且更安全地防止SQL注入。
$sql = "INSERT INTO chat_messages(email_sender, message, sent) VALUES (?, ?, ?)";
$query = $pdo->prepare($sql);
if ($query->execute([$email, $message, $time])) {
$sql2 = "UPDATE chat_users SET last_active = UNIX_TIMESTAMP() WHERE email = ?";
$pdo->prepare($sql2)->execute([$email]);
// to test my query syntax is correct:
echo $sql2;
}
如果查询失败(即使不是失败),则应在查询失败时set PDO to throw exception s,这样一来,您将获得关于错误原因的描述性错误消息。