将php关联数组键和值传递给MySql SELECT语句

时间:2012-08-30 22:33:59

标签: php mysql sql select rows

我正在使用php + mysql,我在DB中有这样的表:

col1-col2-col3
A - val1 - str1
A - val2 - str2
A - val3 - str3
B - val4 - str4
B - val5 - str5
...

还有php中的关联数组:

$arr = array('A'=>'value1','B'=>'value2', ...);

然后我将这个数组传递给MySql字符串中的占位符,以生成完整的SELECT语句。

如何选择列3的值,其中第1列的值等于数组的键,第2列的值分别小于数组值?也许用某种方式将GROUP与两个选择结合在一起......

结果应该只是满足要求的所有第3列值的列表。

可以使用这样的方式完成:

$aReturn = array();
$sql = "SELECT col3 FROM MyTab WHERE col1 = ? AND col2 < ?d";
foreach ($arr as $k=>$v) {
    $aReturn = array_merge($aReturn, $this->select($sql, $k, $v));
}

其中select是选择DB并返回值列表中最后一列的值的方法,然后我们将结果列表添加到$ aReturn。但在这种情况下,它会多次查询, 但有没有办法只在一个 SELECT?

中做到这一点

1 个答案:

答案 0 :(得分:3)

我认为这不能用占位符来完成,因为查询的结构不是固定的 - 在WHERE子句中需要与数组中的元素一样多的条件。这是未经测试的代码:

更新:使用预备声明

$wheres = array();
$types = '';
$col1s = array();
$params = array(null, null);
$i = 0;
foreach ($assoc as $key => $val) {
  $wheres[] = '(col1 = ? AND col2 < ?)';
  $types .= 'ss';
  $col1s[$i] = $key;
  $params[] = &$col1s[$i];
  $params[] = &$assoc[$key];
  $i++;
}
$whereclause = implode(' OR ', $wheres);
$sql = "SELECT * FROM my_table WHERE $whereclause";
$stmt = mysqli_prepare($link, $sql);
$params[0] = $stmt;
$params[1] = $types;
call_user_func_array('mysqli_stmt_bind_params', $params);
mysqli_stmt_execute($stmt);