2012-03-12 19 views
4

データベースにアクセスするためにPDOを使用しているPHPスクリプトに問題があります。 prepare()または​​をPDOに使用すると、私の文字列をエスケープするPDOを取得できないようです。私は全面的に見てきましたが、PDOが自動的に文字列をエスケープするので、私はどこから見てもこの問題に対する答えは見つけられませんでした。 は、ここに私のコードです:PDO文字列引用符をエスケープしない

$statement = $db->prepare("INSERT INTO Table (ID, Column1, Column2) VALUES (NULL, '$var1', '$var2')"); 
$query->execute(); 

だが、問題は引用符がエスケープされていなかったので、私は、エラーメッセージが出ている$var1 = "abc'def"$var2 = "123"を認めましょう。

エラー:SQLSTATE [42000]:構文エラーまたはアクセス違反:1064 はSQL構文にエラーがあります。ライン1

で「)、「DEF」 「123」を近く使用する権利構文についてはMySQLサーバのバージョンを に対応マニュアルを確認し、私はまたしてquery()方法が、同じprpblemを使用して試してみました引用符。 私は本当に理解していない、それはイライラしています。助けてくれてありがとう。

+0

[examples](http://ca.php.net/pdo.prepare)をご覧ください。 – netcoder

答えて

13

はこれを試してみてください:

# Took out ID, as it should be auto_increment and handled by database 
$statement = $db->prepare("INSERT INTO Table (Column1, Column2) VALUES (:col1, :col2)"); 

$statement->bindValue(':col1', $var1, PDO::PARAM_STR); 
$statement->bindValue(':col2', $var2, PDO::PARAM_INT); 

$statement->execute(); 
+0

働いた不思議!本当にありがとう !! – califrench

+0

問題ありません。将来の参考資料として、PHPドキュメントを読んでください。95%の時間で、api呼び出しを正しく実装する方法を集めた素晴らしい例があります。可能であれば受け入れてください。 –

+0

私を信じて、私はしました。ありがとう。 – califrench

2

PDOライブラリのbindParam()メソッドを見てみてください。

これはあなたのクエリは次のようになります:

$statement = $db->prepare("INSERT INTO Table (ID, Column1, Column2) VALUES (NULL, ?, ?)"); 
$statement->bindParam(1, $var1, PDO::PARAM_STR); 
$statement->bindParam(2, $var2, PDO::PARAM_INT); 

$query->execute(); 

//私は本当に新しい答えをロードする必要があります:)バーがあると言うとき。

+0

Mike Purcellが提案したように、私は 'bindValue()'と同様のメソッドを使用しました。文字列内のオブジェクトのインデックスではなくキーを使用します。 – califrench

+1

このアプローチは同じように機能しますが、唯一の致命的な欠点は、多数のパラメータを持つクエリを使用すると紛らわしくなることです。 –

0

この目的のための機能があります。 www.php.net/addslashesをご覧ください。

+3

なぜPDO拡張機能にaddslashesを組み込む必要がありますか? – stUrb

+0

あなたはおそらくそうではありません。知らなかったPDOはそのようなことを解決する能力を持っています。 –

関連する問題