繁体   English   中英

PHP for循环插入SQL

[英]PHP for loop Insert SQL

您能解释一下为什么这段代码没有将int插入数据库吗?

    //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))的输出始终为false。

提前谢谢了

如上述其他注释所述,您应始终检查mysqli_query()返回的错误。 参见示例代码: http : //php.net/manual/en/mysqli.error.php

mysqli_query()函数不支持执行多个语句。

建议使用mysqli_multi_query() 使用它几乎没有好处,并且它引入了新的潜在SQL注入漏洞(例如著名的Little Bobby Tables卡通 )。 我与MySQL的前工程总监交谈,他说(措辞):“没有理由存在多重查询,它只会造成危害。”

您应该一次执行一次INSERT语句。 没有理由将多个语句附加在一起。

如果您担心多个语句的性能开销,则可以将多个行附加到单个INSERT语句中。 或者,您可以在事务中包装一系列单独的INSERT语句。

您可能想阅读我的演示文稿快速加载数据! 在这里,我比较了插入多行数据的各种策略的性能。

这正是准备好的语句的用途:

// 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();
}

该原始代码中存在大量令人震惊的错误,这些错误将使它根本无法起作用,因此您将来需要更加小心,并更加有条理地寻求解决方案。 逐步建立并进行测试,以确保您不会对尚未完全理解的解决方案过于深入。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM