1

現在mysql_real_escape_string、SQL インジェクションを防ぐためにデータベースにクエリを実行するときに変数をエスケープするために使用しています。例えば、

   $keyword = mysql_real_escape_string($keyword);
        $guideline = mysql_real_escape_string($guideline);  
        mysql_query("INSERT INTO table1 VALUES('$keyword','$guideline')");

$get = mysql_query("SELECT * FROM table2 WHERE keyword='$keyword'");

  while($row = mysql_fetch_assoc($get)) {
  //code
  }

SQL インジェクションの防止について読んだ後、これは SQL インジェクションを止めるのに十分ではないことを読みました (非常に多くのコードを修正する必要があります)。PDO プリペアド ステートメントを使用する必要がありますか? 上記と同じ $variables を使用して PDO プリペアド ステートメントを実行する方法の例を教えてください。

4

4 に答える 4

4

本当に簡単です:

$db = new PDO($dsn, $user, $password);
$stmt = $db->prepare('INSERT INTO table1 VALUES(?,?)');
$stmt->execute(array($keyword, $guideline));
$stmt->close();

$stmt2 = $db->prepare('SELECT * FROM table2 WHERE keyword= ?');
$stmt->execute(array($keyword));
while(false !== ($row = $stmt->fetch())) {
   // do stuff
}

もう少し冗長ですが、コードをもう少し読みやすくするのに役立つ名前付きプレースホルダーも使用できることに注意してください。

$stmt2 = $db->prepare('SELECT * FROM table2 WHERE keyword= :keyword');
$stmt2->execute(array(':keyword' => $keyword));
于 2012-07-03T12:35:35.003 に答える
3

まず、PDO オブジェクトを作成する必要があります。

$dbh = new PDO("mysql:dbname=$dbname", $username, $password);

次に、パラメーターをクエリに関連付けるさまざまな方法があります。

  1. への引数としてexecute():

    $qry = $dbh->prepare("INSERT INTO table1 VALUES(?, ?)");
    $qry->execute(array($keyword, $guideline));
    
  2. 値をバインドする (関数呼び出し時に割り当てられた値を保持する):

    $qry = $dbh->prepare("SELECT * FROM table2 WHERE keyword = ?");
    $qry->bindValue(1, $keyword);
    $qry->execute();
    
    while ($row = $qry->fetch()) {
      // code
    }
    
  3. パラメーターをバインドする (基になる変数の変更時に更新):

    $qry = $dbh->prepare("SELECT * FROM table2 WHERE keyword = ?");
    $qry->bindParam(1, $keyword);
    $qry->execute();
    
    while ($row = $qry->fetch()) {
      // code
    }
    

anonymous の代わりに名前付きプレースホルダーを使用することもできます?:

$qry = $dbh->prepare("SELECT * FROM table2 WHERE keyword = :kw");
$qry->bindValue(":kw", $keyword);
于 2012-07-03T12:36:01.217 に答える
2

こっちの方が理にかなっている

<?php
$stmt = $dbh->prepare("INSERT INTO REGISTRY (name, value) VALUES (:name, :value)");
$stmt->bindParam(':name', $name);
$stmt->bindParam(':value', $value);

// insert one row
$name = 'one';
$value = 1;
$stmt->execute();

// insert another row with different values
$name = 'two';
$value = 2;
$stmt->execute();
?>

http://www.php.net/manual/en/pdo.prepared-statements.php

于 2012-07-03T12:37:54.557 に答える
0

忍者であると主張しているわけではありませんが、しばらくの間、私がしていることは次のとおりです。

//connection
$conn = new PDO("mysql:host=$dbhost;dbname=$dbname",$dbuser,$dbpass);

//get Post data
$name = filter_input(INPUT_POST, $name, FILTER_SANITIZE_STRING);

//SQL
$SQL = $conn->prepare('SELECT * FROM users WHERE user_name=:name;');
$SQL->execute(array(':name' => $name));

//While Loop
while($names = $SQL->fetch(PDO::FETCH_OBJ){
 echo $names->user_email
}
于 2012-07-03T12:41:02.437 に答える