Как я могу вставить несколько строк в таблицу, используя PHP и MYSQL? - PullRequest
0 голосов
/ 10 мая 2019

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

$productID = $_POST['product_id'];
$title = $_POST['title'];
$productQty = $_POST['qty'];

if(empty($hNum) || empty($street) || empty($city) || empty($county) || empty($postcode) || empty($country)){
  header("Location: checkout.php?error=emptyaddressfields");
  exit();
}
else {
  $sql = "INSERT INTO orders (customer_id, order_date, order_status, num_items, total_cost)
              VALUES ('$customer_id', CURRENT_TIMESTAMP, 'Order Placed', '$num_items', '$total_cost')";

  if(mysqli_query($conn, $sql)){
    for($i=0; $i < $productQty; $i++) {
      $sqlOI = "INSERT INTO order_item (order_id, product_id, title, quantity)
                VALUES (
                  (SELECT MAX(order_id) FROM orders),
                  '$productID',
                  '$title',
                  '$productQty'
                  )";
    }
    if(mysqli_query($conn, $sqlOI)){
      header("Location: account.php?success=orderPlaced");
      exit();
    } 
    else {
      echo "Something went wrong...".mysqli_error($conn);
    }
  }
}

Если есть другой тип цикла, который будет работать лучше, пожалуйста, дайте мне знать.Я искал в Интернете различные способы сделать это, но либо они не имеют смысла, либо не работают.Если я запускаю второй оператор INSERT в командной строке (без переменных), он работает, поэтому я знаю, что проблема не в SQL.

. Любая помощь очень ценится.

РЕДАКТИРОВАТЬ : данные отображаются внутри таблицы, и новая строка добавляется, когда в массив сеанса добавляется другой продукт.Каждая строка в таблице HTML генерируется продуктом, добавляемым в «корзину».Каждая строка имеет одинаковые атрибуты <tr> <td> и <input>.Поэтому, когда добавляется другой продукт, он генерирует новую строку с тем же name="id" или любым другим именем.

<?php
   if(!empty($_SESSION['shopping_cart'])):
     $total = 0;
     $cart_qty = 0;
     foreach($_SESSION['shopping_cart'] as $key => $product):

     <tr>
      <td hidden><input type="text" name="product_id" value="<?php echo $product['product_id']; ?>"></td>
       <td><input type="text" name="title" value="<?php echo $product['title']; ?>"></td>
       <td><input type="text" name="qty" value="<?php echo $product['quantity']; ?>"></td>
       <td>£<?php echo $product['price']; ?></td>
       <td>£<?php echo number_format($product['quantity'] * $product['price'], 2); ?></td>
     </tr>

     $total = $total + ($product['quantity'] * $product['price']);
     $cart_qty = $cart_qty + ($product['quantity']);
   endforeach;
?>

1 Ответ

0 голосов
/ 10 мая 2019
for($i=0; $i < $productQty; $i++) {
      $sqlOI = "INSERT INTO order_item (order_id, product_id, title, quantity)
                VALUES (
                  (SELECT MAX(order_id) FROM orders),
                  '$productID',
                  '$title',
                  '$productQty'
                  )";
    }//bottom of for loop
    if(mysqli_query($conn, $sqlOI)){//execution
      header("Location: account.php?success=orderPlaced");
      exit();
    } 

Вы выполняете только последний цикл, потому что каждый раз перезаписываете свою строку sql.По крайней мере, вы должны переместить команду execute внутри цикла for, но в действительности вам, вероятно, следует сделать что-то вроде

$sql = [];//create an empty array

    for($i=0; $i < $productQty; $i++) {
//insert a  an update row
$sql[] = "VALUES ((SELECT MAX(order_id) FROM orders),:pdo_placeholder" . $I . ",.....)"
        }

//implode the rows into a final string then do the connection
 $sql = "INSERT INTO order_item 
(order_id, product_id, title, quantity) VALUES " .  implode(',',$sql);



//now we are outside the loop we can execute
//lets assume you've changed this to a properly prepared pdo execute statement and get the max id correctly for your query

if(mysqli_query($conn, $sqlOI)){
   header("Location: account.php?success=orderPlaced");
   exit();
 } 

, таким образом, вам нужно сделать только 1 соединение.Я собираюсь предположить, что вы прислушаетесь к комментариям относительно использования подготовленных заявлений и воли.- ОБНОВЛЕНИЕ -

Основываясь на ваших комментариях ниже, я добавлю это:

Вы никогда не обновляете свои переменные.Давайте просто возьмем 1

$title = $_POST['title'];

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

 <td><input type="text" name="title" value="<?php echo $product['title']; ?>"></td>

Но вы получаете только одно значение - не можете вспомнить, первое это или последнее, но быстрый гугл скоро скажет вам.Если вы хотите отправить несколько значений, вам нужно дать уникальное имя для использования синтаксиса пост-массива в вашей форме <input type="text" name="title[]"...

, тогда, когда вы будете выполнять цикл вставки, вы сможете получить доступ к правильному значению, сказав

$title = $_POST['title'][$i];

Вам нужно var_dump некоторых ваших переменных, чтобы вы могли видеть, какие данные вы отправляете, потому что я совершенно уверен, что они не совпадают с данными, которые вы думаетевы получаете

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...