0

I have an array in PHP that is looping through a set of names (and a corresponding quantity). I would like to print the ones found in a MYSQL database table (to which I've succesfully connected). I'm currently using the code:

foreach ($arr as $name => $quan) {
$query = "SELECT * FROM table WHERE name='$name'";
$result = mysql_query($query) or die(mysql_error());  
if (mysql_num_rows($result) > 0) {
    $row = mysql_fetch_array($result);
    echo $quan." ".$row['name']. "\n";  
}
}

For some reason, this only prints the last quantity and name in the array. Help? For example, if the array has key-value pairs of {A-4, B-2, C-3}, and table contains {A, B, D} as names ... it'll only print "2 B".

4

1 に答える 1

4

コードを次のように変更します。

foreach ($arr as $name => $quan) {
  $query = "SELECT * FROM table WHERE name='$name'";
  $result = mysql_query($query) or die(mysql_error());  
  if (mysql_num_rows($result) > 0) {
    while($row = mysql_fetch_array($result)) {
      echo $quan." ".$row['name']. "\n";  
    }
  }
}

結果をループする必要があります。ところで、使用をやめてmysql_query()ください!代わりに MySQLi または PDO を使用します ( SQL インジェクションmysqli_real_escape_string()に注意してください。入力パラメーターの処理に使用できます)。MySQLi の実装については、次のとおりです。

foreach ($arr as $name => $quan) {
  $query = "SELECT * FROM table WHERE name='$name'";
  $result = mysqli_query($query) or die(mysqli_error());  
  if (mysqli_num_rows($result) > 0) {
    while($row = mysqli_fetch_array($result)) {
      echo $quan." ".$row['name']. PHP_EOL;  
    }
  }
}

むしろ、私は(上記のように)"\n"を使用することを好みますPHP_EOL


コメントが示唆するように、SQL ステートメントは次のように 1 回実行できます。

$flipped_array = array_flip($arr); // flip the array to make "name" as values"
for($i = 0; $i < count($flipped_array); $i++) {
  $flipped_array[$i] = '\'' . $flipped_array[$i] . '\''; // add surrounding single quotes
}
$name_list = implode(',', $arr);
$query = "SELECT * FROM table WHERE name IN ($name_list)";
// ... omit the followings

たとえば、$arr に "peter"、"mary"、"ken" が含まれている場合、クエリは次のようになります。

SELECT * FROM table WHERE name IN ('peter','mary','ken')

補足:しかし、私はあなたの質問を理解していません。クエリから名前を取得するだけですか? 行数を確認したり、次のように名前でグループ化することもできます。

SELECT name, COUNT(*) AS cnt FROM table GROUP BY name ORDER BY name

欲しいものを手に入れるために。


UPDATE(再度): OPのコメントに基づいて、ここに解決策があります:

$flipped_array = array_flip($arr); // flip the array to make "name" as values"
for($i = 0; $i < count($flipped_array); $i++) {
  $flipped_array[$i] = '\'' . $flipped_array[$i] . '\''; // add surrounding single quotes
}
$name_list = implode(',', $arr);
$query = "SELECT name, COUNT(*) AS cnt FROM table WHERE name IN ($name_list) GROUP BY name HAVING COUNT(*) > 0 ORDER BY name";
$result = mysqli_query($query) or die(mysqli_error());  
if (mysqli_num_rows($result) > 0) {
  while($row = mysqli_fetch_array($result)) {
    echo $quan." ".$row['name']. ": " . $row['cnt'] . PHP_EOL;  
  }
}

上記のクエリは、テーブルにのみ表示される名前を表示します。表にない名前は表示されません。完全なコードになりました (再び SQL インジェクションに注意してください)。

于 2013-04-30T07:27:40.380 に答える