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

PHP-PDO使用字符串变量执行,php,pdo,Php,Pdo,我只是不明白为什么会这样: $stmt->execute([':id' => '*',':email' => 'email@gmail.com',':password' => '123456789',]); 这不是(无效参数编号:绑定变量的数量与令牌的数量不匹配): 这让我发疯了 我试图寻找其他类似的问题,但我找不到 编辑: 我试着这样做: $params = array("qualsiasi"=>"*", "email"=>"email@gmail.co

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

 $stmt->execute([':id' => '*',':email' => 'email@gmail.com',':password' => '123456789',]);
这不是(无效参数编号:绑定变量的数量与令牌的数量不匹配):

这让我发疯了

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

编辑: 我试着这样做:

$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可以执行,但它与数据库中的值不匹配,但应该匹配。我真的不知道为什么…

因为

$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
数组。它只是成为一个单值数组,字符串是您唯一的值。

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

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


N.B.即使您的查询只有一个参数,您仍然会传递错误的值,因为它不会传递
[':foo'=>'bar']
(key
:foo
,value
:bar
)而是传递
[':foo'=>':bar'
(index
0
,value
:foo'=>:bar'
).

多个项目的数组与一个字符串项目的数组不同。真正的问题是,为什么您一开始就这么做?→ @Amber应该更详细地回答这个问题。因为我有这样一个数组:$results=array(“token1”=>“*”,“email”=>”email@gmail.com“,“密码”=>“123456789”);我尝试使用它作为execute的参数,因为我需要在一个函数中运行它,这个函数有一个数组作为它的参数如果你已经有了一个数组,那么为什么它突然变成了一个字符串?非常感谢,我理解了。我试着把它放进一个数组里,但这不起作用。明白了。非常感谢。使用格式良好的数组也不起作用:$results=array(“token1”=>“*”,“email”=>”email@gmail.com“,“密码”=>“123456789”);
$stmt->execute([
    ':id' => '*',
    ':email' => 'email@gmail.com',
    ':password' => '123456789',
]);