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