2

私のコードはここにあります:

$array_letter = array("A","B","C","Ç","D","E","F","G","H","I","İ","J","K","L",
                      "M","N","O","P","R","S","Ş","T","U","Ü","V","Y","Z");

$sql = "SELECT id,city  FROM city WHERE city LIKE '" .$array_letter[$i]."%'";

そして、これらのコードの後:

for ($i=0;$i<27;$i++) {
$result = mysql_query($sql);
while ($row = mysql_fetch_array($result)) {

 echo "<h3>".$row['city']."</h3>";

   }    
}

$sql はそこでは機能しないため意味$array_letter[$i]がありません。ただし、設計上、$sql はこれらのコードの先頭にある必要があります。コーディングしたからswitch-case statementです。リクエストに応じて、 for ループの下に$sql書き込めないため変更します。$sqlしかし、私のすべてのクエリはに依存してい$array_letterます。どうすれば$array_letter仕事をすることができますか?

4

3 に答える 3

4

mysqliドライバーと準備済みステートメントを使用する必要があります。

$st = $mysqli->prepare("SELECT id,city FROM city WHERE city LIKE ?'");
for ($i=0;$i<27;$i++) {
  $st->bind_param("s", $array_letter[$i].'%');
  $st->execute();
  $result = $st->get_result();

  while ($row = $result->fetch_assoc()) {
    echo "<h3>".$row['city']."</h3>";
  }  
}

この場合、すべてを取得しているように見えるため、1 つの大きなクエリを実行することをお勧めしますSELECT id,city FROM city ORDER BY city

教育目的のための別のアプローチは、次のようなことです。

$sql = "SELECT * FROM foo WHERE bar='%s'";
mysql_query(sprintf($sql, "42"));

これは他の状況でも役立ちますが、繰り返しになりますが、SQL を作成している場合は、SQL インジェクション攻撃を防ぎ、サーバーが実行する必要がある SQL 解析の量を最小限に抑えるという追加の保護により、この問題をより適切に解決する準備済みステートメントを使用してください。 .

于 2012-05-19T14:02:44.727 に答える
1

マシューが回答で述べたように、準備済みステートメントを使用する必要があります。

それ以外の場合は、これを考慮してください (PHP 5.3 クロージャーを使用):

$sql = function($i) use ($array_letters) {
    return "SELECT id,city  FROM city WHERE city LIKE '" .$array_letter[$i]."%'";
}

次に、ループ内で:

mysql_query($sql($i));
于 2012-05-19T14:07:58.580 に答える
0

これは、データベース呼び出しを減らすのに役立ちます。

$array_letter = array("A","B","C","Ç","D","E","F","G","H","I","İ","J","K","L",
                  "M","N","O","P","R","S","Ş","T","U","Ü","V","Y","Z");
for($i=0;$i<count($array_letter);$i++){
if($i!=count($array_letter)-1)
$qstring.="city like '".$array_letter[$i]."%' or ";
 else
$qstring.="city like '".$array_letter[$i]."%'";
}
$sql = "SELECT id,city  FROM city WHERE ".$qstring;
$result = mysql_query($sql);
while ($row = mysql_fetch_array($result)) {
echo "<h3>".$row['city']."</h3>";
  }   
于 2012-05-19T14:24:08.243 に答える