【问题标题】:PHP - MySQL prepared statement to INSERT an array [duplicate]PHP - MySQL准备语句插入数组[重复]
【发布时间】:2013-11-09 01:35:11
【问题描述】:

我正在编辑一个使用 MySQLi 的脚本。我需要使用准备好的语句将一些值插入到数据库中。

我的数组是这样的:

$insert = array('column1' => 'value1', 'column2' => 'value2', 'column3' => 'value3')

到目前为止我有这个,但我需要bind_param 部分的帮助。我在这里看到了使用 call_user_func_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

【问题讨论】:

标签: php mysql mysqli sql-insert


【解决方案1】:

我想这就是你要找的:

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); 

【讨论】:

  • 注意用逗号分隔? 占位符。
【解决方案2】:

不...这绝对比使用任何数组的 PDO 更难,因为 mysqli_stmt_bind_param() 的工作原理...通过将 $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 帖子中得到了一些帮助:
- https://stackoverflow.com/a/15933696/623952
- https://stackoverflow.com/a/6179049/623952


所以...在$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

【讨论】:

  • 这是 PDO,而问题是关于 mysqli。
  • 哦!好吧,这对我来说几乎更容易......我只是白白做了很多工作。大声笑...等一下
  • 谢谢。但是Warning: call_user_func_array() expects parameter 1 to be a valid callback, first array member is not a valid class name or object 这是我尝试这个时得到的。
  • 它对我有用...?我可以再次复制并粘贴它,但对我来说,它运行良好并更新了我的数据库。你能弄清楚你正在运行什么 php 版本吗?也许您应该使用显示错误的新代码更新您的问题...您可能在合并代码时出错了?
  • 当$types是字符串和整数的混合时怎么办
【解决方案3】:

用 bind_param 插入数组很痛苦,我推荐使用 php 的 filter_var 函数。它进行相同的过滤,并验证变量、输入,它是完美的。 function manual page

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-12-06
    • 1970-01-01
    • 2012-08-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多