PHP生成动态PDO插入
下面的代码应该将数组中的每个键值对插入到表中的匹配列值中。脚本不返回任何错误,但插入的行仅包含数组中的最后一个值 例如 在列为1、2和3的表中成功插入行,但在所有列中插入值3PHP生成动态PDO插入,php,mysql,pdo,Php,Mysql,Pdo,下面的代码应该将数组中的每个键值对插入到表中的匹配列值中。脚本不返回任何错误,但插入的行仅包含数组中的最后一个值 例如 在列为1、2和3的表中成功插入行,但在所有列中插入值3 $columns = array(); $bind = ''; foreach($array as $key => $value){ $columns[] = $key; } $columnString = implode($columns,',');
$columns = array();
$bind = '';
foreach($array as $key => $value){
$columns[] = $key;
}
$columnString = implode($columns,',');
$valueString = implode($columns,',:');
$valueString = ':' . $valueString;
$core = core::getInstance();
$STH = $core->dbh->prepare("INSERT INTO table (" . $columnString . ") VALUES
(" . $valueString . ")");
foreach($array as $key => $value){
$STH->bindParam(':' . $key,$value);
}
试试看可能是这样的:
$columns = array('one'=>1,'two'=>2,'three'=>3);
$columnString = implode(',', array_flip($columns));
$valueString = ":".implode(',:', array_flip($columns));
$core = core::getInstance();
$STH = $core->dbh->prepare("INSERT INTO table (" . $columnString . ") VALUES (" . $valueString . ")");
foreach($columns as $key => $value){
$STH->bindValue(':' . $key, $value);
}
忘记
bindParam
,只需使用execute
并将$array
的值传递给它:
$STH->execute($array);
或者,您可以将命名参数全部划掉,以稍微简化代码:
$columnString = implode(',', array_keys($array));
$valueString = implode(',', array_fill(0, count($array), '?'));
$STH = $core->dbh->prepare("INSERT INTO table ({$columnString}) VALUES ({$valueString})");
$STH->execute(array_values($array));
@如果您想使用位置占位符实现您的目标,netcoder的回答也很好。但是,您可以使用sprintf函数使用命名占位符准备动态sql查询
$sql = sprintf("INSERT INTO table (%s) VALUES(%s)",
implode(", ", array_keys($array)),
":" . implode(", :", array_keys($array)));
$pdo->prepare($sql);
$pdo->execute($array);
pdoStatement::bindParam
将对变量的引用作为其参数,pdoStatement::bindValue
将变量的值作为其参数。按照这样做的方式,您对同一变量$value
进行了多次引用,当然所有变量的计算结果都是相同的。
$columnString = implode(',', array_keys($array));
$valueString = implode(',', array_fill(0, count($array), '?'));
$STH = $core->dbh->prepare("INSERT INTO table ({$columnString}) VALUES ({$valueString})");
$STH->execute(array_values($array));
$conn = new PDO('mysql:host=' . $HOST . ';dbname=' . $DATABASE, $USERNAME, $PASSWORD);
$conn->exec("set names utf8");
$conn->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_WARNING);
$ins_query = 'INSERT INTO `' . $table_name . '` ';
$columns = array();
$columns_bindings = array();
foreach ($dataArray as $column_name => $data) {
$columns[] = $column_name;
$columns_bindings[] = ':' . $column_name;
}
$ins_query = $ins_query . '(' . implode(', ', $columns) . ') VALUES (' . implode(', ', $columns_bindings) . ')';
$stmt = $conn->prepare($ins_query);
foreach ($dataArray as $column_name => $data) {
$stmt->bindValue(":" . $column_name, $data);
}
if (!$stmt->execute()) {
print_r($stmt->errorInfo());
} else {
echo "Insertd";
}
$sql = sprintf("INSERT INTO table (%s) VALUES(%s)",
implode(", ", array_keys($array)),
":" . implode(", :", array_keys($array)));
$pdo->prepare($sql);
$pdo->execute($array);