0

我正在尝试使用 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 查询有什么问题?

4

1 回答 1

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

当您使用占位符时,您不需要引用它们。当您':time'在 SQL 中时,它会将带有文本的字符串传递: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)");
于 2013-09-01T15:41:14.587 回答