PDO是指定命名参数的正确语法

时间:2013-10-07 08:59:49

标签: php mysql pdo

要在表中查找用户,请使用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%"
));

哪种语法是标​​准的,首选?

2 个答案:

答案 0 :(得分:3)

查看bindParam的文档:

  

参数标识符

     

对于使用命名占位符的预准备语句,这将是一个   表单的参数名称:name。对于准备好的声明使用   问号占位符,这将是1的索引位置   参数。

答案 1 :(得分: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);
}

我更喜欢使用前者,因为我觉得我节省了极少量的周期。