デジタル・インフォメーション/デジタル・フォー・ミー [PC等のデジタル製品の疑問、トラブル解決に]
PC・デジタル製品の疑問、困ったことを検索。
:AND検索 :OR検索
【 【MySQL+PHP】戻り値が重複。 】
更新日時:2013年4月18日(木) 16:36:04
投稿日時:2013年4月18日(木) 16:36:04
このエントリーをはてなブックマークに追加

PHPでMySQLを扱う時に、返ってきた値が重複、ダブっていることがあります。
レコード数が10個なのに、返ってきた値は20個になっている。

クエリーを送ってからの戻り値をどう処理しているかを確認してください。

仮にmysql_fetch_arrayを使用しているなら、その動作は正常です。
2番目の引数に指定がない場合かMYSQL_BOTHをしている場合は
この動作で正常なのです。

mysql_fetch_arrayは数値添え字([0][1][2][3]など)と
連想添え字(連想キー:カラム名)の両方を返します。
つまりはmysql_fetch_arrayで引数を1つしか(戻り値のみ)
指定しなかった場合、第二引数はデフォルトのMYSQL_BOTHになり、

[0]=sample;
["test"]=sample;
[1]=hogehoge;
["cols2"]=hogehoge;
[0]=gekogeko;
["cols3"]=gekogeko;

となります。
第二引数を指定すると(MYSQL_BOTH以外)解決します。
つまり、
mysql_fetch_array($result,MYSQL_ASSOC)
mysql_fetch_array($result,MYSQL_NUM)
を指定すると言うことです。
もしくは
mysql_fetch_row($result)で処理すると良いでしょう。

下記例は$resultを$reと記載しています。

例1:

while($kekka=mysql_fetch_array($re,MYSQL_NUM)){
foreach($kekka as $line){
//処理
(print $line;)
//
}
}

例2:

while($kekka=mysql_fetch_row($re)){
foreach($kekka as $line){
//処理
(print $line;)
//
}
}

こんな感じでしょうか。
while~foreach内の処理の例、1つのやり方として、こういう処理はどうでしょうか。
良いか悪いかはわかりませんが、理解はしやすいのでは無いかと思います。


while($kekka=mysql_fetch_array($re,MYSQL_ASSOC)){
foreach($kekka as $key =>$value){
//cntはレコードの行、keyで列の処理
$lists[$cnt][$key]=$value;
}//end foreach
$cnt++;
}//end while

MYSQL_NUMでもいいのかもしれませんが、キーで指定する方が
カラムが多くなった場合に処理がしやすいのでは無いかと思いました。

処理としてはwhile文では行(レコードの数)を処理し、
foreachで1行のカラムを処理しています。

つまり、foreach文が終了すると、1行の処理が終わったと言うことです。
なので、cntに1加算(インクリメント)して、配列の次の要素にアクセスする
ということになります。

}

【 Digital Information / Digital For Me】
Copyright (C) Gontaro-Systems. All Rights Reserved.