PHP / MySQLi - 循环遍历数组以构建动态WHERE子句

时间:2015-07-29 13:27:19

标签: php mysql arrays mysqli

我已经被困在某事上几天了,而且我真的希望有人可以帮助我。

我有一个名为$ default_districts的数组,它通过查询生成,以便从一个点找到预定义半径内的邮政编码区...所以存储的值的数量是动态的。

[0] => NR1
[1] => NR12
[2] => NR13
[3] => NR14
... etc.

最终,我试图了解有多少客户在"半径范围内"来自另一个地址。 所以,我想把这些值绑定到准备好的声明......

e.g。

// get data records within the default radius
if ($stmt = $mysqli->prepare("SELECT clientdata_urn, clientdata_district
FROM tblhub_clientdata
WHERE clientdata_district = ?)) {

// bind param to vars
$stmt->bind_param( // LOOP THROUGH $default_districts HERE // ));

// execute statement
$stmt->execute();

// store
$stmt->store_result();

// get numrows
$total_numrows = $stmt->num_rows;

// close statement
$stmt->close();

} else {

// error
printf("Error counting total data within default radius: %s\n", $mysqli->error);

}

如果我硬编码我试图创建它的东西就像这样......

SELECT clientdata_urn, clientdata_district
FROM tblhub_clientdata
WHERE clientdata_district = 'NR1' OR clientdata_district = 'NR12' OR clientdata_district = 'NR13' OR clientdata_district = 'NR14'

我有点新手,非常感谢任何帮助。

谢谢。

1 个答案:

答案 0 :(得分:0)

欢迎来到SO,@ Rachi。我相信这会解决你的问题。

首先,使用IN而不是一系列OR语句要好得多。我整理了SQLFIDDLE来证明这一点。

采用

形式
SELECT COUNT(id) as num_users, clientdata_district
FROM tblhub_clientdata
WHERE clientdata_district IN ('NR12', 'NR14')
GROUP BY clientdata_district

输出为您提供阵列中每个区号内的用户数。如果您想要所在区域内所有区域的用户总数(您的问题不明确),则只需删除GROUP BY行like this

接下来的挑战是构建您的字符串,以便将其放入查询中。最简单的方法是使用implode function

$query_string = implode(",", $default_districts)
$sql = "SELECT COUNT(id) as num_users, clientdata_district";
$sql.= "FROM tblhub_clientdata";
$sql.= "WHERE clientdata_district IN ($query_string)";
$sql.= "GROUP BY clientdata_district";

请注意,这不会在您的区号中添加'标记,但从我看到的代码中我不认为这很重要。最糟糕的情况是抛弃implode语句并在FOR循环中构建字符串。