循环迭代后重置字符串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则每次循环迭代?

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

+2

多么美妙的例子来说明为什么你应该始终* *使用参数而不是查询字符串改写(munging)值。 –

+2

但是,如果这^是太难为你,那么'$结果= $ conn->查询($ SQL “ '” $关键。 “'”);' –

+0

你在哪里定义'$ sql'变量?如果你想让它在每次循环迭代时“重置”,那么它听起来应该在循环中定义*。或者至少不会被循环修改。 – David

要使用不同的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语句