Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/239.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/70.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php Drupal 6将数组存储在mysql表中,因为varchar是错误,提供的参数无效_Php_Mysql_Drupal_Drupal 6_Varchar - Fatal编程技术网

Php Drupal 6将数组存储在mysql表中,因为varchar是错误,提供的参数无效

Php Drupal 6将数组存储在mysql表中,因为varchar是错误,提供的参数无效,php,mysql,drupal,drupal-6,varchar,Php,Mysql,Drupal,Drupal 6,Varchar,我制作了一个mysql表,存储问题及其Drupal 6属性,如前缀、后缀、选项、标题、值、类型。。。等等 不幸的是,存储的选项值是一个数组,我得到一个错误“警告:为foreach()提供的参数无效” 代码是: $fruit = db_query("SELECT type,title, value, section, collapsible,collapsed, description, options, size, prefix, suffix, default_value FROM {tabl

我制作了一个mysql表,存储问题及其Drupal 6属性,如前缀、后缀、选项、标题、值、类型。。。等等

不幸的是,存储的选项值是一个数组,我得到一个错误“警告:为foreach()提供的参数无效”

代码是:

$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'))
其中类型为“收音机”

这就是存储为varchar的内容(blob也不起作用)(添加逗号也没有帮助。

您不能像MySQL中那样存储数组。您可能希望将其保存为序列化字符串(
serialize($options)
),然后
取消序列化($slice['options'))
在您的表单中。

不要将数组序列化为字符串。这是人们在数据库中存储列表时经常犯的错误之一(尽管公平地说,这比为前n个项目创建固定数量的列要好)

我将创建一个单独的
选项
表,其中每行有两列:
(问题id,选项)
,其中
问题id
是问题表中的外键。查询如下:

SELECT option FROM options WHERE question_id = <<$id>>;
编辑:为什么不将数组序列化为字符串?

这不是我深入研究过的东西,但在我脑海中我可以想到性能、便利性和理论:

  • 出于性能原因,数据库被优化为存储固定宽度的字段。如果您开始将列表放入字段,最终您将遇到一个包含太多项的列表,需要调整字段大小。同时,数据库被高度优化为存储任意多行的表,并且您永远不需要调整表的大小以适应请注明更多行的日期

  • 为方便起见,对已序列化为单个字段的列表运行查询确实很烦人。大多数数据库对查询存储为字段的列表的支持非常差。从数据库的角度来看,这只是一个字符串,甚至可能是一个不透明的二进制blob

  • 从理论角度来看,它违反了关系数据库是关系代数的具体化这一假设。但事实证明,这具有实际后果,因为查询优化器使用关系代数中的等价定理将查询重写为性能更高的形式关系代数倾向于生成优化效果不佳的查询(尽管从未出现错误)


  • 保存数据的代码在哪里?您是否也增加了
    $count
    变量?否则您将只得到一个值。是的,我只是显示了问题区域。如果您认为这会增加值,我将添加它!保存数据并不是问题的一部分,因此我不会添加它。这是提交的一部分,而不是表单处理的一部分明确地写出了我的问题是什么。我已经有了一个函数形式。问题是选项值,就像我在问题中所说的那样。谢谢,我将尝试这个并报告:)当然,如果我手动输入表,这是有效的,而不是最佳选项。虽然,当我有这么多不同的选项时,创建一个选项表也是一件麻烦事。谢谢所以在这个特殊的情况下,我会有一个至少包含以下内容的表:r1:caseA,no;r2:caseA,是的。为什么要连载一个问题?
    SELECT option FROM options WHERE question_id = <<$id>> SORT BY rank ASCENDING;