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

时间:2014-05-31 07:20:26

标签: php mysql mysqli

我遇到了mysqli准备好的声明问题。这可能是一些菜鸟错误;我对这样的事情不太熟悉。任何帮助表示赞赏。

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

$alpha = array('name', 'age', 'color');
$bravo = array(
    'name'  => 'John Doe',
    'age'   => 22,
    'color' => 'blue',
);

我想通过使用$bravo[]定义列标题然后将$alpha[]中的数据绑定到查询,然后执行查询,将$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
   }
}

这对我不起作用 - 我们非常感谢你们提供的任何帮助或见解(包括其他方式来完成我想做的事)。


1 个答案:

答案 0 :(得分:1)

将bind_param更改为

$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()函数来源:https://stackoverflow.com/questions/3681262/...