PHP准备好的语句与数组
我有一个函数做一个简单的插入,但我试图通过传递一个数组使得该方法更健壮。 这就是我数组传递到它:PHP准备好的语句与数组
$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搜索和整个这个线程传来:
可以在任何一个可以帮助我苏斯这一点?
千恩万谢
试试这个:
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"
字符串将被转义为一个字符串(而不是空值)。
对伴侣,欢呼声,PDO一路砰砰响:-) – Adamski 2011-05-30 18:11:21
为什么你将空值赋给NULL?如果我的数据中有一个零,我想插入一个零,而不是null。 – 2013-06-29 07:38:20
相反bind_param的(这在我的脑海中始终是混淆了),只是做:
$stmt->execute($values);
还可以获得通过使用array_keys()和array_values摆脱你的循环()
虽然这是一个古老的问题,但它已经出现在我的几个搜索中,以找到同样问题的雄辩答案。经过多次搜索,以及@netcoder提供的解决方案的实现后,我发现了一些更简洁的内容。
声明,这是使用拆包(图示)运算符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();
}
}
什么是'$ query'的价值? – 2011-05-30 17:00:57
你的意思是我传入函数来构建查询的数组? – Adamski 2011-05-30 17:03:43
$ query在使用前定义了1行。 – Evert 2011-05-30 17:04:11