Мне удалось сериализовать данные (массив) и вставить их в столбец базы данных. Теперь я хотел бы ВЫБРАТЬ этот столбец и снова превратить его в массив и перечислить каждый элемент массива в отдельной строке.
what i am struggling with:
борюсь с массивом, который я десериализовал. Причина, по которой я сериализую в первую очередь, заключается в том, что я работаю с многомерным массивом, который может иметь 1 или несколько элементов в заказе.
как только я ВСТАВЬ сериализованные данные в базу данных Mysql, информация будет выглядеть следующим образом:
Example 1 - [One item in the order with a Quantity of 1].
a:1:{i:7354028228659;a:1:{s:8:"quantity";i:1;}}
Я хотел бы десериализовать его и заполнить в таблице PHP со структурой ниже.
| Varaint_id | Quantity |
|---------------|----------|
| 7354028228659 | 1 |
|---------------|----------|
Если в заказе более одного элемента, я хотел бы добиться того же макета.
Example 2 - [3 items in the order each with a Quantity of 1].
a:3:{i:6836781613107;a:1:{s:8:"quantity";i:2;}i:6737290241;a:1:{s:8:"quantity";i:1;}i:49366524679;a:1:{s:8:"quantity";i:1;}}
Следующее ниже представляет собой изображение вышеупомянутого, три элемента в заказе, каждый из которых имеет заказ.
----------------------------
| Varaint_id | Quantity |
----------------|-----------
| 6836781613107 | 1 |
|---------------|----------|
| 6737290241 | 1 |
|---------------|----------|
| 49366524679 | 1 |
|---------------|----------|
В настоящее время я пытаюсь превратить строку обратно в массив, а затем отобразить ее в таблице с помощью php.
Current Methodology:
Step 1 - Run SELECT query to the Database:
Step 2 - Fetch $stmt & Unserialize column 'items' from database. NOTE: I am struggling here!
Step 3 - Echo results into a table.
//1. Running a SELECT query to the Database.
$stmt = $db->query("SELECT items, order_number, cust_fname
From orders
WHERE '".$order_number."' = order_number");
//2. Fetch $stmt & Unserialize column 'items' from database.
while($row = $stmt->fetch()){
$results = unserialize($row['items']);
//3. Echo results into a table.
echo "<tr>
<td>" . $results . "</td>
<td>" . $results . "</td>
</tr>";
};
Я не уверен, как пройти через массив и десериализовать данные, а затем отобразить только вариант_id в одном столбце и количество в другом столбце. Любая помощь будет принята с благодарностью.
Начните с демонстрации массива! Сделайте <pre>print_r($results,1);</pre>
Немного не по теме; но считали ли вы нормализация вашей базы данных?. Если вас не принуждают к этому пути хранения массива, извлечения массива, десериализации массива, поиска в массиве ... Тогда это может быть более эффективным путем.
@RiggsFolly, Спасибо за оперативный ответ! Я понимаю, что это массив. Мне трудно обработать его в формате, которого я хотел бы достичь, поскольку я впервые работал с сериализацией. когда я делаю print_r ($ results), я получаю следующее: Array ([7354028228659] => Array ([количество] => 1))
Тогда первое, что вы должны были попробовать, это foreach l; oop
@RiggsFolly, спасибо! сделаю это. Ваше здоровье
"Причина, по которой я сериализирую в первую очередь," ... неправильно. Нормализуйте свои данные.
@symcbean, я буду работать над этим. ваше здоровье
Тот факт, что вы используете массив в своем PHP-коде, не является причиной использования больших двоичных объектов в вашей базе данных. PHP не создает «многомерные массивы», они являются вложенными массивами, и то, что вы показали здесь, - это то, что данные имеют инвариантную иерархию (еще одна причина не сериализовать).






как отмечает @RiggsFolly, вы можете использовать свой массив, как и любой другой массив.
//1. Running a SELECT query to the Database.
// This other approch to query is not sensitive to SQL injection.
$stmt = $db->prepare("SELECT items, order_number, cust_fname
From orders
WHERE order_number = :order_number
");
$stmt->execute([
':order_number' => $order_number
]);
//2. Fetch $stmt & Unserialize column 'items' from database.
while($row = $stmt->fetch()){
$results = unserialize($row['items']);
//3. Echo results into a table.
echo '<tr>';
foreach ($results as $varaint_id => $result) {
echo '<td>'.$result['quantity'].</td>
}
echo '</tr>';
}
Я знаю, что это не актуальная тема, но позвольте мне указать на опасную проблему с SQL-инъекцией в вашем коде.
ваш код :
$db->query("SELECT items, order_number, cust_fname
From orders
WHERE '".$order_number."' = order_number
");
чувствителен к атакам, которые могут выглядеть так:
$order_number = "1' --";
$myQuery = "SELECT items, order_number, cust_fname
From orders
WHERE '".$order_number."' = order_number
"
// Will result
SELECT items, order_number, cust_fname
From orders
WHERE '1'--' = order_number'
обратите внимание, что -- - это один из способов прокомментировать оставшуюся часть строки в MySQL, этот запрос будет выводить все строки внутри заказов.
Используя PDO::prepare и PDO::execute, вы избегаете такого рода атак.
Большое вам спасибо за то, что подняли этот вопрос! Я немедленно исправлю это.
ха-ха, мой плохой @IsThisJavascript, я меняю эту промахную опечатку - @Simonious, это исправляет вашу исходную проблему? Если нет, пришлите нам свой вывод var_dump.
просто получаю это сейчас при запуске foreach: array (1) {["amount"] => int (1)} array (1) {["quantity"] => int (1)}
Это массив, вы сказали это как минимум дважды. Так что обрабатывайте его как любой другой массив