php for循环插入sql

laximzn5  于 2021-06-20  发布在  Mysql
关注(0)|答案(2)|浏览(409)

你能解释一下为什么这个代码不能插入数据库吗?

//INSERT VALUES IN ORDERS
    $sqlInsert = "";
        for($i = 0; $i < count($_SESSION['cart']); $i++)
        {
            $resSelect = mysqli_fetch_assoc($sqlContent);

            $prodID = $resSelect['ProdID'];
            $price = $resSelect['Price'];
            $quantity = $_SESSION['cart'][$resSelect['ProdID']];
            $sum = ($_SESSION['cart'][$resSelect['ProdID']] * 
            $resSelect['Price']);
            $sqlInsert .= "INSERT into Order (ProdID, 
            Quantity, Price,  Sum, OrderID) 
            VALUES ($prodID, $quantity, $price, $sum, $userID);";

        }
        mysqli_query($dbLink, $sqlInsert);

这就是 var_dump($sqlInsert) :

INSERT INTO Order (ProdID, quantity, 
       Price, Sum, OrderID) VALUES (1, 4, 200, 800, 10);
       INSERT INTO Order (ProdID, quantity, 
       Price, Sum, OrderID) VALUES (7, 3, 200, 600, 10);
       INSERT INTO Order (ProdID, quantity, 
       Price, Sum, OrderID) VALUES (9, 3, 200, 600, 10);

这在数据库中起作用。以及 var_dump(mysqli_query($dbLink, $sqlInsert)) 总是假的。
非常感谢

iq3niunx

iq3niunx1#

这正是准备好的声明的目的:

// Note that ORDER is a MySQL reserved keyword and needs special escaping
$stmt = $dbLink->prepare("INSERT into `Order` (ProdID, 
        Quantity, Price, Sum, OrderID) VALUES (?,?,?,?,?)");
$stmt->bind_param('iiddi', $ProdID, $Quantity, $Price, $Sum, $OrderID);

for($i = 0; $i < count($_SESSION['cart']); $i++)
{
    $resSelect = $sqlContent->fetch_assoc();

    $ProdID = $resSelect['ProdID'];
    $Quantity = $_SESSION['cart'][$resSelect['ProdID']];
    $Price = $resSelect['Price'];
    $Sum = $_SESSION['cart'][$resSelect['ProdID']] * $resSelect['Price'];
    $OrderID =  $userID;

    $stmt->execute();
}

原始代码中的错误数量高得惊人,根本无法正常工作,因此将来您需要更加小心,更有条理地寻找解决方案。逐步建立,边测试边做,以确保您不会深入到您不完全理解的解决方案中。

sg2wtvxw

sg2wtvxw2#

正如上面提到的其他注解一样,您应该始终检查 mysqli_query() . 参见示例代码:http://php.net/manual/en/mysqli.error.php
这个 mysqli_query() 函数不支持执行多个语句。
我不建议使用 mysqli_multi_query() . 使用它几乎没有什么好处,而且它引入了新的潜在sql注入漏洞(比如著名的小bobby表卡通)。我和mysql的前工程总监谈过,他说:“多重查询没有存在的理由,它只会造成伤害。”
您应该一次执行一条insert语句。没有理由将多个语句附加在一起。
如果您担心多条语句的性能开销,可以将多行追加到一条insert语句中。或者可以在事务中 Package 一系列单独的insert语句。
你可能想读我的演示加载数据快!在这里,我比较了插入多行数据的各种策略的性能。

相关问题