【发布时间】:2019-02-08 22:11:54
【问题描述】:
我正在使用 PHP/MySQL 来存储从网页收集的数据。我来了
您的 SQL 语法有错误;检查与您的 MySQL 服务器版本相对应的手册,以获取正确的语法,以便在 'INSERT INTO Narrative_photos VALUES (`filename`, `narrative_id`) VALUES ('ash_02
当我将 PHP 生成的语句粘贴到 MySQL 控制台时,该语句运行正常。
这是 PHP 代码:
foreach ($files['pictures']['final_name'] as $key => $final_name) {
$sql .= "INSERT INTO narrative_photos ";
$sql .= "(`filename`, `narrative_id`) ";
$sql .= "VALUES (";
$sql .= "'" . db_escape($db, $final_name) . "', ";
$sql .= "'LAST_INSERT_ID()'); ";
}
它会产生如下所示的东西:
INSERT INTO narrative_photos VALUES (`filename`, `narrative_id`) VALUES ('ash_020819-140257.png', 3);
如果我将它粘贴到 MySQL 中,它就可以工作。但是如果我注释掉 PHP 代码并替换:
$sql .= "INSERT INTO narrative_photos VALUES (`filename`, `narrative_id`) VALUES ('ash_020819-140257.png', 3);";
它继续抛出 MySQL 错误。
我已经玩了几个小时了,但我不知道我的错误在哪里。我会欣赏第二双眼睛。谢谢!
编辑:这是上下文的整个函数。
function insert_narrative($narrative, $files) {
global $db;
$sql = "INSERT INTO narratives ";
$sql .= "(date, positive_thing, what_you_did, goals, plan, entered_by, library_id) ";
$sql .= "VALUES (";
$sql .= "'" . db_escape($db, $narrative['sqldate']) . "', ";
$sql .= "'" . db_escape($db, $narrative['positive_thing']) . "', ";
$sql .= "'" . db_escape($db, $narrative['what_you_did']) . "', ";
$sql .= "'" . db_escape($db, $narrative['goals']) . "', ";
$sql .= "'" . db_escape($db, $narrative['plan']) . "', ";
$sql .= "'" . db_escape($db, $narrative['entered_by']) . "', ";
$sql .= "'" . db_escape($db, $_SESSION['library_id']) . "'";
$sql .= "); ";
if (!empty($files['pictures']['final_name'])) {
foreach ($files['pictures']['final_name'] as $key => $final_name) {
$sql .= "INSERT INTO narrative_photos ";
$sql .= "(`filename`, `narrative_id`) ";
$sql .= "VALUES (";
$sql .= "'" . db_escape($db, $final_name) . "', ";
$sql .= "LAST_INSERT_ID()); ";
}
}
$result = mysqli_query($db, $sql);
if ($result) {
return true;
} else {
echo mysqli_error($db);
db_disconnect($db);
exit;
}
}
编辑#2: 我刚刚意识到,与语法错误无关,我的方法是行不通的,因为 LAST_INSERT_ID 可能会为每个插入获取 id,而不仅仅是使用主表中的 id。我已经修改了函数,但在 SET @narrative_id 处仍然出现语法错误。这是代码。
$sql = "INSERT INTO narratives ";
$sql .= "(date, positive_thing, what_you_did, goals, plan, entered_by, library_id) ";
$sql .= "VALUES (";
$sql .= "'" . db_escape($db, $narrative['sqldate']) . "', ";
$sql .= "'" . db_escape($db, $narrative['positive_thing']) . "', ";
$sql .= "'" . db_escape($db, $narrative['what_you_did']) . "', ";
$sql .= "'" . db_escape($db, $narrative['goals']) . "', ";
$sql .= "'" . db_escape($db, $narrative['plan']) . "', ";
$sql .= "'" . db_escape($db, $narrative['entered_by']) . "', ";
$sql .= "'" . db_escape($db, $_SESSION['library_id']) . "'";
$sql .= "); ";
$sql .= "SET @narrative_id = LAST_INSERT_ID()";
if (!empty($files['pictures']['final_name'])) {
foreach ($files['pictures']['final_name'] as $key => $final_name) {
$sql .= "INSERT INTO narrative_photos ";
$sql .= "(`filename`, `narrative_id`) ";
$sql .= "VALUES (";
$sql .= "'" . db_escape($db, $final_name) . "', ";
$sql .= "@narrative_id); ";
}
}
【问题讨论】:
-
我认为你不想要这些引号
'LAST_INSERT_ID()'事实上,如果你可以完全删除它。因为密钥是在插入时自动完成的。基本上你将一个字符串传递给表的 Pkey 。这就是您收到错误的原因。 -
删除引号并不能消除错误。
LAST_INSERT_ID()的原因是我在此之前有一条 SQL 语句写入相关表。 -
好吧,
LAST_INSERT_ID是一个 MySql 函数,就像在DATE(datetime)或WHERE周围加上引号。 -
您如何尝试运行查询 - 因为它可能是一个多查询?
-