2013-06-20 3 views
0

Я начал получать массивы и не совсем понял, как это работает. Я привык работать с функциями explode/implode, но, хотя массивы облегчили бы мою жизнь в этой части кода. Вот функция называется:Сохранение массива в базе данных sql

function save_event($event_items = NULL) { 
include 'connect.php'; 

$now = date("Y-m-d H:i:s"); 
$sqla = " 
INSERT INTO `event`(`event_items`, `event_entered`) 
    VALUES ('$event_items','$now')"; 

    $resulta = mysqli_query($link, $sqla); 
    if(!$resulta) 
     { 
     echo '<br/>An error occurred while inserting your data. Please try again later.<br/>'; 
     } 
    else 
     { echo 'this is the variable to be stored:<br/>'; 
      print_r($event_items); 

      $sql = "SELECT * FROM `event` WHERE event_entered = '".$now."'"; 
      $result = mysqli_query($link, $sql); 

      if($result) 
      { while($row = mysqli_fetch_assoc($result)) 
        { echo '<br/></br>This is the value of the database:<br/>'; 
        print_r ($row['event_items']); 
        } 
      } 
      } 
} 

Эта функция печатает:

this is the variable to be stored: 
Array([0] => Array ([item] => Powered Speaker [note] => [quantity] => 2 [price] => 200.00 [category] => Audio) [1] => Array ([item] => Wireless Microphone [note] => Lavalier [quantity] => 3 [price] => 175.00 [category] => Audio)) 

This is the value of the database: 
Array 

В PhpMyAdmin, все, что я вижу в колонке event_items слово Array.

Дополнительная информация: У меня есть таблица под названием «Группы», каждая группа будет иметь один или несколько порядков (другая таблица называется «Заказ»), и каждый заказ будет иметь одно или несколько событий (другая таблица). Наконец, каждое событие будет иметь один или несколько элементов (каждый элемент с соответствующей ценой, количеством, примечанием и категорией), которые хранятся в одном (или многих) столбцах в таблице Event.

+0

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

+1

'array' означает, что переменная, которая должна быть сохранена, была массивом, а не строкой, как и должно быть. Поэтому проблема заключается в запросе 'INSERT'. Рассмотрим использование 'serialize()' и 'unserialize()'. – Voitcus

ответ

2

Вы можете сериализовать массив с помощью функции serialize().

Пример:

serialize($event_items); 

Создает сохраняемое представление значения.

Это полезно для хранения или передачи значений PHP без потери их типа и структуры.

http://php.net/manual/en/function.serialize.php

6

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

+0

Прежде чем пытаться сделать массивы, я использовал implode/explode и имел столбцы с именем item, note, price и т. Д. Это путь? – cbarg

+0

У вас должна быть одна таблица, содержащая родительский элемент. (Заказ?) И таблица, содержащая каждый продукт (столбцы - это элемент, примечание, цена и т. Д.). Он также должен иметь order_id. Google «нормализация данных», если вам нужно больше. – Jessica

+0

Ничего себе, я думаю, что есть вещи, которые мне не стоило рассказывать, но теперь я вижу необходимость: у меня есть таблица под названием «Группы», каждая группа будет иметь один или несколько порядков (другая таблица называется «Заказ»), и каждый заказ будет иметь также одно или несколько событий (другая таблица). Наконец, каждое событие будет иметь один или несколько элементов (каждый элемент с соответствующей ценой, количеством, примечанием и категорией), которые хранятся в одном (или многих) столбцах в таблице Event. – cbarg

3

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

Основная причина, по которой кто-то будет делать это, будет для оптимизации, и это совсем не то, о чем вам следует беспокоиться.

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

+0

Я на самом деле прихожу из этого подхода! Я просто подумал, что с массивом будет легче работать. Теперь serialize/unserialize выглядят довольно хорошо, чтобы учиться :-) – cbarg

+0

Сериализация - это, безусловно, возможный подход, который будет работать, но лучше создать новую таблицу для записей. Даже работая на сайтах с более чем 500 000 уникальных посетителей в месяц, нам очень редко нужно что-то делать для оптимизации. –

+1

serialize предназначен для использования массива - не правильный путь. – Jessica