2016-05-25 17 views
0

私はこのコードを使用して、データベースにデータを挿入します。 私は以前のコードをmysqliに基づいてPDOを使用するように変更しました。PDO:文字列をエスケープする必要がありますか?

パラメータ2の名前とIDについては、PDOでmysqli_real_escape_stringのような関数を使ってエスケープする必要がありますか?、またはこれらのパラメータdirecltyをクエリに渡すことはできますか?

<?php 
try 
{ 
    $pdo = new PDO('mysql:host='.$servername.';port='.$dbport.';dbname='.$dbname.'', $username, $decodedPwd); 

    $pdo->setAttribute(PDO::ATTR_EMULATE_PREPARES, false); 
    $pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); 

    $json = $_POST['jsonData']; 
    $id = $json["id"] 
    $name = $json["name"] 

    $pdo->beginTransaction(); 

    // do request 

    $pdo->query('INSERT INTO test(id, name) VALUES ('$id', '$name')'); 

    $pdo->commit(); 

    echo 'Everything is OK'; 
} 
catch(Exception $e) 
{ 
    $pdo->rollback(); 

    echo 'An error occurred :<br />'; 
    echo 'Error : '.$e->getMessage().'<br />'; 
    echo 'N° : '.$e->getCode(); 

    exit(); 
} 
+0

自分でvarsを注入する代わりに、プリペアドステートメントを使用してプレースホルダを使用する必要があります。 – DarkBee

+0

PDOはスタンドアロンソリューションであり、mysqliを動作させる必要はありません。 –

+0

1)そのコードは有効ではありません。 2)いいえ、クエリに、特にユーザー入力から変数を連結しないでください。あなたはSQLインジェクションの結果になります。3)プリペアドステートメントを使用します。 –

答えて

2

、これを試してみてください。

$query = $pdo->prepare('INSERT INTO test(id, name) VALUES (:theid, :thename)'); 
$query->execute(array(
    'theid' => $id, 
    'thename' => $name 
)); 
+0

このソリューションを使用すると、入力文字列をエスケープする必要はありませんか? – wawanopoulos

+0

正しいです。文字列入力をエスケープする必要はありません。それが準備された声明の目的です。変数を「準備」して、害を及ぼすことはありません。 – s1h4d0w

1

あなたはprearedステートメントを使用する必要が文字列をエスケープする必要がませんが。

コードは次のとおりです。

<?php 
$pdo = new PDO('mysql:host='.$servername.';port='.$dbport.';dbname='.$dbname.'', $username, $decodedPwd); 

$pdo->setAttribute(PDO::ATTR_EMULATE_PREPARES, false); 
$pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); 

$json = $_POST['jsonData']; 

$pdo->prepare('INSERT INTO test(id, name) VALUES (:id,:name)')->execute($json); 
echo 'Everything is OK'; 

トランザクションは単なるクエリでは役に立たず、エラーを報告する方法が間違っていることに注意してください。

$ jsonにすでにクエリのすべてのデータが含まれている場合、その内容を別の変数に格納する必要はありません。

関連する問題