2011-01-08 9 views
7

グーグルながら、私はいくつかのコード例でこれを見つけた:これはどういう意味ですか?

$sql = 'INSERT INTO users (username,passwordHash) VALUES (?,?)'; 

それは私に新しいですが、私は

$sql = "INSERT INTO users (username,passwordHash) VALUES ($username,$passwordHash)";` 

または

$sql = 'INSERT INTO users (username,passwordHash) VALUES (' . $username . ',' . $passwordHash . ')';` 
に置換法と同等のことを推測します

それは正しいでしょうか?それは実際のPHP構文ですか、あるいは単に彼の例を単純化しようとしていましたか?


フィードバックのおかげで、人々

答えて

12

これはprepared statementsではかなり一般的です。 PHPのドキュメントから下に見られるように?は単に、プレースホルダとして機能:

$stmt = $dbh->prepare("INSERT INTO REGISTRY (name, value) VALUES (?, ?)"); 
$stmt->bindParam(1, $name); 
$stmt->bindParam(2, $value); 

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

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

また、fiddly ' - > bindParam'リストはほとんど必要ありません。 ' - > execute(array($ name、$ value))'コールですべてのパラメータを単純にプッシュできます。 – mario

2

それは同じではありません。準備されたステートメント照会には疑問符が使用されます。これらは、基本的に、同じクエリを複数回実行することを可能にし、一方、システムはクエリを一度解析するだけです。

4

疑問符は、準備されたSQL文内の値のプレースホルダで、SQL Injection Attacksに対して重要な保護です。あなたの最初の選択肢は、すべてのユーザが自分の名前を引用符で囲んでいない限り、正しく動作しません。*そしてパスワードハッシュを引用符で囲みます。 2番目の選択肢はSQLインジェクション攻撃に対して脆弱です。

プレースホルダでは、SQLを実行するときにプレースホルダの値を渡します。

* Tim O'Reillyは、実際には「'Tim O''Reilly'」と入力する必要があることを知っています。

関連する問題