循环迭代后重置字符串php
问题描述:
我需要动态地执行sql查询。我的代码很容易理解:我的函数接收一个数组和一个包含查询的字符串,并且遍历数组以使用查询中“where”部分的键值。下面的代码的一部分:循环迭代后重置字符串php
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迭代增加了$键值,但我串接字符串$ sql中(其中包含实际的查询)与$键,这会导致:
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则每次循环迭代?
非常感谢你 (对不起我的英文不好,对于葡萄牙语的代码,哈哈)。
答
要使用不同的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语句
多么美妙的例子来说明为什么你应该始终* *使用参数而不是查询字符串改写(munging)值。 –
但是,如果这^是太难为你,那么'$结果= $ conn->查询($ SQL “ '” $关键。 “'”);' –
你在哪里定义'$ sql'变量?如果你想让它在每次循环迭代时“重置”,那么它听起来应该在循环中定义*。或者至少不会被循环修改。 – David