我只是不明白为什么会这样:
$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执行,但它不匹配数据库中的值,但它应该。我真的不知道为什么......
答案 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
数组。它只是一个单值数组,字符串是你唯一的值。