-1

テーブル内のユーザーを検索するには、PDO 準備済みステートメントが使用されます。

$pdo = new PDO("mysql:host=localhost;dbname=mydatabase", "username", "password");
$stmt = $pdo->prepare("SELECT surname, username FROM users
   WHERE (username=:u OR surname LIKE :sn);");

ここで :u と :sn という名前付きパラメーターを指定するには、どちらの方法でも良い結果が得られます。

まず、変数名:uおよび:snの前にコロンを付けます。

$stmt->execute(array(
    ":u" => "johndoe2"
  , ":sn" => "%super%"
));

または、素の変数名uおよびsnを使用します。

$stmt->execute(array(
    "u" => "johndoe2"
  , "sn" => "%super%"
));

標準で推奨される構文はどれですか?

4

2 に答える 2

3

bindParamのドキュメントを参照してください。

パラメータ識別子:

名前付きプレースホルダーを使用する準備済みステートメントの場合、これは :name の形式のパラメーター名になります。疑問符のプレースホルダーを使用する準備済みステートメントの場合、これはパラメーターの 1 から始まる位置になります。

于 2013-10-07T09:07:06.157 に答える
1

どちらも安全に使用できます。バインド メカニズムは、パラメーター名の前にコロンが見つからない場合にコロンを付けるだけだからです。

https://github.com/php/php-src/blob/master/ext/pdo/pdo_stmt.c#L363を参照してください

if (is_param && param->name[0] != ':') {
    char *temp = emalloc(++param->namelen + 1);
    temp[0] = ':';
    memmove(temp+1, param->name, param->namelen);
    param->name = temp;
} else {
    param->name = estrndup(param->name, param->namelen);
}

ごくわずかな量のサイクルを節約しているように感じるので、前者を使用することを好みます。

于 2013-10-11T06:33:29.470 に答える