MYSQLで複数の値を検索して取得する方法

このQ&Aのポイント
  • MYSQLで複数の値を検索して取得する方法について教えてください。
  • $_POST['sample']から取得した複数の値を使って、dataから複数の検索結果を取得したいです。
  • 具体的な式やコードを教えていただけると助かります。
回答を見る
  • ベストアンサー

MYSQLで複数の値を検索して取得するには?

お世話になります。 MYSQLとPHPを見よう見まねでやっている超初心者です。 $_POST['sample']はチェックボックスから取得してきたので複数の値があります。 その複数の値をwhere data = $where";にしてdataから複数の検索結果を取得したいと思っているのですが、下記のように書くと複数ある$_POST['sample']の一つしか検索取得できません。 $_POST['sample']の複数の値の検索結果を取得するにはどうすればよろしいのでしょうか? 基本的な事がわかっていない超初心者ですので できれば具体的な式を教えて頂ければ大変助かります。 ご教授よろしくお願い致します。 if (isset($_POST['sample'])) { for ($i = 0; $i < count($_POST['sample']); $i++) { $where ='' . h($_POST['sample'][$i]) . ''; } } function h($string) { return htmlspecialchars($string, ENT_QUOTES); } ///// $sql = "select * from test where data = $where"; $result = mysql_query( $sql );

  • PHP
  • 回答数1
  • ありがとう数2

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

  • ベストアンサー
  • yambejp
  • ベストアンサー率51% (3827/7415)
回答No.1

PHPに同名のデータを渡したいならちょっとした工夫が必要 またmysqlへのデータ渡しするときはhtmlspecialcharsではなく mysql_real_escape_stringを使います。 whereの条件もINをつかうと便利です。 そのた踏まえて、こんな風にしてみては? <form method="post"> <input type="text" name="sample[]"><br> <input type="text" name="sample[]"><br> <input type="text" name="sample[]"><br> <input type="submit" value="go"><br> </form> <?PHP $where=""; if (isset($_POST['sample']) and is_array($_POST['sample'])) { $where .=" AND data in ("; foreach ($_POST['sample'] as $key=>$val) { if($key>0) $where .=","; $where .="'" .mysql_real_escape_string($val) . "'"; } $where .=")"; } $sql = "select * from test"; $sql .= " where 1"; $sql .= $where; print $sql; ?>

chikomaru
質問者

お礼

ご回答ありがとうございます。 ご教授頂いたとおりに、あてはめて やってみたら見事に上手くいました! 私には到底できないレベルです。 拙い質問の意味を理解していただき、 丁寧なご回答を頂いて大変助かりました。 たいへんお世話になりました。心より感謝申し上げます 本当にありがとうございます!

関連するQ&A

  • mysqlのinsert文について、ご指導をお願いいたします。

    はじめまして。 プログラミング初心者です。 現在、PHP&MySQLで会員制掲示板を制作しようと奮闘しております。 会員登録フォームを作成し、下記SQL文にて会員登録を行おうとしているのですが、「エラーは出ていないのに、DBにデータが登録されない。」状況で、なにがおかしいのかわからず非常に困っております。尚、DBには正常に接続されています。 環境はVISTAにXAMPPを入れております。 私、PHP初心者のため、本のサンプルソースを加工して使用しようとしています。 下記にソースを記載いたしますので、 どうかご指導のほどお願いいたします。 (※情報が不足しておりましたら申し訳ありません。必要な情報をお教えいただけましたら幸いです。) // 接続 $link = mysql_connect( $db_host, $db_user, $db_password ); mysql_select_db( $db_name ); $result = mysql_query( 'set character set utf8' ); $sql = "select email1 from users where email = '" . mysql_real_escape_string( $_POST['email'] ) . "'"; $result = mysql_query( $sql ); // if ( $error != '' ) exit; // 会員データの挿入 $sql = "insert into member ( login_id, passwd, register_date, nickname, sex, birthday, email, pref, division, state ) values ( '" . mysql_real_escape_string( $_POST['email'] ) . "', '" . md5( $_POST['passwd'] ) . "', '" . date( 'Y-m-d H:i:s' ) . "', '" . mysql_real_escape_string( $_POST['nickname'] ) . "', '" . mysql_real_escape_string( $_POST['sex'] ) . "', '" . mysql_real_escape_string( $_POST['year'] . '-' . $_POST['month'] . '-' . $_POST['day'] . ' 00:00:00' ) . "', '" . mysql_real_escape_string( $_POST['email'] ) . "', '" . mysql_real_escape_string( $_POST['pref'] ) . "', '" . mysql_real_escape_string( $_POST['division'] ) . "', '1' )"; $result = mysql_query( $sql ); //echo $sql; // $title = '会員登録[3/4]'; ?>

    • ベストアンサー
    • PHP
  • php+MySqlでの検索結果について

    以下のソースで検索結果が表示されるのですが、検索結果が多数ある場合、例えば10件ずつ表示して「次へ」「前へ戻る」「最終頁」等のリンクを貼る方法が分かりません。 また、検索結果から並べ替え(データの更新日時等から)も出来ればと思い質問させていただきました。 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "ttp://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" /> <title>検索</title> </head> <body> <?php # 入力値に不正なデータがないかなどをチェック。 function checkInput($var) { if (is_array($var)) { return array_map('checkInput', $var); } else { if (get_magic_quotes_gpc()) { // magic_quotes_gpc対策 $var = stripslashes($var); } if (preg_match('/\0/', $var)) { // NULLバイト攻撃対策 die('不正な入力です。'); } if (!mb_check_encoding($var, 'UTF-8')) { // 文字エンコードの確認 die('不正な入力です。'); } return $var; } } function h($string) { // HTMLでのエスケープ処理をする return htmlspecialchars($string, ENT_QUOTES); } # POSTされたデータをチェック。 $_POST = checkInput($_POST); // データベース設定 $dbServer = 'localhost'; $dbUser = 'user'; $dbPass = 'password'; $dbName = 'sample'; $flag = TRUE; // MySQLデータベースに接続 if (!$link = mysql_connect($dbServer, $dbUser, $dbPass)) { $flag = FALSE; } // データベース選択 else if (!mysql_select_db($dbName, $link)) { $flag = FALSE; } // 文字エンコードの指定(PHP5以降かつMySQL 4.1以降) else if (!mysql_set_charset('utf8', $link)) { $flag = FALSE; } # $flagの値の判定 if ($flag === FALSE) { echo 'データベースエラー'; } else if (isset($_POST['data'])) { $data = $_POST['data']; $dataList = explode(' ', mb_convert_kana($data, 's')); $sql = 'SELECT * FROM search WHERE 1'; foreach ($dataList as $word) { if ($word == '') continue; $sql .= sprintf(" AND data LIKE '%s'", '%' . mysql_real_escape_string($word) . '%'); } echo '<p>SQL: ' . h($sql) . '</p>'; $query = mysql_query($sql, $link); if (!$query) { echo 'データベースエラー'; } else if (mysql_num_rows($query) == 0) { echo '<p>「' . h($data) . '」はデータベースに登録がありません。</p>'; } else { echo '<p>「' . h($data) . '」はデータベースに登録がありました。</p>'; echo '<p>検索結果</p>'; echo '<table border="1">'; echo ' <tr>'; echo ' <th>ID</th>'; echo ' <th>データ</th>'; echo ' </tr>'; while ($row = mysql_fetch_array($query, MYSQL_ASSOC)) { echo ' <tr>'; echo ' <td>' . h($row['id']) . '</td>'; echo ' <td>' . h($row['data']) . '</td>'; echo ' </tr>'; } echo '</table>'; } $sql = 'SELECT * FROM search'; $query = mysql_query($sql, $link); if (!$query) { echo 'データベースエラー'; } else { echo '<p>データベースの内容一覧</p>'; echo '<table border="1">'; echo ' <tr>'; echo ' <th>ID</th>'; echo ' <th>データ</th>'; echo ' </tr>'; while ($row = mysql_fetch_array($query, MYSQL_ASSOC)) { echo ' <tr>'; echo ' <td>' . h($row['id']) . '</td>'; echo ' <td>' . h($row['data']) . '</td>'; echo ' </tr>'; } echo '</table>'; } } ?> <form method="post" action=""> <p>検索ワードを入力して下さい</p> <input type="text" name="data" /> <input type="submit" value="検索する" /> </form> </body> </html> このソースのどの部分に記述してよいのか等も含めてご伝授頂きたく思います。 宜しくお願いします。

    • ベストアンサー
    • MySQL
  • phpとmysqlで「あいまい検索」をしたいです。

    phpとmysqlで「あいまい検索」をしようと思い、下記サイトを参考にしましたが、 http://d.hatena.ne.jp/akihito_sado/20120602/p1 PDOを使ってlikeデータを抜き出したい場合、bindParamを使うらしいですが、 http://rasukaru55.sitemix.jp/or_kensaku.php 下記の場合どう書き直すべきでしょうか? 打ち方が悪いのか、うまく作動しません。 教えてください。 ※bindParamを使えばSQLインジェクション対策になっていると言う事でしょうか? <html> <head></head> <body> <?php //POST送信されたデータを$text1へ $text1 =@$_POST["text1"]; //SQL(テーブルから列を抽出する $sql ="SELECT 列名 FROM 表名 "; //キーワードが入力されているときはwhere以下を組み立てる if (strlen($text1)>0){ //受け取ったキーワードの全角スペースを半角スペースに変換する $text2 = str_replace(" ", " ", $text1); //キーワードを空白で分割する $array = explode(" ",$text2); //分割された個々のキーワードをSQLの条件where句に反映する $where = "WHERE "; for($i = 0; $i <count($array);$i++){ $where .= "(列名 LIKE '%$array[$i]%')"; if ($i <count($array) -1){ $where .= " AND "; } } //別カラムも同じ検索したい $where2 = " OR "; for($i = 0; $i <count($array);$i++){ $where2 .= "(2列名 LIKE '%$array[$i]%')"; if ($i <count($array) -1){ $where2 .= " AND "; } } } ?> <form method="POST" action="<?php echo $_SERVER["PHP_SELF"]?>"> <table> <tr> <td><input type="text" name="text1"></td> <td><input type="submit" value="検索" name="sub1"></td> </tr> </table> </form> <?php //組み立てたSQL分を表示する echo "<p>組み立てたSQL分: ".$sql.@$where.@$where2; ?> </body> </html>

    • ベストアンサー
    • PHP
  • MySQLから取得した値をPHPを使って配列で渡す方法。

    MySQLから取得した値をPHPを使って配列で渡してグラフ表示させようとしているのですが、MySQLから取得した値をPHPを使って配列で渡す方法が全く分かりません。 プログラム初心者で、サンプルプログラムを組み合わせて、とりあえず下記のようなプログラムを書いてみたのですうまくいきません。 めちゃくちゃなプログラムでどこから手をつけていいかも分からないかもしれませんが、今週中に何とかしなくてはなりません。皆さんのお力をお借しください、お願いします。 データベースに接続し値を取得↓ <?php // データベースへの接続情報を設定します。 $db_user = "root"; $db_pass = "590312"; $db_host = "localhost"; $db_name = "zikokanrinote"; $id = $_REQUEST['id']; $day_s = $_REQUEST['day_s']; $day_e = $_REQUEST['day_e']; $study = $_REQUEST['study']; // MySQLとの接続を行います。 $db = mysql_connect($db_host, $db_user, $db_pass) or die("Cannot connect to database"); // クライアントのキャラクタセットをUTF-8に変更します。 mysql_query("SET NAMES utf8"); // データベースを選択します。 mysql_select_db($db_name) or die("Cannot select database"); if(!get_magic_quotes_gpc()){ $id = mysql_real_escape_string($id); $day_s = mysql_real_escape_string($day_s); $day_e = mysql_real_escape_string($day_e); $study = mysql_real_escape_string($study); } $sql = "select result FROM result where ((id='$id') and (date between '$day_s' and '$day_e') and (study_code='hakike'))"; // SQL文を実行します。 $result = mysql_query($sql) or die("Query failed"); // フィールドの数をカウントします。 $fcnt = mysql_num_fields($result); // カラム名の取り出しを行います。 // データの取り出しを行います。 // mysql_fetch_arrayは結果セットの行データを // 配列もしくはカラム名をキーにした連想配列で返します。 while($rows = mysql_fetch_array($result)) ?> グラフを表示させる↓ <? // Here's where we call the chart, and return the encoded chart data $test_data=array($rows); echo "<img src=http://chart.apis.google.com/chart?chtt=".urlencode("吐き気")."&cht=lc&chs=450x125&chd=".chart_data($test_data).">"; // Here's an array containing some data to plot // And here's the function function chart_data($values) { // Port of JavaScript from http://code.google.com/apis/chart/ // http://james.cridland.net/code // First, find the maximum value from the values given $maxValue = max($values); // A list of encoding characters to help later, as per Google's example $simpleEncoding = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789'; $chartData = "s:"; for ($i = 0; $i < count($values); $i++) { $currentValue = $values[$i]; if ($currentValue > -1) { $chartData.=substr($simpleEncoding,61*($currentValue/$maxValue),1); } else { $chartData.='_'; } } // Return the chart data - and let the Y axis to show the maximum value return $chartData."&chxt=y&chxl=0:|0|".$maxValue; } ?>

    • 締切済み
    • PHP
  • PHP+MySQLで複数のラジオボタンから値を取得

    初めまして。もしお力を貸していただけるならと思い質問させていただきます。 今、MySQLに登録したデータを修正できるようにするファイルを作成しておりまして、 IDを指定すれば、ラジオボタンに登録されているデータがcheckedされるようにしたいと 考えています。 【MySQL】 [hoge] id hogeA 0or1 hogeB 0or1 hogeC 0or1 【update.php】 <?php require ("../dbconnect.php"); $_REQUEST["id"] = 選択したIDの受け渡し; $id = $_REQUEST["id"]; $sql = sprintf ("SELECT * FROM hoge WHERE id=%d", mysql_real_escape_string ($id) ); $recordSet = mysql_query ($sql) or die (mysql_error()); $data = mysql_fetch_assoc ($recordSet); $checkedOK = null; $checkedNG = null; switch($data["hogeA"]){ case 0: $checkedOK = 'checked'; break; case 1: $checkedNG = 'checked'; } ?> <html> <head> <form method="post" id="updateForm" action="update.php" enctype="multipart/form-data"> <table> <tr> <th>hogeA</th> <td><label> <input type="radio" name="hogeA" id="hogeA01" class="style02" value="0" <?php echo (htmlspecialchars($checkedOK, ENT_QUOTES)); ?> /> OK</label> <label> <input type="radio" name="hogeA" id="hogeA02" class="style02" value="1" <?php echo (htmlspecialchars($checkedNG, ENT_QUOTES)); ?> /> NO</label></td> </tr> <tr> <th>hogeB</th> <td><label> <input type="radio" name="hogeB" id="hogeB01" class="style02" value="0" <?php echo (htmlspecialchars($checkedOK, ENT_QUOTES)); ?> /> OK</label> <label> <input type="radio" name="hogeB" id="hogeB02" class="style02" value="1" <?php echo (htmlspecialchars($checkedNG, ENT_QUOTES)); ?> /> NO</label></td> </tr> <tr> <th>hogeC</th> <td><label> <input type="radio" name="hogeC" id="hogeC01" class="style02" value="0" <?php echo (htmlspecialchars($checkedOK, ENT_QUOTES)); ?> /> OK</label> <label> <input type="radio" name="hogeC" id="hogeC02" class="style02" value="1" <?php echo (htmlspecialchars($checkedNG, ENT_QUOTES)); ?> /> NO</label></td> </tr> </head> </html> とした場合、当然ですがhogeA,hogeB,hogeCには同じ値が入ってしまいます。 hogeB,hogeCも同じ様にSWITCH文を書けば実装できると思うのですが、 foreach等を使って複数のラジオボタンを取得するいい方法があれば、 教えていただきたいです。 説明が不十分で申し訳ありません。もし快くお答えいただける方がいれば大変嬉しく思います。

    • 締切済み
    • PHP
  • array値を別のテーブルへインサートしたい。

    phpとmysqlを見よう見まねでやっている 初心者です。 atableのチェックボックスよりPOSTした $sample_array(atable.indexの値が複数です。) をbtableへ移動したいと思い、以下の式を自分なりに 考えてみましたが上手くbtableへinsert されません。 atableの複数のindexは選ばれているようですが それをどうしたらbtableへ複数insertできるのか良くわかりません。 何が間違っているのか、atableからbtableへ複数insertできる式を 具体的に書いて頂くと大変助かります。 どうかご教授の程よろしくお願い致します。 $sample_array = $_POST['sample_array']; $where=""; if (isset($sample_array) and is_array($sample_array)) { $where .=" AND atable.index in ("; foreach ($sample_array as $key=>$val) { if($key>0) $where .=","; $where .="'" .mysql_real_escape_string($val) . "'"; } $where .=")"; } $sql= "select * from atable"; $sql .= " where 1"; $sql .= $where; $result = mysql_query( $sql ); while ( $row = mysql_fetch_array( $result ) ) { $sql = "insert into btable (a_no,b_no,c_no) values ('" . $row['no_a'] . "', '" . $row['no_b'] . "','" . $row['no_c'] . "')"; }

    • ベストアンサー
    • PHP
  • PHP+MySQLでエスケープされたデータを格納したい。

    php.iniの設定でmagic_quotes_gpc = Offにして、 mysql_real_escape_stringで出力エスケープしたデータを MySQLに格納するとバックスラッシュが格納されない。 エスケープされたデータを格納したいです。 php.iniの設定 --------------------------------------------------------- ; Magic quotes for incoming GET/POST/Cookie data. ; magic_quotes_gpc = On magic_quotes_gpc = Off ; Magic quotes for runtime-generated data, e.g. data from SQL, from exec(), etc. magic_quotes_runtime = Off ; Use Sybase-style magic quotes (escape ' with '' instead of '). magic_quotes_sybase = Off --------------------------------------------------------- $_POST['us_fname']には「'user'」という文字列が格納されています。 --------------------------------------------------------- $clean['us_fname'] = $_POST['us_fname']; $mysql['us_fname'] = mysql_real_escape_string($clean['us_fname']); $sql = "insert into table ( us_fname ) values ( '".$mysql['us_fname']."', ) "; --------------------------------------------------------- echo $mysql['us_fname']; で確認すると「\"user\" 」となっているんですが、 MySQLの中を確認すると「'user'」のままでシングルクォートがエスケープされていません。

    • ベストアンサー
    • PHP
  • 配列の要素でmysqlに問い合わせ

    フォームから送信されたデータを配列として取得し、その配列の1つの要素に対してそれぞれmysqlにselectで問い合わせてageというカラムの値を取得したいと思っています。 配列の要素の数がその都度変わるので、要素が5つある場合には5回selectでデータベースに問い合わせてデータを5つ取得したいのですが、それは可能でしょうか? ためしに下記のようにしてみたのですが、うまく取得できませんでした。 $hairetu = $_POST; for($i=0; $i< count($hairetu) ; $i++){ $sql = "SELECT * FROM member where age = '$hairetu[i]';"; $res = mysql_query($sql, $conn) or die("エラー"); $row = mysql_fetch_array($res, MYSQL_ASSOC); $age = $row["age"]; echo $age; } $ageの値をcount($hairetu)の回数分表示したいのですが、どのように処理していいのか分かりません。 また、根本的におかしな点もあると思いますがよろしくお願いします。

    • ベストアンサー
    • MySQL
  • 複数の検索

    PHPとMYSQLをつかっています 会員情報から友達の名前を登録できるようにしました postで受け取った情報は友達の名前のみです 友達の名前から友達のID番号を取得したいのですが、15人分まとめて取得する方法はありますか? 調べるテーブルのカラムにはidとnameがあります(idとnameに重複はありません) htmlフォームは(input=text)が15個ほどあって、何も記入されていない欄もあります(fre3に書き込んであってfre2が空白の場合があります) $fre1 = $_POST['fre1']; $fre2 = $_POST['fre2']; $fre3 = $_POST['fre3'];    ・    ・    ・ $sql = sprintf("SELECT id FROM friend WHERE name LIKE '%s'",$fre1); $recordSet = mysql_query($sql); $data = mysql_fetch_assoc($recordSet);

    • ベストアンサー
    • MySQL
  • PHP・MYSQL キーワード検索について

    HPにキーワード検索を導入しようと思っているのですがどうもうまくいきません。 現在は下記のように記述しています POSTパラメータを取得 $word = $_POST['word']; //SQL文 $sql = 'SELECT * FROM `table` WHERE `word` LIKE \'%$word%\' LIMIT 0, 30 ';    ↑ ここに直接ワードを入力したら正常に検索できました。 ポストで受け取ったデータを何かに変換しないと検索できないのでしょうか? 宜しくお願いします。

    • ベストアンサー
    • PHP

専門家に質問してみよう