我正在尝试将数据插入数据库,但在插入我正在使用此代码时删除大括号“{}”。
<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>
建议我这里有什么问题..
答案 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));