Php 为mysqli prep语句使用数组/字符串

Php 为mysqli prep语句使用数组/字符串,php,mysql,mysqli,Php,Mysql,Mysqli,我遇到了一个与mysqli准备的声明有关的问题。这可能是新手犯的错误;我对这样的事情不太熟悉。感谢您的帮助 我有两个数组,$alpha[]和$bravo[]。两者都有20对,但为了简化: $alpha = array('name', 'age', 'color'); $bravo = array( 'name' => 'John Doe', 'age' => 22, 'color' => 'blue', ); 我想通过使用$alpha[]定义列标

我遇到了一个与mysqli准备的声明有关的问题。这可能是新手犯的错误;我对这样的事情不太熟悉。感谢您的帮助

我有两个数组,
$alpha[]
$bravo[]
。两者都有20对,但为了简化:

$alpha = array('name', 'age', 'color');
$bravo = array(
    'name'  => 'John Doe',
    'age'   => 22,
    'color' => 'blue',
);
我想通过使用
$alpha[]
定义列标题,然后将
$bravo[]
中的数据绑定到查询,然后执行查询,从而将
$bravo[]
中的数据插入到我的表中。下面是我想做的一个例子:

$columns = implode(',', $alpha);
$query_values = '?,?,?';
$query   = "INSERT INTO table ($columns) VALUES ($query_values)";

$type = 'sis';
$real_values = implode(',', $bravo);

if($stmt = $mysqli->prepare($query)){
   $stmt->bind_param($type, $real_values);
   if($stmt->execute()){
      // success
   }
}
这对我不起作用-非常感谢你们提供的任何帮助或见解(包括实现我想做的事情的其他方法)



将绑定参数更改为

$stmt->bind_param($type, $bravo[0], $bravo[1], $bravo[2]);

尽管上述方法有效,但它并不是完美的解决方案,因为它要求您在每次添加/删除列数据时更改
mysqli_bind_param
的参数

以下是正确工作流示例中的解决方案:

// returns an array of associative values
function ref_array_keys($arr) {
  $refs = array();

  foreach ($arr as $key => $value)
  {
      $refs[$key] = &$arr[$key];
  }

  return $refs; 
}

$data = array('name' => 'John Doe', 'email' => 'user@domain.com', 'color' => 'red');
$type = 'sss';

$cols = implode(',', array_keys($data));
$vals = implode(',', array_fill(0, count($data), '?'));
$query = "INSERT INTO table_name ($cols) VALUES ($vals)";

if ($stmt = new mysqli($query)) 
{
  call_user_func_array(array($stmt, "bind_param"), array_merge(array($type), ref_array_keys($data)));
}

ref_array_keys()函数源:

虽然这确实实现了我的目标,但这并不是我想要的。有没有办法仅仅将整个数组中的所有值放在其中,而不是写出所有20多个引用?我使用call\u user\u func\u数组来完成这一点。注意,根据php版本的不同,它需要稍微不同的处理。再见,谢谢。我将你的答案标记为正确答案,并将编辑你的帖子,以反映评论中的其他信息。