2011-10-21 62 views
0

我試圖在drupal7的cron作業中執行查詢。然而有些奇怪的事情正在發生每次它嘗試執行我得到一個PDOException。當我將查詢粘貼到phpmyadmin中時,沒有任何問題並且執行查詢。但我在我的cronjob它給出了錯誤。 問題不在我的cronjob中,我知道這一點,因爲它也執行其他查詢沒有任何問題。錯誤在php中執行我的查詢但不在phpmyadmin中

查詢的PHP代碼:

$sql_insert_product = 'INSERT INTO tblProducten(productnummer, merk, doelgroep, RefLev)' 
. 'VALUES(' . $prod->productnummer . ', "tt", "' . $prod->doelgroep . '", "' 
. $prod->reflev . '")'; 
$db_catalogus->query($sql_insert_product); 

所得查詢碼產生中的phpmyadmin其中工程:

INSERT INTO tblProducten(productnummer, merk, doelgroep, RefLev) VALUES(16657, "tt", "Meisjes", "11803") 

除外:

PDOException:SQLSTATE [42S22 ]:未找到列:1054'字段列表'中的未知列'tt':INSERT INTO tblProducten(productnummer,merk,doelgroep,RefLev)VALU ES(16657,「tt」,「Meisjes」,「11803」);陣列()在cronner_cron()(行/家94/...

+0

也許可以在方法'$ db_catalogus-> query($ sql_insert_product);'的代碼中找到解釋。你可以發佈嗎? –

+0

這是一個標準的drupal函數:s –

回答

3

問題確實是在您的查詢。 有,而不是默認的撇號在思想報,這使得雙引號字段分隔符的設置, 。

因此,單一個改變你的雙引號(並相應修改語法)

$sql = "INSERT INTO tblProducten(productnummer, merk, doelgroep, RefLev) 
VALUES ({$prod->productnummer}, 'tt', '{$prod->doelgroep}','{$prod->reflev}')"; 
$db_catalogus->query($sql); 

,並讓你知道,你的格式幾乎是不可讀的,以及所有不必要的級聯和報價。

如果你有報價問題,比你不逃避你的價值
它會引導你到SQL注入。
總是轉義您在查詢中放置的任何字符串。
並相應地格式化其他值。

查詢

$prod->productnummer = intval($prod->productnummer); 
$prod->doelgroep = mysql_real_escape_string($prod->doelgroep); 
$prod->reflev = mysql_real_escape_string($prod->reflev); 

前添加此代碼,也不會有永遠與任何報價的任何問題。

+0

我編輯了代碼,使其更具可讀性。 :) 但我之所以選擇配音引號是因爲我插入的一些值將包含單引號。 –

+0

例如我用'{$ prod-> merk}'替換了'tt',並且一個值的示例是l'artigiano italiano 當我達到此值時,查詢會遇到麻煩。 –

+0

YE,但我的意思是我在我的cron文件中編輯它,我感謝你幫助我!我會盡量讓將來的所有內容更具可讀性! –

3

顯然,PHPMyAdmin和你的cron腳本運行在不同的SQL模式下。這是問題的一個例證:

SET sql_mode = 'ANSI_QUOTES'; # treats double quotes as an identifier quote character 
SELECT "name" FROM table1; 

name 
===== 
alpha 
beta 
gamma 

SET sql_mode = ''; # treats double quotes as string literal quote character 
SELECT "name" FROM table1; 

name 
===== 
name 
name 
name 

理想情況下,你不應該使用(在你的例子"tt""作爲字符串分隔符,使用單引號代替它是一個標準的每一個SQL數據庫就明白了。或者你可以玩ANSI_QUOTES設置,我不會推薦。

相關問題