INSERT массив многомерный в базу данных - PullRequest
0 голосов
/ 21 февраля 2019

Я новичок в PHP, и прошу прощения за мой английский.Я прочитал все вопросы по этой теме на этом форуме, но я все еще не могу найти решение для моего PHP.У меня есть 2 сессии здесь, во-первых, чтобы сохранить данные человека, а затем во-вторых, чтобы сохранить корзину.Здесь моя структура сеанса

<?php
$id_pers person = $_SESSION['person'] ; //its contain just id


//for second $_SESSION['cart'] structure when i print_r is like this
Array (
[0] => Array (
   [item_id] => 4
   [item_name] => Notebook
   [item_qty] => 1
   [price] => 750
 )
[1] => Array (
   [item_id] => 5
   [item_name] => Keyboard
   [item_qty] => 1
   [price] => 70
 )
[2] => Array (
   [item_id] => 6
   [item_name] => Mouse
   [item_qty] => 1
   [price] => 50
 )
)
?>

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

<?php
function save($array, $connect){
  if(is_array($array)){
     $id_person = $_SESSION['person'];
     foreach($array as $row => $value) {
         $item_id = mysqli_real_escape_string($connect, $value['item_id'];
         $item_qty = mysqli_real_escape_string($connect, $value['item_qty'];
         $sql = "INSERT INTO tbl_order(id_person,item_id,qty) VALUES ('".$id_person."','".$item_id."','".$item_qty."')";
         mysqli_query ($connect, $sql);
     }
   }
 }
save($_SESSION['cart'], $ connect);
?>

Пожалуйста, скажите мне, где моя ошибка в моем скрипте для вставки массива данных в таблицу.Спасибо:)

Ответы [ 2 ]

0 голосов
/ 21 февраля 2019

Предполагая, что эти числа являются целыми числами, а не строками, ваш код должен выглядеть примерно так:

<?php
session_start(); // before headers are sent
function saveCart($connect){
  if(!(isset($_SESSION['person'], $_SESSION['cart']) && is_int($_SESSION['person']) && is_array($_SESSION['cart']))){ // remember $_SESSION is a super global
    return false;
  }
  $id = $_SESSION['person']; $cartArray = $_SESSION['cart'];
  foreach($cartArray as $a){
     $stmt = $connect->prepare('INSERT INTO tbl_order (id_person, item_id, qty) VALUES (?, ?, ?)');
     $stmt->bind_param('iii', $id, $a['item_id'], $a['item_qty']); $stmt->execute();
  }
  return true;
}
if(saveCart($connect) === true){
  echo 'Cart Saved';
}
else{
  echo 'Cart was not Saved';
}
?>

Подготовленные операторы - это путь.

0 голосов
/ 21 февраля 2019

Синтаксическая ошибка

  $item_id = mysqli_real_escape_string($connect, $value['item_id'];
  $item_qty = mysqli_real_escape_string($connect, $value['item_qty];

Отсутствует ' и ) 2x

 $item_id = mysqli_real_escape_string($connect, $value['item_id']);
 $item_qty = mysqli_real_escape_string($connect, $value['item_qty']);

И измените это (это нормально, просто не лучший способ сделать это):

function save($array, $connect){
    if(is_array($array)){

до

 function save(array $array, $connect){

Теперь, если вы передадите что-то другое, тогда массив PHP с ошибкой выдаст.Он называется подсказкой типов и позволяет нам избавиться от этой проверки, поскольку мы гарантируем, что в качестве этого аргумента могут быть переданы только массивы.При ручной проверке ваш код просто молча провалится, и вы не будете знать, почему.

Я бы, вероятно, бросил туда if(!session_id()) session_start();, чтобы быть в безопасности.Если идентификатор сеанса отсутствует, создайте сеанс.Вы не можете сохранить данные в сеансе, если он не запущен.

Вот так:

<?php
function save(array $array, $connect){

     if(!session_id()) session_start();

     //don't trust this who knows where it came from, QQ'n not me.
     $id_person = mysqli_real_escape_string($connect, $_SESSION['person']);
     foreach($array as $row => $value) {
         $item_id = mysqli_real_escape_string($connect, $value['item_id']);
         $item_qty = mysqli_real_escape_string($connect, $value['item_qty']);
         $sql = "INSERT INTO tbl_order(id_person,item_id,qty) VALUES ('".$id_person."','".$item_id."','".$item_qty."')";
         mysqli_query ($connect, $sql);
     }
 }

save($_SESSION['cart'], $ connect);
?>

-ПРИМЕЧАНИЕ. Также предпочтительнее готовить запросы, а не экранировать их.

Приветствия.

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