PHP - PDO使用字符串变量执行

时间:2017-12-29 20:31:46

标签: php pdo

我只是不明白为什么会这样:

 $stmt->execute([':id' => '*',':email' => 'email@gmail.com',':password' => '123456789',]);

而这不是(无效参数编号:绑定变量数与令牌数不匹配):

$params = "':id' => '*',':email' => 'email@gmail.com',':password' => '123456789',"
$stmt->execute([$params]);

这让我发疯了!

我试图寻找其他类似的问题,但我找不到。

修改 我试着这样做:

$params = array("qualsiasi"=>"*", "email"=>"email@gmail.com", "password"=>"123456789");
$q = "SELECT :qualsiasi FROM utenti WHERE email = :email AND password = :password";
$stmt = $db->prepare($q);
foreach ($params as $key => $param){
$token = ":" . $key;
$stmt->bindParam($token , $param);
}
$stmt->execute();

它有效,PDO执行,但它不匹配数据库中的值,但它应该。我真的不知道为什么......

2 个答案:

答案 0 :(得分:2)

[$params] $params为字符串不会创建具有多个键的数组,无论字符串是什么。它只是创建一个带有单个数字键项的数组,其中该项的值是整个$params字符串。

因此,您最终将单项数组传递给->execute(),因此对于具有多个参数的查询不起作用。

NB 即使您的查询只有一个参数,您仍然会收到错误的值,因为而不是[':foo' => 'bar'](键:foo,值{ {1}})它将传递:bar(索引["':foo' => ':bar'"],值0)。

答案 1 :(得分:1)

由于

$params = "':id' => '*',':email' => 'email@gmail.com',':password' => '123456789',"
$stmt->execute([$params]);

变成

$stmt->execute(["':id' => '*',':email' => 'email@gmail.com',':password' => '123456789',"]);

不一样
$stmt->execute([
    ':id' => '*',
    ':email' => 'email@gmail.com',
    ':password' => '123456789',
]);

看到区别?放在方括号之间的字符串不会将自身变为key => value数组。它只是一个单值数组,字符串是你唯一的值。