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()处理该部分?
是的,如手册所述,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)