2011-07-23 26 views
1

我想插入數據到數據庫,但它插入時使用此代碼時刪除大括號'{}'。序列化不爲我工作在drupal

<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

Drupal使用{}約於表名稱,要能夠做到這些的一些操作名稱 - 如前綴它們,如果你已經配置它的話。

因此,您的查詢中不得使用{} - 當然,除了表格名稱之外。


而不是brutaly注入您的序列化字符串到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

+0

感謝的回收側它爲我工作。 – Sumant

0

而不是隻是序列化,你可以base64_encode繞過curlies是一個問題。

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

base64_encode(serialize($aa)); 

然後在數據

unserialize(base64_decode($db_data)); 
+0

由於Drupal的數據庫抽象層的工作方式,這些'{}'被刪除了; @Sumant學習這個圖層如何工作會更有趣,而不是繞過這個*問題*,而這次又陷入了下一個問題。 –