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

san*_*kcm 2 php mysql pdo insert prepared-statement

我是PHP和MySQL(以及一般的编程)的新手,我正在尝试创建一个通用的数据库处理程序类Database_Handler,它将帮助我管理插入,删除,选择,更新等基本内容.

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

假设在我的应用程序的某个地方,我调用了insert函数,如下所示:

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

$db_handler->insert($table, $cols, $values);
Run Code Online (Sandbox Code Playgroud)

我如何使用来自的数据$table,$cols以及$values构建准备好的PDO插入语句?这是我的第一个努力,基于"如何将数组插入到PHP和PDO的单个MySQL Prepared语句中"的答案.

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();
}
Run Code Online (Sandbox Code Playgroud)

我不认为这会起作用,但也许它会让你知道我想做什么.我有点困惑,因为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();
Run Code Online (Sandbox Code Playgroud)

它们似乎是$name作为参数发送到函数bindParam(),然后为$name之后赋值?$name发送到bindParam()什么时候的价值是多少?或者bindParam()只是将参数与变量相关联,而不采用该变量的数据 - 允许execute()处理该部分?

Dan*_*man 8

是的,如手册所述,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);

}
Run Code Online (Sandbox Code Playgroud)