循环迭代后重置字符串php

时间:2016-11-23 14:14:07

标签: php sql

我需要动态地进行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)?

非常感谢你 (抱歉我的英文不好,葡萄牙语代码,哈哈)。

1 个答案:

答案 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语句