我有下表:
ID: bigint autoinc
NAME: varchar(255)
DESCRIPTION: text
ENTRYDATE: date
我正在尝试在表格中插入一行。它执行时没有错误,但没有任何内容插入数据库。
try {
$query = "INSERT INTO mytable (NAME, DESCRIPTION, ENTRYDATE) VALUES(?,?,?)";
$stmt = $conn->prepare($query);
$name= 'something';
$desc = 'something';
$curdate = "CURDATE()";
$stmt->bind_param("sss", $name, $desc, $curdate);
$stmt->execute();
$stmt->close();
$conn->close();
//redirect to success page
}
catch(Exception $e) {
print $e;
}
它运行正常并重定向到成功页面,但在表格中找不到任何内容。为什么不起作用?
答案 0 :(得分:2)
您确定没有错误吗?例如,列名中似乎有拼写错误。
请注意,默认情况下,PDO 非常对错误保密。
有关如何解决此问题,请参阅How to squeeze error message out of PDO?。
答案 1 :(得分:2)
请尝试改为准备此查询:
"INSERT INTO mytable (NAME, DESCRIPTION, ENTRYDATE) VALUES(?,?,CUR_DATE())"
并检查$stmt->execute()
的结果。它会向您发出警告,"CUR_DATE()"
(原文如此)不是有效的DATE
。
您可以通过检查execute()
的返回值并查询errorInfo()
方法来检查语句是否正确执行:
if (!$stmt->execute()) {
throw new Exception($stmt->errorInfo(), stmt->errorCode());
}
请注意,失败时,execute()
不会自动抛出异常。你必须检查自己的成功操作和失败。
答案 2 :(得分:2)
如何用DESCTIPTION
中的DESCRIPTION
替换$query
?
修改强>
出于好奇,我创建了一个名为mytable
的表,并将您的代码复制粘贴到PHP脚本中。
此处一切正常并插入行,但绑定参数CURDATE()
未正确执行且ENTRYDATE
单元格已分配0000-00-00
。
您确定要监视脚本应该插入的相同数据库和表吗?
与error_reporting(E_ALL);
合作时会发生什么?
您是否确认该脚本实际完成了插入?
以下似乎按预期工作:
error_reporting(E_ALL);
try {
$query = "INSERT INTO mytable (NAME, DESCRIPTION, ENTRYDATE) VALUES (?, ?, CURDATE())";
$stmt = $conn->prepare($query);
$name= 'something';
$desc = 'something';
$stmt->bind_param("ss", $name, $desc);
$stmt->execute();
if ($conn->affected_rows < 1) {
throw new Exception('Nothing was inserted!');
}
$stmt->close();
$conn->close();
//redirect to success page
}
catch(Exception $e) {
print $e->getMessage();
}
答案 3 :(得分:0)
自动提交是否可能关闭?
如果是这样,那么你必须像这样提交你的插入
/* commit transaction */
$conn->commit();
此致