我有一个INSERT查询将id的值复制到名为sortingId
的另一行,这样可以正常工作。
当我尝试将id直接复制到sortedId中时,它也可以在phpmyadmin中使用。
但是在下面的代码中加入了它,它不起作用。没有错误,但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);
}
答案 0 :(得分:0)
首先,您在第一个示例中有一个可以修复的转义/引用问题:
$stmt = $this->db->prepare("INSERT INTO items (name) VALUES (?)");
$stmt->bind_param("s", "TEC TEST !\"#!12");
$stmt->execute();
bind_param
函数使得插入任意数据变得非常容易,而不必担心转义问题,并且作为奖励可以安全地插入用户提供的数据,而不会有SQL注入的风险。 / p>
这里最大的问题是尝试将两个查询强制转换为一个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的,所以如果你使用另一个数据库后端,你花在学习它上面的时间不会被浪费。