我有一个INSERT查询将id的值复制到另一行名为sortingId
,这行正常。
当我尝试直接在phpmyadmin中将id复制到sortingId时,它也能正常工作。
但结合在下面的代码中,它不起作用。没有错误,但sortingId只是0。
如果我将$sql2
更改为“asdjh”它不会得到错误,所以看起来第二个mysql_query
被忽略并且从未被执行过
$sql1 = "INSERT INTO items (name) VALUES (\'TEC TEST !"#!12\');";
$sql2 = "SELECT @last_id := MAX(id) FROM items; UPDATE items SET sortingId = id WHERE id = @last_id;";
$sql = mysqli_query($this->db, $sql1);
$sql = mysqli_query($this->db, $sql2);
if (mysqli_insert_id($this->db) > 0) {
$this->response($this->json(array( 'inserted_id' => mysqli_insert_id($this->db))), 200);
}
更新 - 在tadman的大力帮助下:
不得不通过删除“;”来分离mysqli查询并为每一行进行查询:
$sql1 = "INSERT INTO items (name) VALUES (\'TEC TEST !"#!12\')";
$sql2 = "SELECT @last_id := MAX(id) FROM items";
$sql3 = "UPDATE items SET sortingId = id WHERE id = @last_id";
$sql = mysqli_query($this->db, $sql1);
if(mysqli_insert_id($this->db) > 0){
$responsedId = mysqli_insert_id($this->db);
$sql = mysqli_query($this->db, $sql2);
$sql = mysqli_query($this->db, $sql3);
$this->response($this->json(array( 'inserted_id' => $responsedId)), 200);
}
首先,您在第一个示例中有一个可以修复的转义/引用问题:
$stmt = $this->db->prepare("INSERT INTO items (name) VALUES (?)");
$stmt->bind_param("s", "TEC TEST !\"#!12");
$stmt->execute();
bind_param
函数使得插入任意数据变得非常容易,而不必为逃避问题而烦恼,并且作为奖励使得插入用户提供的数据也可靠地安全,而没有SQL注入的风险。
这里最大的问题是试图将两个查询强制转换为单个query
调用:
$sql2 = "SELECT @last_id := MAX(id) FROM items; UPDATE items SET sortingId = id WHERE id = @last_id;";
$sql = mysqli_query($this->db, $sql2);
;
分隔符仅供交互式客户端使用,例如mysql
命令行工具或流行的前端。 mysqli
驱动程序不会为您执行此操作,而是需要将其拆分:
$res1 = $this->db->query("SELECT @last_id := MAX(id) FROM items");
$res2 = $this->db->query("UPDATE items SET sortingId = id WHERE id = @last_id");
在那里,我已经应用了一些关于如何更有效地使用mysqli
的建议。
最后要注意的是PDO使用起来会更加愉快,所以如果你刚刚开始考虑这种方法。它不是MySQL特定的,所以如果你使用另一个数据库后端,你花在学习上的时间不会浪费。