Php 如何使用PDO准备的语句绑定多个值?

Php 如何使用PDO准备的语句绑定多个值?,php,pdo,prepared-statement,Php,Pdo,Prepared Statement,这是我的密码 $bindParams = [ 'name1' => 'Law', 'name2' => 'King' ]; $sql = "INSERT INTO users (name) VALUES (:name1),(:name2);"; $db->prepared_query($sql,$bindParams); class Database { public function __construct (

这是我的密码

$bindParams = [
'name1'  => 'Law',
'name2'  => 'King'
              ];

$sql = "INSERT INTO users (name) VALUES (:name1),(:name2);";

$db->prepared_query($sql,$bindParams);



class Database
{
public function __construct
(
    public \PDO $PDO
)
{}

public function prepared_query(string $sql='',$bindParams=[]): bool
{
    $stmt = $this->PDO->prepare($sql);

    if(count(value:$bindParams) !=0)
    {
        foreach ($bindParams as $k => $v)
        {
            $stmt->bindParam(param:":$k",var:$v);
        }
    }
    $x = $stmt->execute();

    if($x)
    {
        return true;
    }else{
             return false;
         }
    }
}
我面临的问题是,在foreach循环中,具有键name2和值king的数组$bindParams中的第二个值重写$stmt->bindParam,并且只在数据库中插入name2 king。每插入一次,我都会在数据库中找到king。这是数据库的屏幕截图。如何从数组中成功插入两条记录而不重复


您只需在
execute()
中传递参数即可。无需使用
bindParam()
,它通过引用绑定,并将覆盖循环中的值

将代码替换为以下内容:

public function prepared_query(string $sql, array $bindParams=[]): void
{
    $stmt = $this->PDO->prepare($sql);
    $stmt->execute($bindParams);
}
如果您真的想要有一个循环,而您真的不需要它,那么您必须按值绑定,而不是按引用绑定。e、 g

public function prepared_query(string $sql, array $bindParams = []): void
{
    $stmt = $this->PDO->prepare($sql);
    foreach ($bindParams as $param => $var) {
        $stmt->bindValue($param, $var);
    }
    $stmt->execute();
}

您应该能够删除
foreach
,只需将参数传递给
$x=$stmt->execute($bindParams)
@Nigel Ren我不想传递数组$bindParams来执行函数。你能给我建议一些其他方法来为数组的每个键复制这个$stmt->bindParams()吗??然后在一次尝试中对它们执行$stmt->execute()。?为什么不将它们传递给
execute()
,这是一种常见的做法?我想知道另一种方法,只是为了获得知识..:@NigelRen@Nigel你能编辑代码并发布吗?我相信空数组和空值@Dharman$stmt->execute()一样有效假设提供的所有数组值都是PDO::PARAM_STR。如果我们将表中的一个列数据类型设置为int,然后提供一个字符串值,而不是int,会怎么样??如何使参数int???@King619 99.99%的时间都无关紧要。您几乎可以将所有内容都绑定为字符串。如果确实需要将其转换为整数,则可以使用
bindValue
。这是我提供的第二个例子。