插入PDO的空条目,bindparam失败

时间:2013-09-01 14:26:05

标签: php mysql pdo

我正在尝试使用PDO将带有一些值的表单插入到MySQL数据库中。

    /*** Values for the form ***/
    $date = date_create();
    $time = date('Y-m-d H:i:s');
    $message = $_POST['message'];
    $uid = $_SESSION['SESS_MEMBER_ID'];
    $admin = 1;

    /*** prepare the SQL statement ***/
    $stmt = $db->prepare("INSERT INTO messages (message_id, timestamp, uid, admin, read, edited, message) VALUES ('',':time',':uid',':admin','','',':message')");

    /*** bind the paramaters ***/
    $stmt->bindParam(':time', $time, PDO::PARAM_STR); 
    $stmt->bindParam(':uid', $uid, PDO::PARAM_STR);
    $stmt->bindParam(':admin', $admin, PDO::PARAM_INT, 1);
    $stmt->bindParam(':message', $message, PDO::PARAM_STR);

    /*** execute the prepared statement ***/
    $stmt->execute();

结果是:
一个只有message_id设置的空条目,并且消息仍然是它的占位符:mesagge

(message_id, timestamp, uid, admin, read, edited, message)    
15 | 0000-00-00 00:00:00 | 0 | 0 | 0 | 0 |:bericht

占位符或INSERT查询有什么问题?

1 个答案:

答案 0 :(得分:1)

$stmt = $db->prepare("INSERT INTO messages (message_id, timestamp, uid, admin, read, edited, message) VALUES ('',':time',':uid',':admin','','',':message')");

当您使用占位符时,您不需要引用它们。当您在SQL中有':time'时,它会将带有文本:time的字符串传递给数据库。您的SQL应如下所示:

$stmt = $db->prepare("INSERT INTO messages (message_id, timestamp, uid, admin, read, edited, message) VALUES ('',:time,:uid,:admin,'','',:message)");

(编辑,基于IMSoP的评论)

如果没有添加数据,您也不一定需要在INSERT中包含字段。如果缺少某列,则将根据表的设计使用该列的默认值添加该行;如果没有,则为NULL。如果它是一个AUTO_INCREMENT字段,那么它不应该在你的INSERT语句中,因为它会导致问题。你不能在设置为NOT NULL的字段上使用它,重要的是要记住NULL和''是不同的值,所以使用它将取决于你如何编写其余的代码;但你可以使用以下代码:

$stmt = $db->prepare("INSERT INTO messages (timestamp, uid, admin, message) VALUES (:time,:uid,:admin,:message)");