我有一个函数来做一个简单的插入,但我试图通过传递一个数组使该方法更健壮。 这是我传入它的数组:
$form_data = array(
"sort_order"=>$_POST['sort_order'],
"name"=>$_POST['page_name'],
"text"=>$_POST['page_text'],
"image"=>$_POST['page_image'],
"meta_desc"=>$_POST['meta_desc'],
"meta_kw"=>$_POST['meta_kw'],
"meta_author"=>$_POST['meta_author'],
"image_thumb"=>"NULL",
);
这是功能代码:
public function insert_data($array){
$keys = array();
$values = array();
foreach($array as $k => $v){
$keys[] = $k;
if(!empty($v)){
$values[] = $v;
} else {
$values[] = "NULL";
}
}
$stmt = self::$mysqli->stmt_init();
$query = "INSERT INTO `".DB_TABLE_PAGES."` (".implode(",",$keys).") VALUES (?,?,?,?,?,?,?,?)";
$stmt->prepare($query);
$stmt->bind_param('ssssssss',implode(",",$values));
//$stmt->execute();
}
但我收到此错误: 类型定义字符串中的元素数与绑定变量数不匹配。
我知道问题是什么,但我不明白我是如何实现它的。
我用Google搜索并遇到了这个帖子:
任何人都可以帮我解决这个问题吗?
非常感谢答案 0 :(得分:4)
试试这个:
public function insert_data($array){
$placeholders = array_fill(0, count($array), '?');
$keys = $values = array();
foreach($array as $k => $v) {
$keys[] = $k;
$values[] = !empty($v) ? $v : null;
}
$stmt = self::$mysqli->stmt_init();
$query = 'INSERT INTO `'.DB_TABLE_PAGES.'` '.
'('.implode(',', $keys).') VALUES '.
'('.implode(',', $placeholders).')';
$stmt->prepare($query);
call_user_func_array(
array($stmt, 'bind_param'),
array_merge(
array(str_repeat('s', count($values))),
$values
)
);
$stmt->execute();
}
或者更好的是,使用PDO代替:
public function insert_data($array){
$placeholders = array_fill(0, count($array), '?');
$keys = $values = array();
foreach($array as $k => $v){
$keys[] = $k;
$values[] = !empty($v) ? $v : null;
}
// assuming the PDO instance is $pdo
$query = 'INSERT INTO `'.DB_TABLE_PAGES.'` '.
'('.implode(',', $keys).') VALUES '.
'('.implode(',', $placeholders).')';
$stmt = $pdo->prepare($query);
$stmt->execute($values);
}
注意:我使用了null
常量,因为"NULL"
字符串将作为字符串进行转义(而不是空值)。
答案 1 :(得分:1)
虽然这是一个古老的问题,但它已经出现在我的几个搜索中,以找到针对同一问题的雄辩答案。经过大量的搜索,以及@netcoder提供的解决方案的实现,我发现了一些更简洁的东西。
免责声明,这是针对使用解包(splat)运算符的php 5.6:
public function genericQueryWithParams($query, $params, $types)
{
$db = new mysqli('localhost','username','password','schema');
if($sql = $db->prepare($query))
{
$sql->bind_param($types, ...$params);
$sql->execute();
return $sql->get_result();
}
}
答案 2 :(得分:0)
而不是bind_param(在我看来总是令人困惑),只需:
$stmt->execute($values);
您还可以使用array_keys()和array_values()
来摆脱循环