2011-10-21 6 views
0

drupal7のcronジョブでクエリを実行しようとしています。しかし、何か変なことが起きている。実行しようとするたびに、私はPDOExceptionを取得します。 phpmyadminにクエリを貼り付けると問題はなくなり、クエリが実行されます。しかし、私は自分のcronjobでそれはエラーを与える。 問題は私のcronjobにはありません。他のクエリも問題なく実行するので、私はこれを知っています。phpで私のクエリを実行中にエラーが発生しましたが、phpmyadminでエラーが発生しました。

クエリのPHPコード:

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

例外:

PDOException:

$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のに働く生成照会もたらしSQLSTATE [42S22 ]:列が見つかりません:1054 'フィールドリスト'の 'tt'が不明な列:INSERT INTO tblProducten(productnummer、merk、doelgroep、RefLev)VALU ES(16657、 "tt"、 "Meisjes"、 "11803"); cronner_cronのArray()()(/家庭のライン94/...

+0

おそらく、$ db_catalogus-> query($ sql_insert_product);というメソッドのコードに説明があります。あなたはそれを投稿できますか? –

+0

これは標準的なdrupal関数です: –

答えて

3

問題は、クエリに実際にある。 二重引用符フィールドの区切り文字の代わりに、デフォルトのアポストロフィを作るmyslの設定がありますだから

、単一のものを使用して二重引用符を変更(およびそれに応じて構文を修正)

$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

たとえば、 'tt'を '{$ prod-> merk}'に置き換え、値の例は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 

理想的には、すべてのSQLデータベースが理解する規格である代わりに、単一引用符を使用し、文字列の区切り文字(あなたの例では"tt")として"を使用しないでください:ここでは、問題の説明図です。または、私はお勧めしないANSI_QUOTESの設定で遊ぶことができます。

関連する問題