[英]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.