2016-11-23 2 views
1

私は動的にSQLクエリを実行する必要があります。私のコードは理解しやすいです:私の関数は配列とクエリを含む文字列を受け取り、配列を繰り返してクエリの "どこ"の部分のキー値を使用します。ここでは、コードの一部です:ループ反復後の文字列をリセットする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文字列を(元に戻す方法はありますループが反復するたびに?

ありがとうございました (私の悪い英語とポルトガル語のコード、ハハのために申し訳ありません)。

+2

によって提案されたGROUP:固定、編集2をタイプミス。 –

+2

しかし、これが難しい場合は、 '$ result = $ conn-> query($ sql。" '。$ key。 "'"); ' –

+0

あなたは' $ sql'変数をどこで定義していますか?ループの繰り返しごとに "リセット"したい場合は、ループ*で定義する必要があります。または少なくともループによって変更されていない。 – David

答えて

1

異なるWHERE句で同じSQL文を実行するには、文のプレースホルダを使用して文を準備し、キーと値のペアをループ内で実行します。準備されたステートメントは、実行されるたびに再利用されます。サイディング効果を再使用して準備されたステートメントのように操作をスピードアップしたよう

$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); 
    } 
} 

:あなたのコードは大体このセットアップを持っています

SELECT COUNT(Estudante) AS count_est FROM '2016-1' WHERE municipio = ?

あなたの文は次のようになります。データベースはSQLを解析して、各コールごとに1回だけ実行プランを準備する必要はありません。実行時間が節約される場合があります。

も参照してください: Prepared statements and stored procedures at php.net

しかし、データベース内のデータに応じて、それは1つのクエリ

SELECT COUNT(Estudante) AS count_est, municipio FROM '2016-1' group by municipio

を使用することがはるかに効率的とすることができ、自分の中で都市名を検索PHP配列を使用して、データベースから結果セットを取得します。ループ内で単一のクエリを実行する場合と比較して、サーバー負荷や実行時間が大幅に短縮されます。

編集1:代わりに、クエリ文字列の値をいじるのなぜべき*常に*使用パラメータを説明するためにどのような素晴らしい例の文

関連する問題