Чтобы ответить на вашу первую проблему, причина, по которой вы получали только первый символ каждого значения поля, заключается в том, что вы пытались получить доступ к значениям, как если бы они были массивами, но они были строками - когда вы запрашиваете [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