Mysql_query不会将id复制到另一行

问题描述 投票:0回答:1

我有一个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);
}
php mysql mysqli
1个回答
0
投票

首先,您在第一个示例中有一个可以修复的转义/引用问题:

$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特定的,所以如果你使用另一个数据库后端,你花在学习上的时间不会浪费。

© www.soinside.com 2019 - 2024. All rights reserved.