用数组编写php语句
我有一个函数来做一个简单的插入,但是我试图通过传递一个数组来使这个方法更加健壮。 这是我传入的数组:用数组编写php语句,php,mysql,Php,Mysql,我有一个函数来做一个简单的插入,但是我试图通过传递一个数组来使这个方法更加健壮。 这是我传入的数组: $form_data = array( "sort_order"=>$_POST['sort_order'], "name"=>$_POST['page_name'], "text"=>$_POST['page_text'], "image"=>$_POST['page_image'],
$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();
}
但我得到了这个错误:
类型定义字符串中的元素数与绑定变量数不匹配
我知道问题是什么,但我不明白我怎样才能做到
我在谷歌上搜索并发现了以下线索:
谁能帮我解决这个问题吗
非常感谢不要使用bind_param,因为在我的脑海中,bind_param总是让人困惑,只需执行以下操作:
$stmt->execute($values);
您还可以使用array_键和array_值来摆脱循环,而不是使用bind_参数,在我看来,bind_参数总是让人困惑,只需执行以下操作:
$stmt->execute($values);
您还可以使用array_键和array_值来摆脱循环,请尝试以下方法:
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字符串将作为字符串而不是null值进行转义。尝试以下操作:
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字符串将作为字符串而不是null值进行转义。虽然这是一个老问题,但在我的几次搜索中都会出现它,以找到同一问题的雄辩答案。经过大量的搜索和@netcoder提供的解决方案的实现,我发现了一些更简洁的东西 免责声明,这是针对PHP5.6使用解包splat运算符:
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();
}
}
虽然这是一个老问题,但在我的几次搜索中,它都会突然出现,以找到同一问题的雄辩答案。经过大量的搜索和@netcoder提供的解决方案的实现,我发现了一些更简洁的东西 免责声明,这是针对PHP5.6使用解包splat运算符:
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的值是多少?您是指我传入函数以生成查询的数组吗?$query在使用前定义了一行。否。我是说$query!如中所示,如果回显$query,会得到什么?它是有效的SQL吗?在我看来是的:在页面中插入排序顺序、名称、文本、图像、元描述、元kw、元作者、图像值?、?、?、?、?、?、?、?、?、?、?、?、?是什么值?$query?你是说我传递到函数中构建查询的数组吗?$query在使用前定义了一行。否。我是说$query!如中所示,如果回显$query,会得到什么?它是有效的SQL吗?在我看来是的:在页面中插入排序顺序、名称、文本、图像、元描述、元描述、元描述、元作者、图像值?、?、?、?、?、?、?、?、?,?,?当我这样做时,它会给我以下错误:mysqli\u stmt::execute需要的参数正好是0,给定1。感谢您提供有关数组函数的提示:-出于某种原因,我认为您使用的是PDO,这是可能的。我完全惊讶于MySQLi没有一次传递所有参数的功能,但是我似乎也在文档中找不到它。在这种情况下,您将需要单独绑定所有参数。当我这样做时,它会给我以下错误:mysqli_stmt::execute正好需要0个参数,1个给定的参数。感谢您提供有关数组函数的提示:-出于某种原因,我认为您使用的是PDO,这是可能的。我完全惊讶于MySQLi没有一次传递所有参数的功能,但是我似乎也在文档中找不到它。在这种情况下,您需要分别绑定所有参数。为什么要将空值强制转换为NULL?如果我的数据中有一个零,我想插入一个零,而不是null。为什么要将空值强制转换为null?如果我的数据中有一个零,我想插入一个零,而不是null。对于在查询中使用准备好的查询而不是未初始化的值,请输入+1;对于在查询中使用准备好的查询而不是未初始化的值,请输入+1