【问题标题】:serialize not working for me in drupal在drupal中序列化不适合我
【发布时间】:2011-07-23 14:27:27
【问题描述】:

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

<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>

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

【问题讨论】:

    标签: php mysql drupal-6


    【解决方案1】:

    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注入,以替换第一个(并且仅在此处) em> 占位符。


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

    【讨论】:

      【解决方案2】:

      您可以使用 base64_encode 来绕过卷曲问题,而不仅仅是序列化。

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

      base64_encode(serialize($aa));
      

      然后在数据的检索端

      unserialize(base64_decode($db_data)); 
      

      【讨论】:

      • 那些{} 被删除是因为 Drupal 的数据库抽象层的工作方式; @Sumant 了解该层的工作原理会更有趣,而不是这次绕过这个问题,下一次又被困...
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-11-29
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多