查询只能在SQL中使用,而不能在PDO中使用

时间:2018-10-31 22:33:55

标签: php mysql pdo

我在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中时,查询有效

我在做什么错了?

谢谢

1 个答案:

答案 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,这样一来,您将获得关于错误原因的描述性错误消息。