繁体   English   中英

使用 PDO 为 MySQL 准备的语句从数据数组中将多个值插入到多个列中

[英]Inserting multiple values into multiple columns from an array of data using a PDO prepared statement for MySQL

I'm new to PHP and MySQL (and programming in general) and I'm trying to create a generic database handler class called Database_Handler that will help me manage basic things like insert, delete, select, update, etc.

我目前正在研究成员 function 来处理插入。 在我的插入 function 中,我想构建一个准备好的 PDO 插入语句并执行它。

假设在我的应用程序的某个地方,我调用了插入 function,如下所示:

$table = "books";
$cols = array('author', 'title', 'pubdate');
$values = array('Bob Smith', 'Surviving the Zombie Apocalypse', '2010');

$db_handler->insert($table, $cols, $values);

如何使用$table$cols$values中的数据来构建准备好的 PDO 插入语句? 这是我的第一个努力,基于“如何将数组插入单个 MySQL Prepared statement w/ PHP 和 PDO”的回答

public function insert($table, $cols, $values){

        $numvalues = count($values);

        $placeholder = array();
        for($i=0; $i<$numvalues; $i++)
        $placeholder[$i] = '?';

        $sql = 'INSERT INTO '. $table . '(' . implode(",", $cols) . ') ';
        $sql.= 'VALUES (' . implode("," $placeholder) . ')"';

        $stmt = $this->dbh->prepare($sql);
        $for($i=0; $i<$numvalues; $i++)
            $stmt->bindParam($i+1, $values[$i])
        $stmt->execute();
}

我不认为这会起作用,但也许它会让你知道我想做什么。 我有点困惑,因为php.net 手册中给出的示例是:

$stmt = $dbh->prepare("INSERT INTO REGISTRY (name, value) VALUES (?, ?)");
$stmt->bindParam(1, $name);
$stmt->bindParam(2, $value);

// insert one row
$name = 'one';
$value = 1;
$stmt->execute();

似乎他们将$name作为参数发送到bindParam() ,然后为$name赋值? $name发送到bindParam()时的值是多少? 还是bindParam()只是将参数与变量相关联,而不获取该变量的数据 - 允许execute()处理该部分?

是的, bindParam将参数绑定到变量名(引用),而不是值,如手册所述。

但是,对于您的情况,有一个更简单的语法。 PDOStatement::execute可以采用一组值。

public function insert($table, $cols, $values){

    $placeholder = array();
    for ($i = 0; i < count($values); $i++)
      $placeholder[] = '?';

    $sql = 'INSERT INTO '. $table . ' (`' . implode("`, `", $cols) . '`) ';
    $sql.= 'VALUES (' . implode(", ", $placeholder) . ')';

    $stmt = $this->dbh->prepare($sql);
    $stmt->execute($values);

}

由于插入函数内部的安全原因,您应该转义并过滤查询中的参数(或使用 bindParam)!

bindParam确实引用了变量——注意第二个参数在方法原型中是mixed &$variable 在绑定和语句执行之间对变量的更改将影响查询。

另外,请注意,这是允许您绑定到“out”或“inout” SQL 变量的原因——在execute()调用之后,这些变量将更改为语句生成的任何值。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM