PHP-MySQL准备的插入数组的语句

PHP-MySQL准备的插入数组的语句,php,mysql,mysqli,sql-insert,Php,Mysql,Mysqli,Sql Insert,我正在编辑一个使用MySQLi的脚本。我需要使用prepared语句向数据库中插入一些值 我的数组的形式为: $insert = array('column1' => 'value1', 'column2' => 'value2', 'column3' => 'value3') 到目前为止,我有这个功能,但我需要有关bind_param部分的帮助。我在这里看到了使用call\u user\u func\u array的文档,但我不确定如何实现这一点 $cols = array

我正在编辑一个使用MySQLi的脚本。我需要使用prepared语句向数据库中插入一些值

我的数组的形式为:

$insert = array('column1' => 'value1', 'column2' => 'value2', 'column3' => 'value3')
到目前为止,我有这个功能,但我需要有关
bind_param
部分的帮助。我在这里看到了使用
call\u user\u func\u array
的文档,但我不确定如何实现这一点

$cols = array_keys($insert);
$query = "INSERT IGNORE INTO results (". implode(", ", $cols) .") VALUES (". implode(', ', array_fill(0, count($insert), '?')) .")";
$stmt = $mysqli->prepare($query);
$param = array_merge(array(str_repeat('s', count($insert))), array_values($insert)); 
call_user_func_array(array($stmt, 'bind_param'), $param); 
$stmt->execute();

PHP 5.4.17

我想这就是您想要的:

cols = array_keys($insert);
$query = "INSERT INTO results (". implode(", ", $cols) .") VALUES (". str_repeat('?', count($insert)) .")";
$stmt = $mysqli->prepare($query);

call_user_func_array('mysqli_stmt_bind_param', array_merge (array($stmt, str_repeat('s', count($insert))), $insert); 

不。。。这肯定比任何阵列的PDO都要难,因为它的工作原理。。。通过将
$array
更改为删除/添加其他列的数据,可以很好地工作

$mysqli = new mysqli('localhost', 'root', 'password', 'test');

$array  = array("name"=>"pineapple", "color"=>"purple"); 

$table_name = "fruit"; 



insert_data($mysqli, $array, $table_name);



function insert_data($mysqli, $array, $table_name) 
{
   $placeholders = array_fill(0, count($array), '?');

   $keys   = array(); 
   $values = array();
   foreach($array as $k => $v) {
      $keys[] = $k;
      $values[] = !empty($v) ? $v : null;
   }

   $query = "insert into $table_name ".
            '('.implode(', ', $keys).') values '.
            '('.implode(', ', $placeholders).'); '; 
   // insert into fruit (name, color) values (?, ?);    

   $stmt = $mysqli->prepare($query);

   // create a by reference array... 
   $params = array(); 
   foreach ($array as &$value) { 
      $params[] = &$value;
   }
   $types  = array(str_repeat('s', count($params))); 
   $values = array_merge($types, $params); 

   /*           
   $values = Array
      (
          [0] => ss
          [1] => pineapple
          [2] => purple
      ) 
   */

   call_user_func_array(array($stmt, 'bind_param'), $values); 

   $success = $stmt->execute();

   if ($success) { print "it worked..."; } 
           else { print "it did not work..."; }
}  
我从这些SO帖子中得到了一些帮助:
-
-


所以。。。在
$stmt->bind_param()
中,第一个参数是一个字符串,每个传入的参数有一个字符。该字符表示参数数据类型。在上面的示例中,这两个参数都是字符串,因此它变为
ss
。在上面的示例中,也总是假定一个字符串

我在
bind_param()
文档中找到了此图表:

类型
包含一个或多个字符的字符串,用于指定相应绑定变量的类型:

Type specification chars  

Character    Description  
i            corresponding variable has type integer
d            corresponding variable has type double
s            corresponding variable has type string
b            corresponding variable is a blob and will be sent in packets

插入带有bind_参数的数组很痛苦,我建议使用php的filter_var函数。它做同样的过滤,也验证变量,输入,它的完美

net文档很好地解释了这个函数:谢谢,但这是我的第一个目的地。我还没有完全弄明白。@allanb,看看SamA链接中ReflectionClass(上面的注释)示例的注释。重复的?看看这个:小心用逗号分隔
占位符。这是PDO,而问题是关于mysqli的。哦!那对我来说几乎更容易。。。我只是白白做了很多工作。英雄联盟等一下。但是
警告:call\u user\u func\u array()要求参数1是有效的回调,第一个数组成员不是有效的类名或对象
这是我尝试此操作时得到的。它对我有效。。。?我可以复制和粘贴它,但对我来说,它运行良好,并更新我的数据库。您已经能够弄清楚您正在运行的php版本了吗?也许你应该用显示错误的新代码更新你的问题。。。合并代码时可能会出错?如果$types是字符串和整数的混合体,该如何处理