PHP: десериализация данных, которые были сериализованы и вставлены в базу данных Mysql, и эхо в таблицу в PHP

Мне удалось сериализовать данные (массив) и вставить их в столбец базы данных. Теперь я хотел бы ВЫБРАТЬ этот столбец и снова превратить его в массив и перечислить каждый элемент массива в отдельной строке.

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 в одном столбце и количество в другом столбце. Любая помощь будет принята с благодарностью.

Это массив, вы сказали это как минимум дважды. Так что обрабатывайте его как любой другой массив

RiggsFolly 23.04.2018 15:09

Начните с демонстрации массива! Сделайте <pre>print_r($results,1);</pre>

RiggsFolly 23.04.2018 15:11

Немного не по теме; но считали ли вы нормализация вашей базы данных?. Если вас не принуждают к этому пути хранения массива, извлечения массива, десериализации массива, поиска в массиве ... Тогда это может быть более эффективным путем.

IsThisJavascript 23.04.2018 15:13

@RiggsFolly, Спасибо за оперативный ответ! Я понимаю, что это массив. Мне трудно обработать его в формате, которого я хотел бы достичь, поскольку я впервые работал с сериализацией. когда я делаю print_r ($ results), я получаю следующее: Array ([7354028228659] => Array ([количество] => 1))

Simonious 23.04.2018 15:22

Тогда первое, что вы должны были попробовать, это foreach l; oop

RiggsFolly 23.04.2018 15:24

@RiggsFolly, спасибо! сделаю это. Ваше здоровье

Simonious 23.04.2018 15:26

"Причина, по которой я сериализирую в первую очередь," ... неправильно. Нормализуйте свои данные.

symcbean 23.04.2018 16:21

@symcbean, я буду работать над этим. ваше здоровье

Simonious 23.04.2018 16:31

Тот факт, что вы используете массив в своем PHP-коде, не является причиной использования больших двоичных объектов в вашей базе данных. PHP не создает «многомерные массивы», они являются вложенными массивами, и то, что вы показали здесь, - это то, что данные имеют инвариантную иерархию (еще одна причина не сериализовать).

symcbean 23.04.2018 16:33
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Symfony Station Communiqué - 7 июля 2023 г
Symfony Station Communiqué - 7 июля 2023 г
Это коммюнике первоначально появилось на Symfony Station .
Оживление вашего приложения Laravel: Понимание режима обслуживания
Оживление вашего приложения Laravel: Понимание режима обслуживания
Здравствуйте, разработчики! В сегодняшней статье мы рассмотрим важный аспект управления приложениями, который часто упускается из виду в суете...
Установка и настройка Nginx и PHP на Ubuntu-сервере
Установка и настройка Nginx и PHP на Ubuntu-сервере
В этот раз я сделаю руководство по установке и настройке nginx и php на Ubuntu OS.
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
Как установить PHP на Mac
Как установить PHP на Mac
PHP - это популярный язык программирования, который используется для разработки веб-приложений. Если вы используете Mac и хотите разрабатывать...
1
9
926
1

Ответы 1

как отмечает @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, вы избегаете такого рода атак.

Больше информации

Большое вам спасибо за то, что подняли этот вопрос! Я немедленно исправлю это.

Simonious 23.04.2018 15:28

ха-ха, мой плохой @IsThisJavascript, я меняю эту промахную опечатку - @Simonious, это исправляет вашу исходную проблему? Если нет, пришлите нам свой вывод var_dump.

Yanis-git 23.04.2018 15:39

просто получаю это сейчас при запуске foreach: array (1) {["amount"] => int (1)} array (1) {["quantity"] => int (1)}

Simonious 23.04.2018 16:04

Другие вопросы по теме