2013-03-12 5 views
0

Я сделал таблицу MySQL, хранящие вопросы и их Drupal 6 атрибуты, как префикс, суффикс, опция, название, стоимость, тип ... и т.д.Drupal 6 магазина массив В MySQL таблице как VARCHAR ошибка неверный аргумент поставляется

к сожалению, сохраненное значение опции является массивом, и я получаю ошибку «предупреждение: Недействительный аргумент для Еогеаспа()»

кода:

$fruit = db_query("SELECT type,title, value, section, collapsible,collapsed, description, options, size, prefix, suffix, default_value FROM {table} "); 
    $count = 1; 
    while($slice = db_fetch_array($fruit)){ 
    $section = $slice['section']; 
    $op = $slice['options']; 
    $form[$count] = array(
    '#type' => $slice['type'], 
    '#title' => $slice['title'], 
    '#collapsible' => $slice['collapsible'], 
    '#collapsed' => $slice['collapsed'], 
    '#description' => $slice['description'], 
    '#options' => $op, 
    '#size' => $slice['size'], 
    '#prefix' => $slice['prefix'], 
    '#suffix' => $slice['suffix'], 
    ); 
$count = $count+1; 
     } 

в одном конкретном случае опция

array(t('yes'), t('no')) 

, где type is 'radioios'
, который хранится как varchar (blob также не работает) (добавление запятой тоже не помогает).

+0

Где код для сохранения данных? И вы также увеличиваете переменную '$ count'? В противном случае вы получите только одно значение. – Max

+0

да, я просто показал проблемную область. Я добавлю, что, если вы считаете, что это добавляет ценности! – ingrid

+0

Сохранение данных на самом деле не является частью проблемы здесь, поэтому я не буду добавлять это. это часть представления, а не обработки формы – ingrid

ответ

0

Вы не можете хранить массив, как в MySQL. Вы, вероятно, захотите сохранить его как сериализованную строку (serialize($options)), а затем unserialize($slice['options']) в вашей форме.

+0

Спасибо, я попробую это и отчитаюсь :) – ingrid

+0

это работает, конечно, если я вручную вхожу в таблицу, не лучший вариант. Хотя создание таблицы для опций, когда у меня так много разных, также является проблемой. Благодаря! – ingrid

1

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

Я бы сделал отдельную таблицу options, где каждая строка имеет две колонки: (question_id, option) где question_id - это внешний ключ в вашей таблице вопросов. Запрос будет выглядеть так,

SELECT option FROM options WHERE question_id = <<$id>>; 

(<> не актуальна SQL, просто заполнитель для любого сконфигурированного синтаксис запроса РНР.)

Если параметры должны быть упорядочены, добавить третья колонка rank:

SELECT option FROM options WHERE question_id = <<$id>> SORT BY rank ASCENDING; 

Edit: Почему не сериализовать массивы в строки?

Это не то, что я изучал в глубину, но с верхней части моей головы, я могу думать о производительности, удобства и теории:

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

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

  3. С теоретической точки зрения это нарушает вымысел, что реляционные базы данных являются reifications реляционной алгебры. Но это, как оказалось, имеет практические последствия, поскольку оптимизатор запросов использует теоремы эквивалентности из реляционной алгебры, чтобы переписать ваш запрос в более эффективную форму. Нарушение допущений реляционной алгебры имеет тенденцию генерировать запросы, которые оптимизируют плохо (хотя и никогда не ошибочно).

+0

, поэтому в этом конкретном случае A, i будет иметь таблицу с по меньшей мере следующим: r1: caseA, no; r2: caseA, да. – ingrid

+0

Почему сериализация проблемы? – ingrid

Смежные вопросы