• ベストアンサー

データの絞込み

はじめまして。 いつもこのサイトを参考に勉強しております。(MySql、PHP) データの絞込みでつまづいておりますので、 ぜひアドバイスを頂きたいと思います。 種類|色 犬|黒 犬|白 猫|白 というデータがあり、 ■犬 ・黒 ・白 ■猫 ・白 というような結果を得たいのです。 $sql = "select distinct 種類,色 from テーブル;"; $rst = mysql_query($sql, $con) or die("データ抽出エラー"); print "<P>■{種類}</P>\n"; while ($row = mysql_fetch_array($rst, MYSQL_ASSOC)) { print "<P>{$row['色']}</P>\n"; } どこが間違っているのか教えてください。 宜しくお願いいたします。

質問者が選んだベストアンサー

  • ベストアンサー
  • kirin_f
  • ベストアンサー率51% (44/85)
回答No.3

1.最初に種類だけ取得して、その後色を取得する方法 $sql = "select distinct 種類 from テーブル;"; $rst = mysql_query($sql, $con) or die("データ抽出エラー"); while ($row = mysql_fetch_array($rst, MYSQL_ASSOC)) { print "<P>■{$row['種類']}</P>\n"; $sql = "select distinct 色 from テーブル where 種類='".$row['種類']."';"; $rst2 = mysql_query($sql, $con) or die("データ抽出エラー"); while ($row = mysql_fetch_array($rst2, MYSQL_ASSOC)) { print "<P>{$row['色']}</P>\n"; } } 2.一度連想&多次元配列にしてしまう方法 $sql = "select 種類,色 from テーブル;"; $rst = mysql_query($sql, $con) or die("データ抽出エラー"); while ($row = mysql_fetch_array($rst, MYSQL_ASSOC)) { $data[$row['種類']][] = $row['色']; } foreach($data as $kind=>$colors) { print "<P>■{$kind}</P>\n"; foreach($colors as $color) { print "<P>{$color}</P>\n"; } }

noname#235190
質問者

お礼

ありがとうございました。 1を使わせていただきます。 求めていた結果を得ることができてスッキリしました。 同じ結果を出すのにもいろいろな方法があるんですね。 まだまだ勉強不足です。 2の方も今後の参考にしたいと思います。 今後ともよろしくお願いします。

全文を見る
すると、全ての回答が全文表示されます。

その他の回答 (2)

  • myaa_myu
  • ベストアンサー率52% (9/17)
回答No.2

No1です。 これが正解というわけではありませんが、こういう方法があります。 比較用の種類変数$b_kindsを用意して、ひとつ前の抽出結果と比較します。 同じじゃなかったら種類をprint、同じだったらprintしないという方法です。 あと、mysql_fetch_arrayの第2引数をMYSQL_NUMに代えて、$row配列ではなくそれぞれ変数に入れました。 $sql = "select distinct 種類,色 from テーブル;"; $rst = mysql_query($sql, $con) or die("データ抽出エラー"); $b_kinds = ''; // 比較用の種類 while (list($kinds,$color) = mysql_fetch_array($rst, MYSQL_NUM)) { if($b_kinds != $kinds){ print "<P>{$kinds}</P>\n"; } print "<P>{$color}</P>\n"; $b_kinds = $kinds; } 実際動かしていないので、きちんと動作するか微妙ですが、 ご参考までにどうぞ(動かなかったらごめんなさい;) もっとスマートな方法があると思いますので、ご参考までにどうぞ。

noname#235190
質問者

お礼

早急なアドバイスありがとうございました。 試してみたらきちんと動作しました。 しかし、もう一度同じ内容のデータを追加すると 同じ項目が並んでしまうので、上記kirin_fさんの1を 利用することにしました。 いろいろとありがとうございました。 今後ともよろしくお願いします。

全文を見る
すると、全ての回答が全文表示されます。
  • myaa_myu
  • ベストアンサー率52% (9/17)
回答No.1

どのようにエラーが出るのかは分かりませんが、この部分がちょっと気になりました。 誤)$sql = "select distinct 種類,色 from テーブル;"; 正)$sql = "select distinct 種類,色 from テーブル"; ※閉じるときの”(ダブルクォーテーション)の前に;(セミコロン?)はいらない。 ご参考になれれば幸いです。

noname#235190
質問者

補足

ありがとうございます。;は要らないんですね(汗 勉強になりました。 セミコロンを外してみましたが、 ■(なにも表示されない) 黒 白 白 となってしまうのです。宜しくお願いします。

全文を見る
すると、全ての回答が全文表示されます。

関連するQ&A

  • SELECT文で取り出したデータを文字列を別のtableのひとつのフィールドへ

    宜しくお願いいたします。 PHP5 Mysql5 で運用しています。 $sql = "SELECT * FROM member WHERE ****** $rst = mysql_query($sql, $con); で取り出して while($col = mysql_fetch_array($rst)) { print $col['mail']; } これで表示はさせられるのですが、 この出てきたデータを [ , ] で区切って全部一まとめにして。 次の画面で、別のテーブルの一つのフィールドに 全部入れたいのですが判りません。。 表示はさせられるのだから、それを一まとめにしては 出来るつもりでしたが。どうしても判りません。 どのようにしたらよろしいでしょうか? アドバイスなど、宜しくお願いいたします。

    • ベストアンサー
    • PHP
  • BLOBデーターの画像の表示方法を教えてください。

    php(4.3)とmysql(4.0)を使って、BLOBに格納した画像を表示させたいです。 テーブル:gazou 画像名:aa.gif | id |   images    | | ̄ ̄| ̄ ̄ ̄ ̄ ̄ ̄ ̄| ̄ ̄ | 1 | [BLOB-2.9KB] | ↑ PHPMYADMINでデーターを作って、画面にはこのように表示されています。 <html> <head> <meta http-equiv=”Content-Type” content=”text/html; charset=EUC-JP”> </head> <body> <?php $conn = mysql_connect("localhost","user","pass"); mysql_select_db(test); $self = basename($_SERVER['PHP_SELF']); $sql = " SELECT * FROM gazou "; $rst = mysql_query($sql,$conn); while($row=mysql_fetch_array($rst)){ print"<img src='{$self}?id=$row[id]'>"; } ?> </body> </html> 本やネットで自分なりに調べた結果、これで画像が表示されるはず(!?)だと思っているのですが、残念ながら、画像は×になって表示されません。 初歩的な質問ですみませんが、どうすれば画像は表示されるのでしょうか? よろしくお願いします。

    • ベストアンサー
    • PHP
  • PHPからのLike検索について。

    初めまして。 ロリポップでPHPとMySQLを使ってHPを作成しているのですが Likeの条件を付け足すと結果が取得できなくなってしまいます。 ロリポップ上の【phpMyAdmin】で同じSQLを実行すると 結果を取得してくれるのですが PHP上でLike条件を付け足すと、上手く結果を取得してくれなくて困っています。 $key = "あ"; $LIKE = " where furigana Like '$key%'"; $SQL = "select count(*) from item_info" . $LIKE; $rst = mysql_query( $SQL, $con ); print $SQL; $col = @mysql_fetch_row($rst); $ret[0] = mb_convert_encoding($col[0],"SJIS","EUC-JP"); print "<br>"; print $ret[0]; このSQLで結果【1】が取得できるはずなのですが 表示すると必ず【0】となってしまいます。。 上記のコードに何か間違いがありますでしょうか? ご教授お願い致します。

    • 締切済み
    • PHP
  • PHPでのデータ表示画面⇒CSV出力について

    先日より質問に対しコメントありがとうございます。 教えていただいた内容と自分でやった結果3つのSQLでデータを出力し出力順を揃えた方法で表ができました。 これをCSV形式で出力したいのですがこのまま出力できるのでしょうか?それとも別途方法をとる必要があるのでしょうか。 自分の中で今ひとつまとまらないので改めて質問させていただきます。 ソースへの指摘併せコメントよろしくお願いします。 ※現ソース <HTML> <BODY> <?PHP //DB接続部省略 $sql="SELECT I.ITEM_ID,I.ITEM_NAME FROM ITEMS AS I,LIST AS L・・・(略)"; $sql2="SELECT A.SHOP_ID,A.SHOP_NAME,A.ITEM_NAME, IF(L.ITEM_ID=A.ITEM_ID,'○','') FROM・・・(略)"; $sql3="SELECT S.SHOP_ID,S.SHOP_NAME FROM SHOP AS S ・・・(略)"; $rs=mysql_query($sql,$db); $rs2=mysql_query($sql2,$db); $rs3=mysql_query($sql3,$db); $line=mysql_num_rows($rs); $line2=mysql_num_rows($rs2); $line3=mysql_num_rows($rs3); print("<TABLE border=1>"); print("<TR>"); print("<TD>店舗名</TD>"); for($i=0;$i<$line;$i++) { $row=mysql_fetch_row($rs); print("<TD>".$row[1]."</TD>"); } print("</TR>"); print("<TR>"); for($i=0;$i<$line3;$i++) { $row3=mysql_fetch_row($rs3); print("<TD>".$row3[2]."</TD>"); for($j=0;$j<$line;$j++) { $row2=mysql_fetch_row($rs2); if($row2[3] == "") { print("<TD width=25> </TD>"); } else { print("<TD width=25>".$row2[3]."</TD>"); } } print("</TR>"); } print("</TABLE>"); mysql_free_result($rs); mysql_free_result($rs2); mysql_free_result($rs3); mysql_close($db); ?> </BODY> </HTNL>

    • ベストアンサー
    • PHP
  • PHP&MySQLデータ削除のスクリプトについて

    はじめまして。 PHP、MySQL始めたばかりの初心者です。 この度、自力で解決出来なく、質問させて頂く事にしました。 現在、MySQL入門以前という参考書を見ながらデータベースを作っていました。削除スクリプトで、どうしても躓いておりまして何が原因が分からずじまいです。下記が呼び出しスクリプトです --------------------------ここから--------------------------- <?php extract($_GET); mysql_connect('localhost','root','xxxxx'); mysql_select_db('xxxxx'); $sql = "select * from xxxxx where id = '{$id}'"; $result = mysql_query($sql); $rows = mysql_num_rows($result); if($rows == 0){ echo "検索データが見つかりませんでした。"; exit; } else { while($row = mysql_fetch_array($result)){ echo "<h2> " , $row["title"] , "</h2>"; echo "<p><font size=\"-2\">#", $row["id"] ," ●",$row["tourokubi"] ,"</font></p>\n"; echo "<p><div class=\"hon\">", nl2br($row["honbun"]), "</div></p>"; echo "<div class=\"key\">keywords: ", nl2br($row["keyword"]), "</div>"; $ukid=$row["id"]; echo "<center> <a href=\"j_sakujo1.php?i=$ukid\"><img src=\"sakujobutton.gif\" alt=\"削除ボタン\" border=0></a>  <a href=\"correct.php?i=$ukid\"><img src=\"shuseibutton.gif\" alt=\"修正ボタン\" border=0></a>  </center>"; } } ?> --------------------------ここまで--------------------------- そして削除スクリプトです --------------------------ここから--------------------------- <?php extract($_POST); extract($_GET); mysql_connect('localhost','root','xxxxx'); mysql_select_db('xxxxx'); //MySQLレコード削除 if($kakunin=="確認"){ $sql = "delete from xxxxx where id = '{$id}'"; mysql_query($sql); echo "レコードの削除が完了しました"; exit; } //削除確認のためのフォーム $sql = "select * from xxxxx where id = '{$id}'"; $result = mysql_query($sql); $rows = mysql_num_rows($result); if($rows == 0){ echo "<p>該当データがありません。</p>"; } else{ while($row = mysql_fetch_array($result)){ echo "<p>このレコードを削除します。</p>"; echo "<form action = \"j_sakujo1.php\" method = \"post\">"; echo "<p>登録日:"; echo $row["tourokubi"]; echo "</p>"; echo "<p>タイトル:"; echo $row["title"]; echo "</p>"; echo "<p>本文:"; echo $row["honbun"]; echo "</p>"; echo "<p>キーワード:"; echo $row["keyword"]; echo "</p>"; echo "<input type = \"hidden\" name = \"ren\" value =\""; echo $row["renban"]; echo "\">"; echo "<p><input type=\"submit\" name=\"kakunin\" value=\"確認\">"; echo "<input type=\"reset\" value=\"リセット\"></p>"; echo "</form>"; } } ?> --------------------------ここまで--------------------------- これで削除ボタンを押すと「該当データがありません。」だけ表示され 登録してあるデータがまったく表示されません。 どこで間違ったのか、どうかご指南お願い致します。

  • PHP+MYSQLで直近3件のデータ表示

    直近のデータを3件表示するのに $sql =" select * from テーブル order by フィールド(date型) desc limit 3" ; だとうまくいくのですが DATETIME形に変えるとうまくいかないのは、何か変な事してますでしょうか? $sql =" select * from テーブル order by フィールド(datetime型) desc limit 3" ; 他の箇所は両方とも全く一緒です。 データは入れてあります。 宜しくお願いいたします。 全文は書けなかったので <?php require_once("dbini.php"); $con = mysql_connect($DBSERVER, $DBUSER, $DBPASSWORD); $selectdb = mysql_select_db($DBNAME, $con); $sql =" select * from mem order by rupdate desc limit 3" ; $rst = mysql_query($sql, $con); $recmax = mysql_num_rows($rst); $body = "<B>$recmax 件のデータがみつかりました。</B>"; $body .= "<TABLE border='1' cellpadding='2' cellspacing='0'> <TR> <TH bgcolor='#00CCCC'>会員ID</TH> <TH bgcolor='#00CCCC'>会員名</TH> <TH bgcolor='#00CCCC'>性別</TH> <TH bgcolor='#00CCCC'>ジャンル</TH> <TR>\n"; while($col = mysql_fetch_array($rst)) { $body .= "<TR>\n"; $body .= "<TD>" . $col["id"] . "</TD>\n"; $body .= "<TD>" . $col["name"] . "</TD>\n"; $body .= "<TD>" . $col"seibetu"] . "</TD>\n"; $body .= "<TD>" . $col["cate"] . "</TD>\n"; $body .= "</TR>\n"; } $body .= "</TABLE>\n"; mysql_free_result($rst); $con = mysql_close($con); ?> 以下 <?= $body ?> を貼り付けています

    • ベストアンサー
    • PHP
  • PHPでMySQLのデータを検索したい

    お世話になります。 PHPでMySQLのデータを検索したいと思い、 以下のようにしてみたのですがうまく表示されません。 -- $name = $_POST["name"]; $link = mysql_connect('localhost', '', ''); $db_selected = mysql_select_db('', $link); mysql_set_charset('utf8'); $sql = "SELECT * FROM search WHERE". $name; $result = mysql_query($sql); while($row = mysql_fetch_array($name)) { print $row['name']; } $close_flag = mysql_close($link); -- どう改善すればいいのでしょうか? 初心者の為、少々お見苦しい点があるかと思いますが どうぞよろしくお願いします。

    • ベストアンサー
    • PHP
  • DBから取得したデーター+配列データーの受取り

    (過去に似たような質問をしたのですが、その続きの質問です。) よろしくお願いします。 ※セッションID(以下(3)のDBのカラム(ssid)で使用)を 発行した状態で以下を行いたいのですが、(3)がうまくいきません。 (1)商品リストのDBを以下のように作り -------------------------------------------- (テーブル:products) product_id | product_cd | name | price 1 | 10 | 本01   | 1300 2 | 11 | 本02     | 1200 3 | 20 | サプリ01    | 4800 4 | 30  | ストレッチボード | 9800 5 | 30 | 健康シューズ   | 6800 -------------------------------------------- (2)上記をmysql_fetch_arrayで取り出し<table>を作成。 その際に、商品選択をする(checkbox)と(数量)を入力する<input> を加え<form>でkaimonoKago.phpへ送信します。 (products.php) <?php (途中省略) mysql_query("set names utf8"); $sql = "select * from products "; $result = mysql_query($sql) ; ?> <form method="post" action="kaimonoKago.php"> <table> <tr> <th></th> <th>商品コード</th> <th>商品名</th> <th>価格(税込</th> <th>数量</th> </tr> <?php while($row = mysql_fetch_array($result)){ print "<tr>\n"; print "<th><input type=\"checkbox\" name=\"check[]\" value=\"".$row["product_id"]."\"></th>\n"; print "<td>".htmlspecialchars($row["product_cd"])."</td>\n"; print "<td>".htmlspecialchars($row["product_name"])."</td>\n"; print "<td>&yen;".number_format($row["price_intax"])."</td>\n"; print "<td><input type=\"text\" name=\"kazu[".$row["product_id"]."]\" size=\"3\"></td>\n"; print "<input type=\"hidden\" name=\"ssid\" value=\"".$_SESSION['ssid']."\" />\n"; print "</tr>\n"; } ?> <input type="submit" name="order" value="注文" /> </form> (3)<form>で送られてきた情報を、買い物カゴDB ----------------------------------------------- (テーブル名:kaimonoKago) (カラム: ssid, product_cd, product_name, price_intax, kazu, shoukei) ----------------------------------------------- にインサートしたいのですが、うまくいきません。正しい記述を教えて下さい。 mysql_fetch_arrayやらwhile文やら配列が2つあったりして、どのように組み立てたら いいのか、基本的な考え方も教えていただければ幸いです。 (自分がつくった、うまくいかないコード)    ↓ (kaimonoKago.php) $check=(isset($_REQUEST["check"]) and is_array($_REQUEST["check"]))?$_REQUEST["check"]:array(); $kazu=(isset($_REQUEST["kazu"]) and is_array($_REQUEST["kazu"]))?$_REQUEST["kazu"]:array(); foreach($check as $val){ if($kazu[$val]>0){ $sql = "select * from products where product_id ='" . mysql_real_escape_string($val) . "'"; $result = mysql_query($sql); while($products = mysql_fetch_array($result)){ $product_cd = $products['product_cd']; $product_name = $products['product_name']; $price_intax = $products['price_intax']; $kazu = $kazu[$val]; $shoukei = $price_intax * $kazu; $sql = "insert into kaimonoKago ( ssid, product_cd, product_name, price_intax, kazu, shoukei ) values ( '" . mysql_real_escape_string ( $_SESSION['ssid'] ) . "', '" . mysql_real_escape_string ( $product_cd ) . "', '" . mysql_real_escape_string ( $product_name ) . "', '" . mysql_real_escape_string ( $price_intax ) . "', '" . mysql_real_escape_string ( $kazu ) . "', '" . mysql_real_escape_string ( $shoukei ) . "' )"; mysql_query($sql); } } } } よろしくお願いします。

    • ベストアンサー
    • PHP
  • mysqlへのデータ追加について

    以下を実行すると”失敗しました”が表示されます。 $q1~$q5にはtest.html(FORM)からから受け取った(POST),2ビット文字を含む100文字未満が格納されています。(POSTの受け渡しテスト部分で受け渡しの成功は確認) それをmysqlのテーブルに格納したいのですが,そこがうまくいきません。 mysqlのdataテーブルにはq1~q5のフィールドがあり,すべてtext(200)です。本やネットで調べていますが原因がよくわかりません。 mysql_query($sql, $con)の書き方がおかしいのでしょうか。 どなたかご教授下さい。よろしくお願いします。 <?php $q1 = $_POST['q1']; $q2 = $_POST['q2']; $q3 = $_POST['q3']; $q4 = $_POST['q4']; $q5 = $_POST['q5']; /*POSTの確認 $body = $q1; $body .= $q2; $body .= $q3; $body .= $q4; $body .= $q5; print $body; */ require_once("dbini.php"); $con = mysql_connect($DBSERVER, $DBUSER, $DBPASS); mysql_query("SET_NAMES 'sjis'"); $selectdb = mysql_select_db($DBNAME, $con); $sql = "insert into data (q1, q2, q3, q4, q5) values ($q1, $q2, $q3, $q4, $q5)"; $rst = mysql_query($sql, $con); if($rst){ print $q1."<br>"; print $q2."<br>"; print $q3."<br>"; print $q4."<br>"; print $q5."<br>"; print "上記の内容で登録しました。"; }else{ print "失敗しました。";} $con = mysql_close($con); ?>

    • ベストアンサー
    • PHP
  • MYSQLからデータを取り出して表示したい

    度々お世話になります。解説書を見ながらMySQLのデータを取り出して表示させようとしているのですが、理解に苦労しています。その本のやり方は以下の通りです。 *サーバ接続済み *データベース選択済み *使用するテーブル名:joke *使用するコラム:joketext $result = @mysql_query('SELECT joketext FROM joke'); if (!$result) { exit('<p>Error performing query: ' . mysql_error() . '</p>'); } while ($row = mysql_fetch_array($result)) { echo '<p>' . $row['joketext'] . '</p>'; } 1.$resultの中にはTURE/FALSE以外に何か入っているのでしょうか?多分データベースのデータがストックされていくのだと思うのですが、この変数には二種類のデータ(true/falseと実際のデータ)が入っているという解釈でよろしいでしょうか? 2.mysql_fetch_arrayですが、これが6行目でやっていることは、$resultからデータを取り出して行に配列していくということでよろしいでしょうか? 3.完全に解らないのは、$row['joketext']の部分で、いったいぜんたいこれは何をやっているんでしょうか?変数の後に[ ]が出てくるパターンはこの本では初めてなのですが、解説されていません。 4.echo '<p>' . $row['joketext'] . '</p>'; の部分で、このピリオドはどういった役割をしているのでしょうか?これも本では初めて出てくるのですが、解説されていなくて困っています。 たくさんの質問になりますが、ひとつでも解る方おられましたら、どうぞよろしくお願いします。

    • ベストアンサー
    • PHP
スマホから印刷がしたい
このQ&Aのポイント
  • スマートフォンから印刷する方法やトラブル解決法についてお知らせします。
  • MFC-J955DNを使用してスマートフォンから無線LANで印刷する方法をご紹介します。
  • iOSの場合、バッファローのWi-Fiルーターを使用して無線LAN接続で印刷できます。光回線を使用している場合も問題ありません。
回答を見る