序列化在drupal中不适合我

时间:2011-07-23 14:27:27

标签: php mysql drupal-6

我正在尝试将数据插入数据库,但在插入我正在使用此代码时删除大括号“{}”。

<pre><code>
require_once './includes/bootstrap.inc';
drupal_bootstrap(DRUPAL_BOOTSTRAP_DATABASE);
$aa['alt']="happy alt";
$aa['title']="happy title";
$sldata=serialize($aa);
$sql="Insert into test(pval) values('".$sldata."')";
echo $sql;
db_query($sql);    
</pre></code>

我的数据库结构是

<pre><code>
CREATE TABLE IF NOT EXISTS `test` (
  `sl` int(11) NOT NULL AUTO_INCREMENT,
  `pval` text NOT NULL,
  PRIMARY KEY (`sl`)
) ENGINE=InnoDB  DEFAULT CHARSET=latin1
</pre></code>

建议我这里有什么问题..

2 个答案:

答案 0 :(得分:2)

Drupal在表名周围使用{},以便能够对这些名称进行一些操作 - 如前缀,如果您已将其配置为这样做。

因此,您不能在查询中使用{} - 当然除了arround表名。


而不是粗暴地将序列化字符串注入到SQL查询中,必须在其中使用占位符 - 并将相应的值传递给db_query(),这样可以避免转义是:

$sldata = serialize($aa);
$sql = "insert into {test} (pval) values('%s')";
db_query($sql, $sldata);

这里:

  • 由于pval字段是数据库中的字符串,因此我使用了%s占位符
  • 传递给db_query() 的第一个值(当然是在SQL查询本身之后)将由drupal注入,以替换第一个(仅限于此处) 占位符。


而且,有关更多信息,您可能需要查看Database abstraction layer

答案 1 :(得分:0)

而不仅仅是序列化,你可以使用base64_encode来绕过curlies是一个问题。

http://php.net/manual/en/function.base64-encode.php

base64_encode(serialize($aa));

然后在数据的检索方面

unserialize(base64_decode($db_data));