我需要动态地进行SQL查询。我的代码很容易理解:我的函数接收一个数组和一个包含查询的字符串,并且我将遍历数组以使用"其中"中的键值。我的查询的一部分。这是代码的一部分:
function graficoTeste ($array, $sql) {
$conn = connect();
foreach ($array as $key => $value) {
$sql .= "'". $key. "'";
$result = $conn->query($sql);
if(!$result)
echo $conn->error;
while($row = $result->fetch_assoc()) {
$array[$key] = $row["count_est"];
}
}
问题是: 我需要每次foreach迭代时我的查询都会添加$ key值,但是我将字符串$ sql(包含实际查询)与$ key连接起来,结果是:
SELECT COUNT(Estudante) AS count_est FROM `2016-1` WHERE municipio='Jatai'
SELECT COUNT(Estudante) AS count_est FROM `2016-1` WHERE municipio='Jatai''Goiânia'
SELECT COUNT(Estudante) AS count_est FROM `2016-1` WHERE municipio='Jatai''Goiânia''Goiás'
SELECT COUNT(Estudante) AS count_est FROM `2016-1` WHERE municipio='Jatai''Goiânia''Goiás''Catalão'
我需要它:
SELECT COUNT(Estudante) AS count_est FROM '2016-1' WHERE municipio='Jatai'
SELECT COUNT(Estudante) AS count_est FROM `2016-1` WHERE municipio='Goiânia'
SELECT COUNT(Estudante) AS count_est FROM `2016-1` WHERE municipio='Goiás'
SELECT COUNT(Estudante) AS count_est FROM `2016-1` WHERE municipio='Catalão'
有没有办法在每次循环迭代时将$ sql字符串恢复为默认值(最后没有$ key)?
非常感谢你 (抱歉我的英文不好,葡萄牙语代码,哈哈)。
答案 0 :(得分:1)
要使用不同的WHERE子句运行相同的SQL语句,只需在语句中使用占位符,准备语句,然后使用键/值对在循环中运行它。准备好的语句每次运行时都会重复使用。
您的陈述将如下所示:
SELECT COUNT(Estudante) AS count_est FROM '2016-1' WHERE municipio = ?
您的代码大致会有这样的设置:
$sql = "SELECT COUNT(Estudante) AS count_est FROM '2016-1' WHERE municipio = ?";
foreach ($array as $key => $value) {
$stmt->execute(array($key));
while ($row = $stmt->fetch()) {
print_r($row);
}
}
由于数据库不必解析SQL并为每个调用准备执行计划,但只需执行一次,因此重新使用预准备语句可以加快操作速度。节省的执行时间可能相当可观。
另见: Prepared statements and stored procedures at php.net
但是,根据数据库中的数据,使用一个查询可能会更有效率
SELECT COUNT(Estudante) AS count_est, municipio FROM '2016-1' group by municipio
在从数据库中检索结果集时查找PHP数组中的城市名称 - 与在循环中运行单个查询相比,可能更少的服务器负载和执行时间。
编辑1:拼写错误修改,编辑2:建议GROUP BY语句