0

コードに問題があります。同じ値を繰り返す mysql_fetch_array 出力。これは私のコードです:

$sql= "SELECT client.resID AS resID, client.resName AS resName, menu.id AS mid, menu.name AS mname, facilities.name AS fname, facilities.id AS fid FROM client INNER JOIN menu ON client.resID = menu.resID INNER JOIN facilities ON client.resID = facilities.resID WHERE client.resID =".$_GET["resID"];
$rs = mysql_query($sql) or die($sql."<br/><br/>".mysql_error());



while ($f = mysql_fetch_array($rs)) { // loop as long as there are more results
    $names[] = $f['mname'];  // push to the array

print_r($names)

}

レストランに米とじゃがいもがあるとしましょう。print_r($names) が返されます:

Array ( [0] => rice [1] => potato [2] => rice [3] => potato [4] => rice [5] => potato [6] => rice [7] => potato [8] => rice [9] => potato ) 

どうすればこの問題を解決できますか? あなたの助けに本当に感謝します:D

4

3 に答える 3

1

あなたの質問

SELECT client.resID AS resID, client.resName AS resName,
       menu.id AS mid, menu.name AS mname,
       facilities.name AS fname, facilities.id AS fid 
FROM client
INNER JOIN menu ON client.resID = menu.resID
INNER JOIN facilities ON client.resID = facilities.resID
WHERE client.resID =".$_GET["resID"]

他の2つのテーブルが一致する回数だけ、「米」の出現回数を返します。で設定された列で結合しているためWHERE、クエリは事実上、3つの結合されたテーブルのデカルト積になります(でフィルタリングした後resID)。

元。:

john rice fac1
john meat fac1
john rice fac2
john meat fac2
...

おそらく、テーブルごとに1つずつ、3つの別々のクエリを作成したいとします。

SELECT mid, mname FROM menu WHERE resID = $resID

または、他の列(たとえば、3つのテーブルすべてで一意の列)に参加したいですか?

SELECT ...
FROM client
INNER JOIN menu ON client.resID = menu.id
INNER JOIN facilities ON client.resID = facilities.id

また、数値を期待している場合でも、エスケープされていないgetパラメータをクエリ文字列に含めることは危険であることに注意してください。mysqliプリペアドステートメントまたは(少なくとも)mysql_real_escape_stringを使用します。

于 2012-12-08T06:35:18.663 に答える
1

グループ化を使用

$sql= "SELECT client.resID AS resID, client.resName AS resName, menu.id AS mid, 
       menu.name AS mname, facilities.name AS fname, facilities.id AS fid 
    FROM client 
    INNER JOIN menu ON client.resID = menu.resID 
    INNER JOIN facilities ON client.resID = facilities.resID 
    WHERE client.resID =".$_GET["resID"]." 
    group by mname ";
于 2012-12-08T06:17:42.510 に答える
0

Man Programmerが言ったように、次を使用できますGroup By

$sql= "SELECT client.resID AS resID, client.resName AS resName, menu.id AS mid, menu.name AS mname, facilities.name AS fname, facilities.id AS fid FROM client INNER JOIN menu ON client.resID = menu.resID INNER JOIN facilities ON client.resID = facilities.resID WHERE client.resID =".$_GET["resID"]." group by mname ";

または、Group By が必要ない場合は、この種のコードを使用できます。

 $items = array();
    $sql= "SELECT client.resID AS resID, client.resName AS resName, menu.id AS mid, menu.name AS mname, facilities.name AS fname, facilities.id AS fid FROM client INNER JOIN menu ON client.resID = menu.resID INNER JOIN facilities ON client.resID = facilities.resID WHERE client.resID =".$_GET["resID"];
    $q = mysql_query ( $sql ) or die( mysql_error() );
    while( $row = mysql_fetch_assoc( $q ) ) {
     if( !in_array( $row['mname'],$items ) ) {
        $items[] = $row['mname'];
     }
    }

print_r( $items )

すでにその種類の値があることが検出された場合、配列への値の格納をスキップします。

于 2012-12-08T06:27:58.610 に答える