序列化在 drupal 中对我不起作用

发布于 2024-11-25 16:06:33 字数 645 浏览 0 评论 0 原文

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

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

建议我这里出了什么问题..

i am trying to insert data to database but it removing braces'{}' while inserting i am using this code.

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

my db structure is as

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

suggest me what is wrong here..

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

耳钉梦 2024-12-02 16:06:34

Drupal 使用 {} 围绕表名称,以便能够对这些名称进行一些操作 - 例如为它们添加前缀(如果您已将其配置为这样做的话)。

因此,您不能在查询中使用 {} ——当然,除了周围的表名称。

您必须在其中使用占位符,并将相应的值传递给 db_query(),这将小心逃避什么必须是:

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

这里:

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

并且,有关更多信息,您可能需要查看 数据库抽象层

Drupal uses {} arround the tables names, to be able to do some manipulations on those names -- like prefix them, if you have configured it to do so.

So, you must not use {} in your query -- except arround tables names, of course.

Instead of brutaly injecting your serialized-string into the SQL query, you must use place-holders in it -- and pass the corresponding values to db_query(), which will take care of escaping what has to be :

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

Here :

  • As the pval field is a string in database, I used a %s place-holder
  • And the first value passed to db_query() (after the SQL query itself, of course) will be injected by drupal, to replace that first (and only, here) placeholder.

And, for more informations, you might want to take a look at Database abstraction layer.

怪我入戏太深 2024-12-02 16:06:34

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

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

base64_encode(serialize($aa));

然后在数据的检索端

unserialize(base64_decode($db_data)); 

instead of just serialize, you could base64_encode to bypass curlies being a problem.

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

base64_encode(serialize($aa));

Then on the retrieving side of the data

unserialize(base64_decode($db_data)); 
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文