PHP для цикла вставки SQL - PullRequest
0 голосов
/ 05 июня 2018

Не могли бы вы объяснить, почему этот код не вставляется в базу данных?

    //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)) всегда ложен.

Большое спасибо заранее

Ответы [ 2 ]

0 голосов
/ 05 июня 2018

Это именно то, для чего подготовлены операторы:

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

В этом исходном коде есть тревожно большое количество ошибок, которые вообще не позволят ему работать, поэтому вам нужно быть более осторожнымв будущем и более методично работать над решениями.Постепенно наращивайте, тестируйте по ходу работы, чтобы быть уверенным, что вы не слишком углубитесь в решение, которое вы не до конца понимаете.

0 голосов
/ 05 июня 2018

Как уже упоминалось в других комментариях, вы всегда должны проверять ошибки, возвращаемые mysqli_query().См. Пример кода: http://php.net/manual/en/mysqli.error.php

Функция mysqli_query() не поддерживает выполнение нескольких операторов.

Я НЕ , рекомендую использовать mysqli_multi_query().Его использование мало или вообще не приносит пользы, и оно вводит новые потенциальные уязвимости SQL-инъекций (например, знаменитый мультфильм Little Bobby Tables ).Я говорил с бывшим техническим директором MySQL, и он сказал (перефразируя): «Нет причин для существования многозапроса, он может только навредить».

Вы должны выполнять операторы INSERT по одному.Нет смысла добавлять несколько операторов вместе.

Если вы беспокоитесь о снижении производительности нескольких операторов, вы можете добавить несколько строк в один оператор INSERT.Или вы можете обернуть серию отдельных операторов INSERT в транзакцию.

Возможно, вы захотите прочитать мою презентацию Быстрая загрузка данных! , где я сравниваю производительность различных стратегий вставки множества строкданные.

...