• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:phpプルダウン検索でmysqlのデータ表示)

phpプルダウン検索でmysqlのデータ表示

このQ&Aのポイント
  • プルダウン検索でmysqlのデータを表示する方法について困っています。
  • phpでmysqlからデータを検索し、プルダウンで選択したデータを表示したいですがうまく動作しません。
  • 2つのプルダウンを追加した場合にデータが表示されない問題が発生しています。どう組み立てれば良いかわかりません。

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

  • ベストアンサー
noname#244856
noname#244856
回答No.3

んー動作上は特に問題はないのですが、よりよいコーディングのためにあえてダメ出しをすると、 prepare → bindParam → execute(引数なし) よりも prepare → execute(引数あり) の方がいいと思います。 前者の方法であれば提示されたコードのように書くのが一般的かもしれませんが、こう書くと同じものに対して2回条件判定が必要になりますよね?後者の方法であれば(URL参照先でもコードを提示していますが)1回だけで済むので、無駄なコードが減ると思います。なお、後者を採用できるのはバインドする型が全て「テキスト」である場合のみで、「整数」「バイナリデータ」等bindParamでの型指定が必要になる場合は前者を選択するしかありません。 特別な理由が無い限りはbindParamではなくbindValueを使いましょう。前者は参照渡し、後者は値渡しです。 joinはimplodeのエイリアス扱いなので、どちらかといえばimplodeと書く方が一般的でしょう。 文字列比較について、$varが文字列型であると確定している場合は $var != '' でも $var !== '' でも差はないのですが、可能であれば後者のように「厳密な比較」で書く癖をつけておきましょう。前者のような「緩やかな比較」はいろいろと弊害を引き起こす可能性があるので、使いどころを選びましょう。 http://php.net/manual/ja/types.comparisons.php [問題のある例] '2000' === '2e3' → False '2000' == '2e3' → True 気になった点はこのぐらいでしょうか。

eeiina
質問者

お礼

今回はテキストのみだったのでexecuteに引数を渡す形でできました。 bindParamとbindValue違いやjoinとimplodeの違いなど 細かな点を教えていただき感謝しております。 それぞれについて意味を理解しながら勉強したいと思います。 ありがとうございました。

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

その他の回答 (2)

noname#244856
noname#244856
回答No.2

$_SERVER['PHP_SELF']をそのようにechoするとXSS脆弱性が発生します。絶対にやめてください。 http://itpro.nikkeibp.co.jp/article/COLUMN/20070227/263356/ <form method="POST" action="<?=basename($_SERVER['SCRIPT_NAME'])?>"> とするか、いっそのこと <form method="POST" action=""> でもいいと思いますよ。 Taiyonoshizukuさんがおっしゃるように、「全て」の場合はプレースホルダを、というかSQL文自体を変形させる必要があるので、そこを工夫してみましょう。 PHPでデータベースに接続するときのまとめ http://qiita.com/mpyw/items/b00b72c5c95aac573b71 汎用的な変数構造フィルタリング関数(プレースホルダの動的増減はこちらで説明してます) http://qiita.com/mpyw/items/c39b9ee695a5c2e74627

eeiina
質問者

お礼

ありがとうございます。参照先を拝見させていただき大変参考になりました。 おかげさまで目的通りに動きました。 ただひとつ気になったところが下記の●の箇所 try{ $db = new PDO('mysql:host=localhost;dbname=testusr;charset=utf8','usrname','usrpass'); $query = 'SELECT * FROM fruits'; $wheres = array(); if($color != ''){$wheres[] = 'color = :color';} if($fruits != ''){$wheres[] = 'fruits = :fruits';} $where = join(' and ',$wheres); if($where != ''){$query.=" WHERE $where";} $stt = $db->prepare($query); ●if($color != ''){$stt->bindParam(':color', $color);} ●if($fruits != ''){$stt->bindParam(':fruits', $fruits);} $stt->execute(); }catch(PDOException $e){ die('エラーメッセージ:'.$e->getMessage()); } バインドの部分ですが、ここでもif文を使いました、 このような書き方でも問題ありませんでしょうか?もっと正しい方法があるのでしょうか? よろしければよろしくお願いします。

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

>(1)上のようにプルダウンが1つの場合は表示できるのですが、2つに増やした場合にうまく動きません。 うまくいかないとはどうなるの? うまく行った場合は→ うなく行かない→ 補足して。 (2)「全て」を選択した場合に全て表示したいのですが、何も表示されません。 全てを表示したいなら絞り込むための条件を入れちゃダメだよね? 今のままだと最終的なSQLは select * from fruits where color='' ってSQLが出来るよね? 実際全てを取ってくるSQLは select * from fruits だよね。 これで何か思いつかない?

eeiina
質問者

お礼

うまくいく:選択なし・片方選択・両方選択で表示される うまくいかない:両方選択した場合でないと表示されない ということでした。 >全てを表示したいなら絞り込むための条件を入れちゃダメだよね? 言われてみればまったくその通りです。 今の状態だとどんなSQLができるのかをよく考えてみます。 ありがとうございます!

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

関連するQ&A

  • プルダウンとphp+mysqlに関して

    初心者です。教えてください。現在、mysqlのAというテーブルlから持ってきたデータをプルダウンで表示させて、選択したものをmysqlの別テーブルに入力するプログラムをphpで作成しています。ただ、mysqlでAというテーブルからデータは取れているようですが、うまく表示されません。教えていただけるでしょうか? 下記のソースになります。うまくいっていない部分にコメントしています。 <?php //設定 require_once('config.php'); require_once('function.php'); connectDb(); @mysql_query('SET NAMES utf8'); ?> <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 <head> <meta http-equiv="Content-Type" content="text/html; charset=EUC-JP" /> <body> <h1>作成</h1> <form action= "kakunin.php" METHOD="post"> <p>日時:<input type="datetime" name="nitizi"></p> <p>年:<input type="text" maxlength="4" name="toshi"></p> <p><label>項目:<textarea name="question" cols="100" ></textarea></label></p> -----------------ここからがうまくいっていません。--------------- <p><label>分類</label> <?php $rs = mysql_query("SELECT * FROM bunrui_table"); $row = mysql_fetch_array($rs); if(!$rs){ die('取得できませんでした'.mysql_error()); } print '<SELECT NAME="mb">'; while($row=mysql_fetch_array($rs)){ print('<p>'); print("<option value=".$row['b_id'].">"); print("</option>"); print('</p>'); } print '</SELECT>'; ?> ーーーーーーーーーーーーーーーーーーーーーーここまでーーーーーーーーーー </p> <p>A <input name="n_a" type="text" size="50"></p> <p>B <input name="n_b" type="text" size="50"></p> <p>C <input name="n_c" type="text" size="50"></p> <p>D <input name="n_d" type="text" size="50"></p> <p> <label for="s">hantei</label> <select name="s" > <option value="1">A</option> <option value="2" >B</option> <option value="3">C</option> <option value="4">D</option> </select> </p> <label>解説<textarea name="k" cols="100" ></textarea> <br></label> <br> <input type="submit" value = "入力"> <input type="reset" value="reset"> </form> </body> </html>

    • ベストアンサー
    • PHP
  • MySQLを反映させたプルダウンメニューについて

    『MySQLデータベースのテーブル』 ID、品名、色(1)、色(2)、色(3)、… (例:1、”靴下”、”白”、”赤”) 『PHP文』 <?php … $result = "select * from テーブル名 where name= \"靴下\""; print "<form method = POST action=「出力先」>"; print "<select name=color>"; $data = mysql_fetch_row($result); foreach($data as $key => $val){ if ($key>1 and $val !=null){ echo "<option value = '".$key."'>".$val."</option>"; } } …以下… ?>) 「ユーザーに品名をまずは選んでもらい、次にその品の色を選んでもらう」 というプログラムを組みたくて… ただし、品により色が多かったり少なかったりするため、 MYSQLから対応する色名を引き出してきてプルダウンに反映させる というような上記の方法をとりました。 ここで問題が発生… 次のページに選んでもらった色名のキー($key)が$_POST["color"]では受け取れていないのです。 form、select、input文、などを確かめましたが、ここに誤りはないようです。 プルダウンメニューが表示され、ページも飛ぶのですが、単純にPOST引き渡しができていないようなのです。 非常に困っております(泣) どなたかお詳しい方がいらっしゃいましたら、アドバイスをいただけませんでしょうか。 宜しくお願いします。

    • ベストアンサー
    • PHP
  • プルダウンを連動した際のPOST処理に関して

    プルダウンを連動した際のPOST処理に関して 初歩的な事で申し訳ありませんが、教えて下さい。 今現在、過去にも質問として登録されていた下記のソースに対し、自身で修正を加えて 記述をしております。 その中で、以下の連動したものの中で、プルダウンより選ばれたものをボタンで別ページ へPOSTしたいと考えております。 下の記述の場合、from の POST へは、既に自分を再読込みという記述がされていて、 ボタンを作成し、POST で飛ばす事ができません。。。 したの登録ボタンで別画面へ遷移するにはどのような方法があるでしょうか。。。 教えて下さい。 《内容》 <?php //DB接続 $dbcon=mysql_connect("localhost","abcd","defg"); //DB選択 mysql_select_db("zozozo"); ?> <html> <body> <form method="post" name="frm" action="a.php"> <select name="mkoumoku" onChange="submit()"> <?php $slctd = ((!isset($_POST['mkoumoku']) Or $_POST['mkoumoku'] == "none")?" selected":""); echo '<option value="none"'.$slctd.'>-------------</option>'."\n"; //table1を取得 $res=mysql_query("select distinct * from table1"); while ($rows=mysql_fetch_array($res)) { $slctd = (($_POST['mkoumoku'] == $rows['id'])?" selected":""); echo '<option value="'.$rows['id'].'"'.$slctd.'>'.$rows['kind'].'</option>'."\n"; } echo "</select>"; ?> <select name="skoumoku"> <option value="none" selected>-------------</option> <?php //table1に連動して項目を変えたいところのコード $res1=mysql_query("select * from table2 where table2.key='{$_POST['mkoumoku']}' order by id"); while ($rows=mysql_fetch_array($res1)) { echo '<option value="'.$rows['id'].'">'.$rows['name'].'</option>'."\n"; } echo "</select>"; //Dbクローズ mysql_close($dbcon); ?> <input type="submit" value="登録"> </form> </body> </html>

  • PHP プルダウンメニュー MYSQL

    PHPを習い始めているのですがどうしても分からない問題が出てきました。 プルダウンメニューを作成し、その中の項目を選択すると検索ボタンをお押さずに別のページにとび、選択項目の必要情報(全件情報)をページが切り替わったと同時にMYSQLから吐き出したいのですが、どうしてもやり方が分かりません。  色々と調べていたらjavascriptを使い検索ボタンを押さずに、 プルダウンから項目を選んだだけでページは切り替わることは出来たのですが、その次の工程にしているページが切り替わったと同時に選択項目の 必要情報を画面に出力する方法が分かりません、、 下にあるスクリプトでプルダウンから直接違うページに飛ばしており、 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml"> <head> <meta http-equiv="Content-Type" content="text/html; charset=Shift_JIS" /> <SCRIPT LANGUAGE="JavaScript"><!-- function Jump() { tu = document.f.elements['jumpto'].options[document.f.elements['jumpto'].selectedIndex].value if( tu != '-' ) { location.href = tu; } else { alert('移動先を選択して下さい。'); } } // --></SCRIPT> <FORM NAME="f"> <SELECT NAME="jumpto" onChange="Jump();"> <OPTION VALUE="-" SELECTED>移動先を選択</OPTION> <option value="page1.php" >aaa</option> <option value="page2.php" >bbb</option> <option value="page3.php">ccc</option> <option value="page.php">ddd</option> </SELECT> </FORM> 例えばpage1.phpに飛んで、ページが切り替わったと同時に 全件情報を出力したいのですが どのたかお分かりになるかたが いましたら是非お伺い出来ませんでしょうか? 宜しくお願い致します。

    • ベストアンサー
    • PHP
  • PHP・MySQL・javascriptを用いたセレクトボックスによる絞込み検索

    はじめまして!現在PHPを勉強し始めた初心者なのですが、PHP・MySQL・javascriptを用いて、検索機能を実現させたいと思い思考錯誤しているのですが、やりたいことができず、困っております。 やりたいことというのは、MySQLに商品テーブルが存在し、材質やサイズなどのフィールドをいくつか設けているのですが、セレクトボックスを5つ配置し、それぞれのセレクトボックスを選んでいくと他のセレクトボックスが連動して絞り込まれていき、5つ全て選んだ時に1つの商品がヒットするというものを作りたいのです。 一つ目のセレクトボックスからポストされた値を次のセレクトボックスのクエリのwhere句の条件として絞り込んで二つ目を表示させることはできたのですが、三つ目以降どうしていいかわかりません>< 初心者なので、詳しく解説して頂ければ幸いです。 どうか宜しくお願いいたします。 現在製作中のソースですは下記をご参照下さい。 <?php //MySQLクラスファイルの取り込み require_once("mysql.php"); //MySQLクラスファイルの取り込み $mysql = new MySQL; //ポストされた値を変数に格納 $category = $_POST["category"]; $syo_code = $_POST["syo_code"]; ?> <html> <head> <body> <form action="jon2.php" method="post"> <!--jon2.phpは現在のページの名前です--> <select name="category" onChange="this.form.submit()"> <option value="">-------------</option> <? $query = "select * from category"; $result = $mysql->query($query); while ($rows = $mysql->fetch($result)) { ?> <option value="<?=$rows["category_id"]?>"><?=$rows["category"]?></option> <? }//while終わり ?> </select><br /> <select name="syo_code"> <option value="">-------------</option> <? $query = "select syo_code from syohin where category_id=$category"; $result = $mysql->query($query); while ($rows = $mysql->fetch($result)) { ?> <option value="<?=$rows["syo_code"]?>"><?=$rows["syo_code"]?></option> <? }//while終わり ?> </select> </body> </head> </html>

    • 締切済み
    • 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
  • プルダウンの値をphpファイルへ渡したい

    いつもお世話になっております。 現在、作成中のHPですが、データ取得をphpで行い表示をしています。 (1)a.phpでプルダウンのデータを取得し、b.phpで表示。 (2)b.phpでプルダウンを選択し、その値をtest.phpへ渡す。 (2)で、プルダウンの値を渡す処理がどうしてもうまくできず、 とても困っています。 どこを修正すればよいのかご教授願いたいのですが・・・。 スクリプトは下記の通りです。 ------------------------------------------------------- 【b.php】 <html> <head> <title>テスト</title> </head> <body> <SCRIPT language="JavaScript"> function testphp(){ try{ with(document.testform){ action="http://test/test.php"; test.value = testform.testselect[testform.testselect.selectedindex].value; method="POST"; submit(); } } catch(e) { alert("エラーは " + e.description + " です。"); } } </SCRIPT> <form name="testform" onchange="testphp()"> <select name="testselect"> <option value="あ">結果1</option> <option value="い">結果2</option> <option value="う">結果3</option> <option value="え">結果4</option> <option value="お">結果5</option> </select> </form> </body> </html> 【test.php】 <?php //変数処理 $a = @$_POST["test"]; print "渡された値:".$a; exit; ?> ------------------------------------------------- どうぞ、宜しくお願い致します。

  • MySQLのデータを使ってプルダウンの値を動的に変更したい

    以下の授業プルダウンですが、 任意の授業が選択されたときに、 その授業の内容を大分類の下の中分類(middle_class)をDBで検索して、次の中分類プルダウンの変数に渡したいのですが、当然のごとくでき ません。 大分類で画面遷移して中分類の画面へというように、何回も検索画面 を分けるのならいいのですが。何度も処理をする必要があるので、 絶対に画面遷移しない。orしているように見えないようにしたいです。 下記サイト一番役立つかなぁと思いましたが、マスターデータはDBから検索させたい。 Javascriptsに直書きは、メンテナンスが難しい。 http://www.cc.kyoto-su.ac.jp/~ushitaki/JavaScriptExample/introselect2.html <SCRIPT LANGUAGE="JavaScript"> <!--- function getcategory(){ ckind=document.category.top.selectedIndex; cvalue=document.category.top.options[ckind].value; <?php if( $_REQUEST['$top']){ $MySQL['HOST'] = '127.0.0.1'; $MySQL['USER'] = 'root'; $MySQL['PASSWORD'] = '********'; $MySQL['DATABASE'] = 'category'; $MySQL['conn'] = @mysql_connect($MySQL['HOST'],$MySQL['USER'],$MySQL['PASSWORD']) or exit('Can not access MySQL DB'); mysql_select_db($MySQL['DATABASE'], $MySQL['conn']); $MySQL['query'] = "set names sjis"; $MySQL['result'] = mysql_query($MySQL['query'], $MySQL['conn']); $MySQL['query'] = "SELECT middle_class_code, middle_class_name FROM middle_class where top_class_code = ".$_REQUEST['$top'].""; $MySQL['result'] = mysql_query( $MySQL['query'],$MySQL['conn'] ); $count = 0; while($table4[$count] = mysql_fetch_array($MySQL['result'], MYSQL_NUM)) { $table3[$count] = $table4[$count]; $count = $count + 1; } if(cvalue==$top){ for($i = 0; $i < $count; $i++ ){ print("document.parts_category.middle.options[".$i."].text=".$table3[$i][1].";"); print("document.parts_category.middle.options[".$i."].value=".$table3[$i][0].";"); } } } ?> } //---> </SCRIPT> </HEAD> <BODY LANG="ja-JP" TEXT="#0066cc" LINK="#cc0033" VLINK="#ff9900" BGCOLOR="#ffffff" DIR="LTR"> <TABLE WIDTH=1072 BORDER=1 CELLPADDING=2 CELLSPACING=0 STYLE="page-break-before: always"> <COL WIDTH=531> <COL WIDTH=531> <TR> <TD WIDTH=531 HEIGHT=25> <P> 授業別クラス </P> </TD> <TD ROWSPAN=7 WIDTH=531> <P><BR> </P> </TD> </TR> <TR> <TD WIDTH=531 HEIGHT=20> <P>授業検索</P> </TD> </TR> <TR> <TD WIDTH=531 HEIGHT=20> <FORM NAME="category"> <P><FONT SIZE=2 STYLE="font-size: 9pt">大分類 <SELECT NAME="$top" STYLE="width: 2.43cm; height: 0.56cm" onChange="this.form.submit()"> <OPTION VALUE="x">大分類 <OPTION VALUE="MATH">数学 <OPTION VALUE="JAPE">国語 <OPTION VALUE="JAPH">日本史 <OPTION VALUE="CHEM">化学 <OPTION VALUE="PHYS">物理 <OPTION VALUE="FORL">外国語 <OPTION VALUE="WORH">世界史 </OPTION> </SELECT></FONT></P> </TD> </TR> <TR> <TD WIDTH=531> <P><FONT SIZE=2 STYLE="font-size: 9pt">中分類 <SELECT NAME="middle" STYLE="width: 4.52cm; height: 0.56cm" ONCHANGE="getparts()"> <OPTION VALUE="x" SELECTED>まず大分類を選んでください <OPTION VALUE="x"> <OPTION VALUE="x"> <OPTION VALUE="x"> <OPTION VALUE="x"> <OPTION VALUE="x"> <OPTION VALUE="x"> <OPTION VALUE="x"> <OPTION VALUE="x"> <OPTION VALUE="x"> <OPTION VALUE="x"> <OPTION VALUE="x"> <OPTION VALUE="x"></OPTION> </SELECT></FONT></P> </TD> </TR> <TR> <TD WIDTH=531> <P><INPUT TYPE=SUBMIT VALUE="検索" STYLE="width: 1.08cm; height: 0.58cm"></FORM> </P> </TD> </TR> </TABLE>

    • 締切済み
    • PHP
  • mysqlからphpに表示ですべての項目を出したい

    phpとmysqlの勉強をしているのですが、出したい項目がでてきてくれません。 今mysqlでidとnameとpriceの項目を作っているのですが、以下だとどうしてもnameしか出てきてくれません。 どうすれば3つの項目がでてくれますでしょうか? よろしくお願いします。 <?     mysql_connect('localhost' , 'root' , '') or die(mysql_error());     mysql_select_db('db1'); mysql_query('SET NAMES UTF8'); $sql="SELECT * FROM syouhin"; $res=mysql_query($sql); $options=""; while($row = mysql_fetch_array($res,MYSQL_ASSOC)){ $options.="<input type=\"radio\" name=\"syouhin1\" value='{$row['id']}' checked>        {$row['name']}\n<br>"; } $select="{$options}</select>\n";     print $select; ?>

    • ベストアンサー
    • PHP
  • PHPについて

    PHP初心者です。 ロリポップで登録したPHPMyadminでユーザー名やパスワード等を入力する表を作成しています。 更新又は削除ボタンが押されたときにこういう処理をする、という命令を出すページで躓いています。 <?php $db = new PDO('mysql:host=●●;dbname=●●;charset=utf8', '●●', '●●'); try { if (isset($_POST['update'])) { $stt = $db->prepare('UPDATE `date` SET sid=:sid, uid=:uid, name=:name, email=:email, passwd=:passwd WHERE sid=:sid'); $stt->bindValue(':sid', $_POST['sid']); $stt->bindValue(':uid', $_POST['uid']); $stt->bindValue(':name', $_POST['name']); $stt->bindValue(':email', $_POST['email']); $stt->bindValue(':passwd', $_POST['passwd']); } elseif (isset($_POST['delete'])) { $stt = $db->prepare('DELETE FROM `date` WHERE sid=:sid'); } $stt->bindValue(':sid', $_POST['sid']); $stt->execute(); } catch(PDOException $e) { die('エラーメッセージ'.$e->getMessage()); } header('Location:●●'); ?> 毎回どうしても $stt->bindValue(':sid', $_POST['sid']); Fatal error: Call to a member function bindValue() on a non-object というエラーが出てしまいます。 sidが存在していないのに要求しているのだと思うのですが、PHPMyAdminでsidというカラムはきちんと存在しています。 何が間違っているのでしょうか。 記入している内容にも間違いがあったらご指摘お願いします。 回答よろしくお願いします。

    • ベストアンサー
    • PHP