Скрипт публикует первое число в значении - PullRequest
0 голосов
/ 20 октября 2018

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

Пример: я хочу опубликовать значение 15.Сценарий сообщения 1.

Я хочу опубликовать значение 550.Сценарий сообщения 5.

Я хочу опубликовать значение 30.Сценарий сообщения 3.

Кто-то знает причину этого?

Вот мой сценарий:

<input type="text" id="quantity" name="quantity" value="15" />
<input type="text" id="name" name="name" value="550" />
<input type="text" id="price" name="price" value="30" />

<?php
  for($count=0; $count<$_POST["total_item"]; $count++)
  {
    $db3 = new PDO('mysql:host=localhost;dbname=db', 'root', 'pass');

    $query3= "INSERT INTO scu_test(id, quantity, name, price) VALUES (:id, :quantity, :name, :price)";
    $stmt3 = $db3->prepare($query3);
    $exec3 = $stmt3->execute(array(
      ':id'          =>  $_SESSION['id'],
      ':quantity'    =>  $_POST["quantity"][$count],
      ':name'        =>  $_POST["name"][$count],
      ':price'       =>  $_POST["price"][$count]
    ));
    if($exec3)
      {
        header('Location: ../succ.php');
      }
  }
?>

Обновление 1:

С ответом Юстинаса я строю следующий скрипт:

Динамические строки:

<input type="text" id="quantity1" name="quantity" value="15" />
<input type="text" id="name1" name="name" value="550" />
<input type="text" id="price1" name="price" value="30" />

<input type="text" id="quantity2" name="quantity" value="15" />
<input type="text" id="name2" name="name" value="550" />
<input type="text" id="price2" name="price" value="30" />

Сообщение:

<?php
  foreach($_POST as $i => $item)
  {
    $db3 = new PDO('mysql:host=localhost;dbname=db', 'root', 'pass');

    $query3= "INSERT INTO scu_test(id, quantity, name, price) VALUES (:id, :quantity, :name, :price)";
    $stmt3 = $db3->prepare($query3);
    $exec3 = $stmt3->execute(array(
      ':id'          =>  $_SESSION['id'] . '_' . $i,
      ':quantity'    =>  $_POST["quantity"],
      ':name'        =>  $_POST["name"],
      ':price'       =>  $_POST["price"]
    ));
    if($exec3)
      {
        header('Location: ../succ.php');
      }
  }
?>

Когда я публикуюДанные в базу данных я получаю 18 строк в базе данных.Размещаемые данные выглядят как случайные данные, не имеющие отношения к значениям в количестве, названии или цене.

Кто-то знает, что не так со сценарием?

Ответы [ 4 ]

0 голосов
/ 25 октября 2018

Чтобы ответить на вашу первую проблему, причина, по которой вы получали только первый символ каждого значения поля, заключается в том, что вы пытались получить доступ к значениям, как если бы они были массивами, но они были строками - когда вы запрашиваете [0] из строки вы получите символ с первым «смещением», то есть с первым символом.

Более того, поскольку у вас была строка header() внутри цикла foreach(), вы никогда не собирались ее обрабатывать.более одного набора данных перед выполнением перенаправления.Перенаправление должно выходить за пределы цикла, чтобы предотвратить преждевременный выход.

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

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


Что касается обновления вашего вопроса, вы создали уникальные значения id, но дублировали значения name для ваших тегов <input>.Это означает, что при отправке формы у вас не будет всех значений в массиве $_POST, у вас будет набор данных «последней итерации».Суперглобальный массив POST создается с использованием значений name, поскольку ключи и дубликаты ключей не допускаются на одном уровне массива.Таким образом, у вас будет что-то вроде этого:

$_POST = ["quantity" => "15", "name" => "550", "price" => "30"];

Лучший совет, который я могу дать, это исправить вашу HTML-форму.Если вас не волнует число, связанное с каждым набором полей, используйте следующий синтаксис:

<input type="text" name="quantity[]" value="15" />
<input type="text" name="name[]" value="550" />
<input type="text" name="price[]" value="30" />

Если в значении name есть пустые квадратные скобки, php будет применять индексированные ключи при создании несколькихразмерный POST-массив.

$_POST = [
    0 => ["quantity" => "15", "name" => "550", "price" => "30"]
];

Если вы хотите полностью контролировать числовой ключ, сгенерированный для POST, то напишите в квадратных скобках любое нужное число.

<input type="text" name="quantity[1]" value="15" />
<input type="text" name="name[1]" value="550" />
<input type="text" name="price[1]" value="30" />

<input type="text" name="quantity[4]" value="6" />
<input type="text" name="name[4]" value="577" />
<input type="text" name="price[4]" value="39" />

Этогенерирует:

$_POST = [
    1 => ["quantity" => "15", "name" => "550", "price" => "30"],
    4 => ["quantity" => "6", "name" => "577", "price" => "39"]
];

Что касается запросов, вот полностью протестированный демонстрационный фрагмент:

session_start();
$_SESSION['id'] = 44;
$_POST = [
    1 => ['quantity' => '15', 'name' => '550', 'price' => '30'],
    4 => ['quantity' => '16', 'name' => '551', 'price' => '30']
];

try {
    $db = new PDO("mysql:host=localhost;dbname=db;charset=utf8", "root", "");
    $stmt = $db->prepare("INSERT INTO scu_test (id, quantity, name, price) VALUES (:id, :quantity, :name, :price)");
    foreach ($_POST as $key => $set) { 
        $exec = $stmt->execute([
            ':id'          =>  "{$_SESSION['id']}_$key",
            ':quantity'    =>  $set["quantity"],
            ':name'        =>  $set["name"],
            ':price'       =>  $set["price"]
        ]);
    }
    header('Location: ../succ.php');  // if error-free, then all successful; redirect
} catch(PDOException $e){
    echo "Error message: " , $e->getMessage(); // do not show error messages to users when you go live
}

Вставленные данные:

  id  |  quantity  |  name  |  price
------|------------|--------|---------
44_1  |     15     |   550  |    30
44_4  |     16     |   551  |    30
0 голосов
/ 23 октября 2018

Попробуйте это

<input type="text" id="quantity1" name="quantity[]" value="15" />
<input type="text" id="name1" name="name[]" value="550" />
<input type="text" id="price1" name="price[]" value="30" />

<input type="text" id="quantity2" name="quantity[]" value="15" />
<input type="text" id="name2" name="name[]" value="550" />
<input type="text" id="price2" name="price[]" value="30" />

Ваш php:

 foreach($_POST['quantity'] as $i => $item)
  {
    $db3 = new PDO('mysql:host=localhost;dbname=db', 'root', 'pass');

    $query3= "INSERT INTO scu_test(id, quantity, name, price) VALUES (:id, :quantity, :name, :price)";
    $stmt3 = $db3->prepare($query3);
    $exec3 = $stmt3->execute(array(
      ':id'          =>  $_SESSION['id'] . '_' . $i,
      ':quantity'    =>  $_POST["quantity"][$i],
      ':name'        =>  $_POST["name"][$i],
      ':price'       =>  $_POST["price"][$i]
    ));
    if($exec3)
      {
        header('Location: ../succ.php');
      }
  }
0 голосов
/ 23 октября 2018

Вы должны использовать массив в имени при использовании нескольких возможностей

<input type="text" id="quantity1" name="quantity[]" value="15" />
<input type="text" id="name1" name="name[]" value="550" />
<input type="text" id="price1" name="price[]" value="30" />

<input type="text" id="quantity2" name="quantity[]" value="15" />
<input type="text" id="name2" name="name[]" value="550" />
<input type="text" id="price2" name="price[]" value="30" />

И в вашем php-скрипте вам не нужно добавлять $i в ваш $_SESSION['id'], просто сделайте его первичным ключом и установите автоинкремент вбаза данных и не включать его в запрос, он будет автоматически увеличиваться при каждой вставке:

<?php
foreach($_POST['quantity'] as $i => $item)
{
$db3 = new PDO('mysql:host=localhost;dbname=db', 'root', 'pass');

$query3= "INSERT INTO scu_test(quantity, name, price) VALUES (:quantity, :name, :price)";
$stmt3 = $db3->prepare($query3);
$exec3 = $stmt3->execute(array(
  ':quantity'    =>  $_POST["quantity"][$i],
  ':name'        =>  $_POST["name"][$i],
  ':price'       =>  $_POST["price"][$i]
));
if($exec3)
  {
    header('Location: ../succ.php');
  }
}
?>

Это должно вставить значения, как они есть, если проблема не устранена, проверьте длину в вашей базе данных для столбца quantity, name и price.Вам нужно установить int(11) для столбца quantity, name и price, если вы хотите хранить целочисленные значения и если вы хотите сохранить alphanumeric значений, чем должно быть varchar(250)

0 голосов
/ 20 октября 2018

Это потому, что ваши опубликованные данные - это не многомерный массив, а один массив:

['quantity' => '', 'name' => '', 'price' => '']

Как это исправить:

Добавить [#] в ваш HTML:

<div class="item">
    <input type="text" class="quantity" name="[0]quantity" value="15" />
    <input type="text" class="name" name="[0]name" value="550" />
    <input type="text" class="price" name="[0]price" value="30" />
</div>
....
<div class="item">
    <input type="text" class="quantity" name="[10]quantity" value="15" />
    <input type="text" class="name" name="[10]name" value="550" />
    <input type="text" class="price" name="[10]price" value="30" />
</div>

Тогда в PHP используйте foreach:

$db3 = new PDO('mysql:host=localhost;dbname=db', 'root', 'pass');
$query3 = "INSERT INTO scu_test(id, quantity, name, price) VALUES (:id, :quantity, :name, :price)";

foreach($items as $i => $item) {
    $stmt3 = $db3->prepare($query3);
    $result2 = mysqli_fetch_assoc($res2);
    $exec3 = $stmt3->execute(array(
        ':id'          =>  $_SESSION['id'] . '_' . $i, // Don't know why not using Auto-Increment field
        ':quantity'    =>  $item["quantity"],
        ':name'        =>  $item["name"],
        ':price'       =>  $item["price"]
    ));

    if(!$exec3) {
        header('Location: ../error.php');
    }
}

header('Location: ../succ.php');
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...