2011-12-26 28 views
4

PHP 5.2.9とApache 2.2.11とmysqlを使用しています。5.1.32PDO :: ATTR_EMULATE_PREPARESを無効にできないのはなぜですか?

なぜPDO :: ATTR_EMULATE_PREPARESを無効にできませんか?

<?php 
try{ 
    $conn = new PDO("mysql:host=$DB_SERVER;dbname=$DB_NAME",$DB_USER,$DB_PASS, array(PDO::ATTR_EMULATE_PREPARES => false)); 
} 

catch(PDOException $pe){ 
    die('Connection error : ' .$pe->getMessage()); 
} 

$st = $conn->prepare('abc'); 
echo "emulate : " . $st->getAttribute(PDO::ATTR_EMULATE_PREPARES); 
?> 

出力 ":1をエミュレート" である:以下

コードです。私もコードを試しました:

$conn->setAttribute(PDO::ATTR_EMULATE_PREPARES,false); 

しかし、出力は同じ値 "1"です。値が正しくない場合、出力は0になりますか?しかし、なぜ出力は1ですか? ATTR_EMULATE_PREPARESを無効にするにはどうすればよいですか?

答えて

3

あなたのコードはPHP 5.3.6とmysqld 5.1.58で動作します(falseを返し、実際には準備を行います)。PHPをバージョン5.3以上にアップグレードしてください。おそらくあなたの唯一の解決策)。

このフラグを設定しても、PDOが準備済みの文を使用することは実際には意味しません.PDOが実際に使用するかどうかをチェックしたい場合はwiresharkを使用できます。 PARAMは疑問符で置換した後、PDOは準備を使用しています。場合 - 準備クエリん:あなたは、あなたが「PARAMをSELECT」クエリ見つけるまで

<?php 
    $pdo = new PDO(..., array(ATTR::PDO_EMULATE_PREPARES => false)); 
    $stmt = $pdo->prepare('SELECT :param'); 
    $stmt->bindValue(':param', 5); 
    $stmt->execute(); 

は、送信を嗅ぎます。それが '5'に置き換えられた場合、PDOは準備をエミュレートします。

+0

'5'に置き換えられた場合、ステートメントはバインドされたパラメータを使用していないことを意味します。バインドされたパラメータはSQLインジェクションを防止するために使用されますが、現在はprepareをエミュレートするとバインドされたパラメータは使用されないため、SQLインジェクションの権利を妨げることはできません。だから私はエミュレート設定する必要があります=>偽それだけでSQLインジェクションの権利を防ぐことができますか? – zac1987

+0

パラメータを正しくエスケープする限り、SQLインジェクションからあなたを守ります。 –

+0

私は私のオンラインWebホスティングでphpバージョン5.2.14を実行しているテストで、エミュレート準備を無効にすることができます。だから、PHPのバージョンの問題ではありません。私はWAMP Serverのオフラインlocalhostエミュレートを無効にできないと思いますか? – zac1987

関連する問題