• 締切済み

phpを使用してweb上でデータベース検索

プログラミング初級者です。 phpのweb上でのデータベース検索プログラムを作りたいのですがうまく機能しません。 材料名を入力するとその材料を使用した料理名が出てきてその結果にリンクを張り詳細ページに飛ぶというものを作りたいのですが、検索プログラムの組み方が分かりません。データがすべて出てきてしまいます。 どうしたらよいのでしょうか。 データベース名:DB1 テーブル1:z_n(中身…材料コード.z_c、材料名.z_n) テーブル2:r_n(中身…料理コードr_c、料理名r_n) テーブル3:r_zn(中身…料理コード、材料コード、材料の量z_r、材料の単位z_t、人数z_n) <!DOCTYPE html> <?php if(empty($_POST)){ echo"処理終了"; exit;} session_start(); ?> ー省略ー <section> <h1>&nbsp;</h1> <article> 検索結果<br> <?php $dbtype="mysql"; $sv="localhost"; $dbname="DB1"; $user="kk"; $pass="himitu"; $dsn = "$dbtype:dbname=$dbname;host=$sv"; $conn = new PDO($dsn, $user, $pass); $seach = $_POST["seach_key"]; $sql = " SELECT * FROM z_n, r_zn,r_n where (z_n.z_c = r_zn.z_c) and (r_zn.r_cd = r_n.r_c);"; $stmt = $conn -> prepare($sql); $stmt -> execute(); while($row=$stmt->fetch()){ echo "<br>{$row["z_n"]}{$row["r_n"]}"; } ?> <?php } ?> ー省略ー select文があいまいで困っています。どうかよろしくお願いします

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

みんなの回答

noname#244856
noname#244856
回答No.2

3サイトにマルチポストですか(汗 もう解決されたようですが、一応参考リンク貼っておきます。PDOを使うならばマニュアルに加えて一度は目を通していただきたい記事です。 Qiita - PHPでデータベースに接続するときのまとめ http://qiita.com/mpyw/items/b00b72c5c95aac573b71

  • agunuz
  • ベストアンサー率65% (288/438)
回答No.1

(相互リンク) http://detail.chiebukuro.yahoo.co.jp/qa/question_detail/q14119841019 同じことしか書きません(というかこちらもコピペww) ---------------------------------------------------- prepareなのにプレースホルダがないと思ったら >select文があいまいで困っています。 とりあえず、どういうSQL文を実行したいのかがわかりません。入力するのは材料名の一部ですよね? select r_n.*, z_n.z_n from r_n left join r_zn on r_n.r_c = r_zn.r_c join z_n on r_zn.z_c = z_n.z_c where z_n.z_n like '%入力した材料名%'; といったSQL文をphpMyAdminででも投げて期待した結果セットが得られるかを試してください(phpスクリプトを書くのは「それから」です)。 なお、MySQLであればDSNにcharsetを含めるようにしてください。 http://www.php.net/manual/ja/ref.pdo-mysql.connection.php

関連するQ&A

  • phpとデータベース

    書籍のサンプルを実行しても表示されません pearのインストールが怪しいですが、どこを直せばいいかわかりません。 ご教授お願いいたします。 <HTML> <HEAD> <TITLE>PHPのテスト</TITLE> </HEAD> <BODY> <?php require_once("DB.php"); $dbUser = "sample"; // ユーザー名 $dbPass = "password"; // パスワード $dbHost = "localhost"; // ホスト名 $dbName = "sampledb"; // データベース名 $dbType = "mysql"; // データベースの種類 // MySQL="mysql", PostgreSQL="pgsql", MS SQL-Server="mssql", ODBC="odbc" などを設定 // 接続文字列の作成 $dsn = "$dbType://$dbUser:$dbPass@$dbHost/$dbName"; // データベースに接続 $conn = DB::connect($dsn); // 接続に失敗したらメッセージを表示して終了します。 if (DB::isError($conn)){ die($conn->getMessage()); } print('接続に成功しました。'); // データベースから切断します。 $conn->disconnect(); ?> </BODY> </HTML>

  • FormulaR1C1でSUMIF変数指定

    各項目毎の集計計算をしたいのですが 例 R1C1=項目区分1 R1C2.FormulaR1C1="=SUMIF(C3,""Zn"",C2)" のような計算式をセットしたい R2C1="" R2C2=2 R2C3=Z1 R3C1="" R3C2=3 R3C3=Z1 R4C1=項目区分2 R4C2.FormulaR1C1="=SUMIF(C3,""Zn"",C2)" のような計算式をセットしたい R5C1="" R5C2=4 R5C3=Z2 R6C1="" R6C2=5 R6C3=Z2 Cells(1,2).FormulaR1C1= "=SUMIF(C3,""Zn"",C2)" 但し Cells(1,2)のROW 部分は項目区分を入力したROWアドレスとなります。 上記部分の n部分を変数指定はできるのでしょうか? または Zn を変数指定はできるのでしょうか?この場合のZnは数値となります。 理由 区分の範囲が不特定の為(追加削除がある) 項目区分名のカラム2に計算式をセットしておきたい どうかご教授をお願いいたします。

  • PHPの書き方について

    PHPを独学で勉強中で、気になったことがあるので質問させていただきます。 最初に買った書籍とその次に買った書籍で書き方が違うところがあるので、普通はどちらでやるのか、また、使い分けがあるのかが知りたいです。 たとえば、データベースを1行ずつ取り出す処理で、1冊目では $pdo = new PDO($dnsinfo,$USER,$PW); $sql = "SELECT * FROM ○○"; $stmt = $pdo->prepare($sql); $stmt->execute(null); $res = ""; while($row = $stmt->fetch(PDO::FETCH_ASSOC)){ $res .= $row['△△'] ."," .$row['□□'] ."<br>\n"; } ・・・というコードがあったのですが、2冊目には同じような処理が mysqli_fetch_assoc()を使って書かれていたり、 接続の仕方も1冊目では「new PDO($dnsinfo,$USER,$PW);」を使って書かれているのが、2冊目では「mysqli_connect()」になっていたり、 他にも同じような処理がよく似たコードで書かれています。 調べてみると、PHP5.5から1冊目のやり方になった・・・ような記事を見つけたのですが、どちらの本もPHP5.5と書いてあり、いまいちよくわかりません。 詳しい方いらっしゃいましたらご教示お願いいたします。

    • ベストアンサー
    • PHP
  • MySQL接続後の比較演算子について

    お世話になります。 指定した文字列とデータベースにセットされている文字列を比較して、 マッチしたら該当のカラムにセットされている文字列を吐き出し、 マッチしない場合は、エラー文を走らせるプログラムを構築しております。 例えば、 【 ※スクリプト1 】 // データベースに接続する $dsn = "$dbtype:dbname=$dbname;host=$sv"; $conn = new PDO($dsn, $user, $pass); $mail = "aaa@aaa.com"; $question = "好きな国は?"; $answer = "フランス"; $sql = "SELECT id, usr_name, mail, question, answer FROM テーブル名"; $stmt = $conn->prepare($sql); $stmt->execute(); while ($row = $stmt->fetch()) { if($row['mail'] == $mail && $row['question'] == $question && $row['answer'] == $answer){ //条件が一致した場合 echo "ユーザ名:".cnv_enc($row["usr_name"], $enc_disp, $enc_db); exit(); } } $sql = "SELECT id, usr_name, mail, question, answer FROM テーブル名"; $stmt = $conn->prepare($sql); $stmt->execute(); while ($row = $stmt->fetch()) { if($row['mail'] != $mail || $row['question'] != $question || $row['answer'] != $answer){ //条件が一致しない場合 echo "該当なし"; exit(); } } と書くと、【 $mail 】、【 $question 】、【 $answer 】の文字列を変更してもしなくても 正常に結果が返りますが、 【 ※スクリプト2 】 // データベースに接続する $dsn = "$dbtype:dbname=$dbname;host=$sv"; $conn = new PDO($dsn, $user, $pass); $mail = "aaa@aaa.com"; $question = "好きな国は?"; $answer = "フランス"; $sql = "SELECT id, usr_name, mail, question, answer FROM テーブル名"; $stmt = $conn->prepare($sql); $stmt->execute(); while ($row = $stmt->fetch()) { if($row['mail'] != $mail || $row['question'] != $question || $row['answer'] != $answer){ //条件が一致しない場合 echo "該当なし"; exit(); } } と書くと、【 $mail 】、【 $question 】、【 $answer 】の文字列を変更してもしなくても 【 該当なし 】が返ってしまいます。 試しに【 ※スクリプト2 】のif文をelseで更に分岐しても結果は同じでした。 今までデータベースからデータを引っ張って来る段階で、 比較演算子は殆ど使用していなかったので、whileで表示させる際に 条件分岐や演算子の特別な制約があるのでしょうか? 色々な書き方を試してみましたが、長時間作業していると混乱してきましたので、 どうかご教示の程よろしくお願い申し上げます。 PHP 5.3.3 MySQL 5.0.95

    • ベストアンサー
    • PHP
  • phpのコードでうまく動かず困っています

    現在ある書籍でログイン機能の基礎を学んでいるのですが、エラーが出て困っています。 書籍内のコードや付属のサンプルファイルの物をいれたり確認したりするのですがエラーがでます。 エラー Fatal error: Call to a member function bindParam() on a non-object in C:\xampp\htdocs\tennis\login.php on line 15 (この15行目は〇の部分です) コード <?php session_start(); //セッション開始 if(isset($_SESSION['id'])){ //セッションにユーザーIDがある(ログインしている) header('Location:index.php'); }else if(isset($_POST['name']) && isset($_POST['password'])){ $dsn = 'mysql:host=localhost; dbname=tennis; charset=utf8'; $user ='tennisuser'; $password = 'password'; try{ $db = new PDO($dsn, $user, $password); $db->setAttribute(PDO::ATTR_EMULATE_PREPARES, false); $stmt = $db->prepare("SELECT * FROM users WHERE name=:name AND password=:pass"); ○$stmt->bindParam(':name', $_POST['name'], PDO::PARAM_STR); $stmt->bindParam(':pass', sha1($_POST['password']), PDO::PARAM_STR); //クエリ実行 $stmt->execute(); if($row = $stmt->fetch()){ //ユーザーが存在していたので、セッションにユーザーIDをセット $_SESSION['id'] = $row['id']; header('Location:index.php'); exit(); }else{ //1レコードも取得できなかった場合 //ユーザー名・パスワードは間違っている可能性があるのでもう一度ログインフォームを表示 header('Location:login.php'); exit(); } }catch(PDOException $e){ die('エラー:'.$e->getMessage()); } }else{ //ログインしていない場合はログインフォームを表示 ?> <html> ~省略~

    • ベストアンサー
    • PHP
  • HTML+PHPのリストボックス表示について

    現在HTML+PHPで勉強しながらアプリを作成しています。 MySQLからデータをよみ、その値からリストボックスを作成し表示させていますが、そのリストボックスがテーブル内に表示されず、位置がずれて表示されます。どうすればうまくテーブル内に表示されるのか教えてください。よろしくお願いします。(PHPというよりHTMLの質問かもしれませんが) <?php //データベース接続設定 $dbtype="mysql"; $sv="localhost"; $dbname="hogehoge"; $user="root"; $pass="abcdefg"; //データベースに接続 $dsn = "$dbtype:dbname=$dbname;host=$sv"; $conn = new PDO($dsn,$user,$pass); //---------------------------------------- // ■ POST時 //---------------------------------------- if ($_SERVER["REQUEST_METHOD"]=="POST"){ // □ 新規追加 if (isset($_POST["submit_add"])){ $new_code = htmlspecialchars($_POST["new_code"], ENT_QUOTES); //追加コード $new_kbncod = htmlspecialchars($_POST["new_kbncod"], ENT_QUOTES); //追加項目 $sql = "INSERT INTO kekka VALUES(null,'$new_code','$new_kbncod')"; $stmt = $conn->prepare($sql); $stmt->execute(); } // □ 変更 if (isset($_POST["submit_upd"])){ $id = key($_POST["submit_upd"]); //押下したボタン番号を取得 //-------------------------------- // □ POSTされたデータを取得 //-------------------------------- $upd_kbncod = htmlspecialchars($_POST["kbn_code"][$id], ENT_QUOTES); //変更項目 $upd_code = htmlspecialchars($_POST["code"][$id], ENT_QUOTES); //変更コード $sql = "UPDATE kekka SET code = $upd_code, kbn_code = $upd_kbncod WHERE id=$id"; $stmt = $conn->prepare($sql); $stmt->execute(); } // □ 削除 if (isset($_POST["submit_del"])){ $id = key($_POST["submit_del"]); //押下したボタン番号を取得 //テーブルからデータを削除 $sql = "DELETE FROM kekka WHERE (id = $id)"; $stmt = $conn->prepare($sql); $stmt->execute(); } } //===================================================================== // ■ H T M L //===================================================================== ?> <html> <head> <meta http-equiv="Content-type" content="text/html; charset=utf-8"> <title>テスト</title> </head> <body> <h1>テスト中</h1> <form action="<?=$_SERVER['SCRIPT_NAME']?>" method="POST"> <table border="1" cellspacing="0" cellpadding="3" width="100%" bordercolor="#666666"> <tr bgcolor="#eee8aa"> <td align="center"><font size="2">項目名(リスト)</font></td> <td align="center"><font size="2">コード:数字4桁</font></td> <td align="center"><font size="2">ボタン</font></td> </tr> <?php //---------------------------------------- // □:テーブルからデータを読む //---------------------------------------- $sql = "SELECT * FROM kekka ORDER BY id"; $stmt = $conn->prepare($sql); $stmt->execute(); while($row = $stmt->fetch()){ $id = $row["id"]; $code = $row["code"]; $kbncod = $row["kbn_code"]; echo "<td>".disp_list($conn,"code_hyo", "KBN_CODE", "KBN_NAME", $kbncod, "kbn_code[$id]")."</td>"; echo "<td><input type=text name=code[$id] value=$code size=10></td>"; echo "<td><input type=submit name=submit_upd[$id] value='変更' size=4>"; echo "<input type=submit name=submit_del[$id] value='削除' size=4></td>"; echo "</tr>"; } //追加リスト表示用に、変数の初期化を行う。(ゴミデータ除去) $kbncod=""; $code=""; $new_kbncod=""; $new_code=""; ?> <tr> <td><?php echo disp_list($conn,"code_hyo", "KBN_CODE", "KBN_NAME", $new_kbncod, "new_kbncod"); ?></td> <td><input type="text" name="new_code" value="<?=$new_code ?>" size="15"></td> <td><input type="submit" name="submit_add" value="追加" size="4"></td> </tr> </table> </form> </body> </html> <?php // パラメータ:接続/テーブル名/リスト値/表示値/選択値/リスト名称 function disp_list( $conn2,$table, $value, $text,$selected_value, $m_name) { // DBから項目情報を取り出す $sql2 = "SELECT * FROM " . $table . " ORDER BY " . $value; $stmt2 = $conn2->prepare($sql2); $stmt2->execute(); // 取り出した項目情報をプルダウンリストに表示する echo "<select name=\"" . $m_name . "\">"; while ($row2 = $stmt2->fetch()){ echo "<option "; if ($selected_value == $row2[$value]) { echo " selected "; } echo " value=\"".$row2[$value]."\">"; echo $row2[$text]."</option>"; } echo "</select>"; } ?>

    • ベストアンサー
    • PHP
  • データベースとphp

    データベースを使ったアプリケーションを作ろうと思っています。 既に投票をしてあるデータの投票結果を表示するプログラムです。 投票結果の表示ができません。多い順や少ない順のsqlはできていて、あとはphpに反映させて表示するだけなのですが、うまくいきません。 以下、コードです。 query.phpはメインのページです。 プルダウンメニューで「多い順」を選択すると、多い順の投票結果が表示されるようにしたいのですが、選択しても全く動きません。 action="query.php"の部分がいけないのでしょうか? action="max.php"にすると、「多い順」を選択しても、「少ない順」を選択しても、どちらも多い順の結果が出てしまいます。(max.phpは多い順に表示するためのファイル名です。query.phpの後ろにソースコードを張りました。) /*query.phpのソースコード*/ <html> <head><title>Listing All Data</title> <link rel="stylesheet" href="../default.css" type="text/css" /> </head> <script language="javascript"> <!-- function navi(obj) { url = obj.options[obj.selectedIndex].value; if(url != "") { location.href = url; } } //--> </script> <body> <div id="main"> <h1>ご当地グルメ<br/>アプリケーション</h1> <div id="description"> 最近流行りのご当地グルメのランキングを見てみましょう!! </div> <form action="query.php" method="post"> <select name="kekka"> <option value=""selected>---投票結果---</option> <option value="http://localhost/~・・・ここにはディレクトリ名・・・/query/max.php">多い順</option> <option value="http://localhost/~ここにはディレクトリ名・・・/query/min.php">少ない順</option> </select> <input type="submit" value="選択"> </form> </div> </body> </html> /*max.phpのソースコード*/ <?php ini_set('display_errors', 'Off'); date_default_timezone_set('Asia/Tokyo'); ?> <html> <head><title>Listing All Data</title> <link rel="stylesheet" href="../default.css" type="text/css" /> </head> <body> <div id="main"> <h1>ご当地グルメ<br/>アプリケーション</h1> <div id="description"> 投票結果(多い順)です。<br> </div> <?php if(! $db = new PDO("sqlite:sqlite2.db")){ die("DB Connection Failed."); } $sql = "SELECT t.itemname,count(*) FROM teams t,vote v WHERE t.teamid=v.teamid GROUP BY v.teamid ORDER BY count(*) DESC"; $stmt = $db->prepare($sql); $stmt -> execute(); print "投票結果(多い順)"; print "<table border=1>\n"; while($cols = $stmt->fetch(PDO::FETCH_NUM)){ print "<tr><td width='100'>$cols[0]</a></td><td>"; for($i=0;$i<$cols[1];$i++){ print "<font color='FF0000'>*</color>"; } print "<font size='-2'>($cols[1]票)</font></td></tr>"; } print "</table>"; ?> <br> <br> <a href="javascript:location.href = 'query.php';">トップページへ</a> </div> </body> </html>

  • PDOでLIKE検索

    LIKE検索でつまづいでいます。 こまめにチェックしながら進めており、エラーが表示されるわけではないのですが、うまくキーが引き渡せていないのが原因だとは思うのですが、どう対策すればいいかというところでつまづいています。 文字コードの指定、直接パラメーターを使わない、プレースホルダの使い方、キーの渡し方等アドバイスをいただけないでしょうか。 ※全件表示だと動作します。また、$keyの中身はきちんと渡っているのは確認できましたが、select文の部分に反映されていないような状態。。。 【検索フォーム】 <form name="" method="POST" action="result.php"> <button type="submit" name="area" value="新宿">新宿</button> </form> 【検索結果】 define('DB_HOST', 'localhost'); define('DB_USER', 'ユーザー名'); define('DB_PASSWORD', 'DBパスワード'); define('DB_NAME', 'DB名'); try { $dbh = new PDO('mysql:host='.DB_HOST.';dbname='.DB_NAME,DB_USER,DB_PASSWORD, array( PDO::MYSQL_ATTR_INIT_COMMAND => "SET CHARACTER SET 'utf8'") ); } catch (PDOException $e) { echo $e->getMessage(); exit; } $key = "%".$_POST['area']."%"; $stmt = $dbh->prepare('SELECT * FROM salon WHERE area LIKE :area'); $stmt->bindParam(':area', $key, PDO::PARAM_STR); $stmt->execute(); ?> <body> <?php foreach ($stmt as $row) : ?> <?php echo htmlspecialchars($row['name'],ENT_QUOTES,'UTF-8'); ?> <?php echo htmlspecialchars($row['area'],ENT_QUOTES,'UTF-8'); ?> <?php endoforeach; ?> </body> アドバイスをいただければ幸いです。

    • ベストアンサー
    • PHP
  • PHPからMSSQLへの接続結果の文字化け

    PHPからMicrosoft SQLserverのデータベースへ接続を行い、データベースの内容をブラウザへ表示したいのですが、日本語が文字化けして困っております。 導入するまでの手順を書きます。 参考にしたページ http://chorusde.hatenablog.jp/entry/20120621/1340300814 (1)マイクロソフトのホームページより「SQL Server Driver for PHP」をダウンロード、解凍。 (2)自分のPHPバージョンを確認。  Apache/2.4.4   PHP/5.4.19   MSVC9   Thread Safety/enabled  上記の環境からphp_pdo_sqlsrv_54_ts.dllとphp_sqlsrv_54_ts.dllを使用することを決定。 (3)C:\xampp\php\extの下に(1)で解凍したフォルダ内にあるphp_pdo_sqlsrv_54_ts.dllとphp_sqlsrv_54_ts.dllをコピー。 (4)C:\xampp\php\php.iniを開き、「extension=」と書いている951行あたりに   「extension=php_pdo_sqlsrv_54_ts.dll」   「extension=php_sqlsrv_54_ts.dll」  を追加   「mssql.secure_connection = OFF」を「ON」に修正 (5)XAMPPコントロール画面でApacheとMySQLを再起動。 その後、以下のコードで実行したところ日本語が文字化けしました。 以下のコードはこのページのサンプルコードをそのままコピペし少し修正したものです。 http://keicode.com/cgi/how-to-connect-to-mssql.php <?php $serverName = 'SQLEXPRESS'; $connectionInfo = array( 'UID' => 'username', 'PWD' => 'password', 'Database' => 'shop' ); $conn = sqlsrv_connect( $serverName, $connectionInfo ); if( $conn === false ){ echo "Cound not connect.\n"; die( print_r( sqlsrv_errors(), true)); } $tsql ="SELECT * from food"; $stmt = sqlsrv_query( $conn, $tsql ); if( !$stmt ) { die( print_r( sqlsrv_errors(), true)); } while( $row = sqlsrv_fetch_array( $stmt, SQLSRV_FETCH_NUMERIC)) { print_r($row); } sqlsrv_free_stmt($stmt); sqlsrv_close($conn); ?> このソースを実行しますと日本語が文字化けしてしまいます。(データを英語表記にすれば問題なく表示できます) 文字化けせずにブラウザに結果を表示するためにはどのようにすればよいでしょうか? またSQL文の「"SELECT * from food"」の"food"の部分(テーブル名)を「食品」と日本語名に変更するとsql文が実行できなくなりエラーを起こします。 おそらく文字化けしてSQL文を認識してしまうため「そんなテーブル名はありませんよ」と怒られてしまうのだと思います。 初心者で凝縮ですが、どなたかアドバイスをお願いいたします。

    • ベストアンサー
    • PHP
  • phpでframe処理

    今phpとhtmlを使ってフレーム内に表示しているチェックボックスが選択されているものを別のphpファイルで表示する処理を作っています。 ソース内容は以下のとおりです。 allichiran.html <?php try{ $pdo = new PDO("mysql:host=localhost; dbname=***", "***","***"); $condition = "WHERE 1"; if(isset($_POST["clandername"]) && ($_POST["clandername"] != "")){ $clandername = mysql_escape_string( $_POST["clandername"]); $clandername = str_replace("%", "\%", $clandername); $condition .= " AND clandername LIKE \"%".$clandername."%\""; } $stmt = $pdo->prepare("SELECT * FROM *** ".$condition); $stmt->bindValue("clandername","%".$_POST["clandername"]."%"); $stmt->execute(); $ch=0; print("<table border=\"1\">"); for(;$row = $stmt->fetchObject();){ print("<tr>"); print("<td>".$row->clandername."</td>"); print("<td>"); print("<input type=\"checkbox\" name=\"chk[]\" value=\"1\">"); print("</td>"); print("</tr>"); } print("</Table>"); }catch(PDOException $e){ die($e->getMessage); } ?> allichiran.phpは <iframe src="allichi.html"> </iframe>で処理してます。 こちらのファイルでcheckboxの処理をしたいです。例えば、選択されたチェックボックスの判定などを行えたらうれしいです。 ちなみにphpadminも使ってます。

    • ベストアンサー
    • PHP

専門家に質問してみよう