我是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);
我如何使用$table
, $cols
和$values
的数据来构建一个准备好的PDO插入语句?这是我的第一次努力,基于"如何将数组插入到单个MySQL Prepared语句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
确实接受对变量的引用——注意,方法原型中的第二个参数是mixed &$variable
。在绑定和语句执行之间更改变量将影响查询。
execute()
之后,这些变量将更改为语句产生的任何值。
由于插入函数内部的安全原因,您应该转义并过滤查询中的参数(或使用bindParam) !