• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:php、PDOでの接続とクエリの記述位置)

php、PDOでの接続とクエリの記述位置

このQ&Aのポイント
  • php初心者のため、PDOでの接続とクエリの記述位置について質問します。
  • 具体的な例を挙げて説明します。接続に関する部分は最初に記述し、その後にクエリを記述します。
  • また、エラーハンドリングも必要です。PDOの接続とクエリの記述位置やルールについて詳しく教えてください。

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

  • ベストアンサー
  • cheese014
  • ベストアンサー率85% (12/14)
回答No.1

PHPはHTMLの中に埋め込んで使えるタイプの言語ではありますが、 DB処理の部分と出力部を完全に分けて書くようにすると、処理の流れが掴みやすく、 後からの修正も容易になりますよ。 > PDOの接続とクエリの記述位置やその他のルールを詳しく教えて下さい。 ルールとして覚えるのではなく、各行の意味(なぜその場所でそう書くのか?)を 理解する事が大切です。PDOを使った処理の流れは↓のようになります。 //-- DB処理 $link = new PDO(略); // [1] PDOのオブジェクトを生成(=DBへの接続) $stmt = $link->query('SELECT...'); // [2] 接続したDBに対してクエリ(SELECT文)を発行 $rows = $stmt->fetchAll(略); // [3] 発行したクエリの結果を受け取る //-- 出力 print_r($rows); SELECT文の発行~出力までの基本は、これだけです。 > 先に記述しておき(接続しておいて)、その後htmlやphpの記述をはさみ、 > 必要な部分で以下のように(クエリ)の記述をした場合、動きません。 まずは、上記が動く状態で、var_dump($link, $stmt, $rows); としてみて、 それぞれの変数の中身を確認してみてください。 その後、自分なりに色々アレンジしてみて、動かなくなってしまったら、 同様に var_dump($link, $stmt, $rows); としてみると良いでしょう。

hayaken73
質問者

お礼

参考になる考え方とアドバイスいただきありがとうございます。 (var_dumpで中身の確認する手法、今後役に立ちそうです。) ありがとうございました。

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

その他の回答 (1)

  • mpro-gram
  • ベストアンサー率74% (170/228)
回答No.2

エラーは出てないということなのでしょうけど、動かない状況の詳細をもうちょっと欲しいところです。phpでのwarningすらも表示しない設定になってるような気がする。 でも、みなおすと、pdo の実行順というより、htmlの記述の方に問題有りそう。 </tr> と <tr> の間つまり行間で、文字列出力すると、最近のブラウザは、table の枠の外に表示したりして、どこに何が表示されてるか解らなくなります。場合によっては、出力されたhtmlソースをみて初めてwarning表示に気付く。 <table> 出力前に sql文を発行したなら、その直後で、 errorInfo チェックを行って下さい エラーがなければ、<table>用の文字列を出力していくようにします。 また、最後の閉じタグ</table> がないと、表は全く表示されなくなるブラウザも有りますのでこれも注意して下さい。 まずは、html文法で、どこにどの文字列をはさんでよいのか把握する方が先なのでは? あと、ごく初歩的ですが、離れたところに記述してるせいで、途中で、$link 変数に別なデータを入れてしまったりなどもあるので、どの変数がどこで使われてるかなどもしっかり把握しておく必要があります。まあ、ちょっとしたタイプミスで意図せずそうなることもあるので、var_dump() でのチェックは有用です。

hayaken73
質問者

お礼

細かい点まで参考になるご説明をいただきありがとうございます。 1つ1つチェックしていきたいと思います。

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

関連するQ&A

  • PDOでDB

    PDOでDBを表示させ修正ボタンを押し別ウインドウが開き選んだデータの修正を行いたいのですがupdate2.phpでエラ-メッセージが出ます。どうやったら直りますか 下記のメッセージです Warning: PDOStatement::execute(): SQLSTATE[HY093]: Invalid parameter number: number of bound variables does not match number of tokens in C:\WWW\test\htdoes\update2.php on line 4 レコードを修正しました。 ちなみに 番号 int プライマリ-キ- 氏名 varchar 住所 varcharです 下記はソースです 一覧画面 <HTML> <HEAD> <TITLE>一覧画面</TITLE> </HEAD> <BODY> <table border="1"> <tr> <th>番号</th> <th>氏名</th> <th>住所</th> <th>操作</th> </tr> <?php $pdo = new PDO("mysql:dbname=db_test;host=localhost", "root", "admin"); $st = $pdo->query("SELECT * FROM tbl_test"); while ($row = $st->fetch()) { $ID = htmlspecialchars($row['番号']); $NAME = htmlspecialchars($row['氏名']); $ADDR = htmlspecialchars($row['住所']); echo "<tr><td>$ID</td><td>$NAME</td><td>$ADDR</td><td><a href='update.php?番号=$ID'>修正</a></td></tr>"; } ?> </table> </BODY> </HTML> アップデートの入力フォーム update.php <?php $ID = htmlspecialchars($_GET['番号']); $pdo = new PDO("mysql:dbname=db_test;host=localhost", "root", "admin"); $st = $pdo->prepare("SELECT * FROM tbl_test WHERE 番号=?"); $st->execute(array($ID)); $row = $st->fetch(); $ID = htmlspecialchars($row['番号']); $NAME = htmlspecialchars($row['氏名']); $ADDR = htmlspecialchars($row['住所']); ?> <form action="update2.php" method="post"> 番号<br> <?php echo $ID ?><br> 氏名<br> <input type="text" NAME="NAME" value="<?php echo $NAME ?>"><br> 住所<br> <input type="text" NAME="ADDR" value="<?php echo $ADDR ?>"><br> <input type="submit"> </form> アップデートの処理 update2.php <?php $pdo = new PDO("mysql:dbname=db_test;host=localhost", "root", "admin"); $st = $pdo->prepare("UPDATE tbl_test SET 番号=?,氏名=?,住所=?WHERE 番号=?"); $st->execute(array($_POST['NAME'], $_POST['ADDR'])); ?> レコードを修正しました。 アップデートの処理 update2.phpで 最初のエラーが出ます

  • php 分割

    以前はmysql関数をページングを行ったのですが、今回はpdoにやりたいけど pdoに書き換えるやり方がわかりません また前回は前のページ、次のページだったのですが 15件中 1-10件表示 ○ページ表示 と行い <前 1 2 3 次>みたいにやりたいです <html> <head> <title>一覧画面</title> </head> <body> <br><br> <blockquote> 一覧画面 <br><br> <form action = "" method="GET"> <input type="hidden" name="event" value="find"> <input type="text" name="name"style ="font-size:20px;width: 400px; height: 40px"> <input type="submit" value="検索" style ="font-size:20px;width: 100px; height: 40px"> </form> <br><br> <?php if ($_GET) { // データがGETされていたら $event = isset($_GET['event']) ? $_GET['event'] : ''; // 取得 } $pdo = new PDO("mysql:dbname=db_test;host=localhost", "root", "admin"); $name=isset($_GET['name'])?$_GET['name']:""; $perpage=10; $page=isset($_GET['page'])?($_GET['page']*$perpage):0; $sql ="select * from tbl_test where 1 "; $sql.="and (0 "; $sql.="or `氏名` like concat('%',?,'%') "; $sql.="or `住所` like concat('%',?,'%') "; $sql.=") "; $sql.= " limit {$page},{$perpage}" ; $stmt = $pdo->prepare( $sql); $stmt->execute(array($name,$name)); $count = $stmt->rowCount(); if($count>0){ print "<table border=1>" ; print "<tr>"; print "<th>番号</th>"; print "<th>氏名</th>"; print "<th>住所</th>"; print "<th>操作</th>"; print "</tr>"; while($row = $stmt->fetch(PDO::FETCH_ASSOC)){ $ID = htmlspecialchars($row['番号']); $NAME = htmlspecialchars($row['氏名']); $ADDR = htmlspecialchars($row['住所']); echo "<tr> <td>$ID</td> <td>$NAME</td> <td>$ADDR</td> <td><a href='edit.php?番号=$ID'>修正</a> <a href='delete.php?番号=$ID'>削除</a></td></tr>"; print "</tr>"; }; print "</table>" ; }else{ print "該当するデータがありません"; } ?> このソースにどう命令を入れていいのかわからず困っています サンプルソースや指摘おねがいします

    • ベストアンサー
    • PHP
  • PDOでMySQL接続した際の文字化けについて

    http://ponk.jp/php/basic/php_mysql すいません。データベースを初めて勉強中なのですが、上記のサイトに書いてあるように文字をphpで表示させた場合日本語が???に文字化けします。いろいろググってみたのですが解決できず先に進めません・・。 照合順序などはutf8_general_ciとなっていまして、phpの方も<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />とutf-8が指定してありますので問題ないと思います。 考えられる原因というのはどんなものがありますか? テーブル表 CREATE DATABASE men; USE men; CREATE TABLE udon(name TEXT, price INT); INSERT INTO udon VALUES('たぬきうどん', 340); INSERT INTO udon VALUES('てんぷらうどん', 440); INSERT INTO udon VALUES('カレーうどん', 420); INSERT INTO udon VALUES('うどん定食', 520); 表示プログラム <table border="1"> <tr><th>名前</th><th>価格</th></tr> <?php $pdo = new PDO("mysql:dbname=men", "root"); $st = $pdo->query("SELECT * FROM udon"); while ($row = $st->fetch()) { $name = htmlspecialchars($row['name']); $price = htmlspecialchars($row['price']); echo "<tr><td>$name</td><td>$price 円</td></tr>"; } ?> </table>

    • ベストアンサー
    • MySQL
  • PDOがうまく動かない

    PDOがうまく動かなくて困っています。 $get_id = $_GET['id']; $stmt = $pdo->query("SELECT * FROM table where hoge = ':id'"); $stmt->bindValue(":id",$get_id, PDO::PARAM_STR); $stmt->execute(); if($row = $stmt->fetch()) { echo "あああ"; } $get_id = $_GET['id']; $stmt = $pdo->query("SELECT * FROM table where hoge = '$get_id'"); if($row = $stmt->fetch()) { echo "あああ"; } 2つ目は「あああ」と表示されるのですが、1つ目は何も表示されません。 よろしくおねがいします。

    • ベストアンサー
    • PHP
  • PDOでDB ページング

    一覧画面と検索画面を一緒にしています 一覧画面は10件表示にし、テキストになにも入力されてなかったらデータを全件表示したいです また、1 l 2 l 3 のようにページを表示し、また何件中何件目データですと表示したいです <!--一覧画面 index.php--> <html> <head> <title>一覧画面</title> </head> <body> <br><br> <blockquote> 一覧画面 <br><br> <?php if ($_GET) { // データがGETされていたら $event = isset($_GET['event']) ? $_GET['event'] : ''; // 取得 if (isset ($_GET['page'])==false) { $page=0; } else { //そうでなければpageパラメータの値をpage変数にセット $page = $_GET['page']; } } ?> <?php $pdo = new PDO("mysql:dbname=db_test;host=localhost", "root", "admin"); $name=isset($_GET['name'])?$_GET['name']:""; $sql ="select * from tbl_test where "; $sql.="`氏名` like concat('%',?,'%') "; $sql.="or `住所` like concat('%',?,'%') "; $sql.= " limit " . $page*10 . ", 10" ; $stmt = $pdo->prepare( $sql); $stmt->execute(array($name,$name)); $count = $stmt->rowCount(); if($count>0){ print "<table border=1>" ; print "<tr>"; print "<th>番号</th>"; print "<th>氏名</th>"; print "<th>住所</th>"; print "<th>操作</th>"; while($row = $stmt->fetch(PDO::FETCH_ASSOC)){ print "</tr>"; $ID = htmlspecialchars($row['番号']); $NAME = htmlspecialchars($row['氏名']); $ADDR = htmlspecialchars($row['住所']); echo "<tr> <td>$ID</td> <td>$NAME</td> <td>$ADDR</td> <td><a href='edit.php?番号=$ID'>修正</a> <a href='delete.php?番号=$ID'>削除</a></td></tr>"; }; print "</table>" ; }else{ print "該当するデータがありません"; } ?> <br><br><br> <form action = "index.php" method="GET"> <input type="hidden" name="event" value="find"> <input type="text" name="name"style ="font-size:20px;width: 400px; height: 40px"> <input type="submit" value="検索" style ="font-size:20px;width: 100px; height: 40px"> </form> <br><br> <form action = "regist.php" method="GET"> <input type="hidden" name="event" value="regist"> <input type = "submit" value = "新規登録" style ="font-size:20px;width: 100px; height: 40px"> </form> <input type="hidden" name="page" value="0"> </blockquote> </body> </html> 検索のテキストボックスが空だったら全件表示したいのですが今10件しか出ません limitの書く場所が原因でしょうか? またこのように一覧画面と検索結果画面が一緒じゃまずいですかね? 検索結果を別ウインドウじゃなく自分に返したいと思いこのやり方にしたのですがよくないですか?

    • ベストアンサー
    • MySQL
  • pdo

    個別で指定がない限り全体のsetFetchModeを最初に定義したいのですがエラーになってしまいます。 マニュアル等も見たのですがいまいち理解できず質問させて頂きました。 全体の指定をするにはどのように書けばいいでしょうか?以下現在のソースです。 また、pdoは初めて使用するのですがその他に定義しておいたほうがいい定数等がありましたら 是非アドバイスをお願い致します。 (自分で思いつくのは文字コードとフェッチモード程度でした^^;) $sql = "SELECT * FROM table where id = ?"; try { $pdo = new PDO($dsn, $user, $password); if ($pdo == null){ print('接続失敗'); } //$pdo->setFetchMode(PDO::FETCH_ASSOC); $pdo->query('SET NAMES utf8'); $stmt = $pdo->prepare($sql); if ($stmt->execute(array(1))) { while ($row = $stmt->fetch()) { print_r($row); } } } catch (PDOException $e) { print('Error:'.$e->getMessage()); die(); } $pdo = null;

    • 締切済み
    • PHP
  • テーブルの情報が一部しか表示されません。(php)

    すべてのID分の提出状況を表示させたい("○"か"×")のですが、 id=1の提出状況しか表示されません。 >>CODE $recordSet2 = mysql_query('SELECT * FROM report'); <<CODE をwhileにいれてみたり試行錯誤してみたのですが、上手くいきません。 ご指摘よろしくお願い致します。 プログラム >>CODE <table width="70%"> <tr> <th scope="col"><bl>ID</bl></th> <th scope="col"><bl>教科名</bl></th> <th scope="col"><bl>課題名</bl></th> <th scope="col"><bl>担当教員</bl></th> <th scope="col"><bl>提出期限</bl></th> <th scope="col"><bl>再提出</bl></th> <th scope="col"><bl>再提出期限</bl></th> <th scope="col"><bl>提出状況</bl></th> </tr> <?php $recordSet = mysql_query('SELECT * FROM exercise ORDER BY id'); while ($table = mysql_fetch_assoc($recordSet)){ ?> <tr> <td><?php print(htmlspecialchars($table['id'])); ?></td> <td><?php print(htmlspecialchars($table['lessonname'])); ?></td> <td><?php print(htmlspecialchars($table['name'])); ?></td> <td><?php print(htmlspecialchars($table['teacher'])); ?></td> <td><?php print(htmlspecialchars($table['presentday'])); ?></td> <td><?php print(htmlspecialchars($table['represent'])); ?></td> <td><?php print(htmlspecialchars($table['representday'])); ?></td> <td><?php $recordSet2 = mysql_query('SELECT * FROM report'); $report = mysql_fetch_assoc($recordSet2); if ($table['lessonname'] == $report['lessonname'] && $table['name'] == $report['exercisename']) { if(eregi($member['name'], $report['upfile'])) { echo "○"; }else { echo "×"; } } ?></td> </tr> <?php } ?> </table> <<CODE

    • ベストアンサー
    • PHP
  • テーブルの情報が一部しか表示されません。(php)

    すべてのID分の提出状況を表示させたい("○"か"×")のですが、 id=1の提出状況しか表示されません。 テストデータはid=5までの5件を入力しています。 $recordSet2 = mysql_query('SELECT * FROM report'); をwhileにいれてみたり試行錯誤してみたのですが、上手くいきません。 ご指摘よろしくお願い致します。 プログラム <table width="70%"> <tr> <th scope="col"><bl>ID</bl></th> <th scope="col"><bl>教科名</bl></th> <th scope="col"><bl>課題名</bl></th> <th scope="col"><bl>担当教員</bl></th> <th scope="col"><bl>提出期限</bl></th> <th scope="col"><bl>再提出</bl></th> <th scope="col"><bl>再提出期限</bl></th> <th scope="col"><bl>提出状況</bl></th> </tr> <?php $recordSet = mysql_query('SELECT * FROM exercise ORDER BY id'); while ($table = mysql_fetch_assoc($recordSet)){ ?> <tr> <td><?php print(htmlspecialchars($table['id'])); ?></td> <td><?php print(htmlspecialchars($table['lessonname'])); ?></td> <td><?php print(htmlspecialchars($table['name'])); ?></td> <td><?php print(htmlspecialchars($table['teacher'])); ?></td> <td><?php print(htmlspecialchars($table['presentday'])); ?></td> <td><?php print(htmlspecialchars($table['represent'])); ?></td> <td><?php print(htmlspecialchars($table['representday'])); ?></td> <td><?php $recordSet2 = mysql_query('SELECT * FROM report'); $report = mysql_fetch_assoc($recordSet2); if ($table['lessonname'] == $report['lessonname'] && $table['name'] == $report['exercisename']) { if(eregi($member['name'], $report['upfile'])) { echo "○"; }else { echo "×"; } } ?></td> </tr> <?php } ?> </table>

    • ベストアンサー
    • PHP
  • 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
  • PHP テーブル内容にリンク付をつけて検索したい

    以下のような2つのPHPを作成しました。 PHPにおいて、検索ボタンが押されると、 SQLで記述したデータベースから値を持ってきてtable表示させているのですが、 その際に取得した値にリンクを付けて、再検索をする方法がわかりません。 POST変数で渡してやれば、というところはなんとなくわかるのですが、 具体的な方法をご教示いただきたいです。 どうかよろしくお願いいたします。 ------------------------------------------------------------------------ HTML側(データを検索・表示させるため)のtable.php <?php $nengetu = isset($_POST['nengetu']) ? $_POST['nengetu'] : ""; ?> HTML表示箇所 <?php <form method="post" action="tables.php"> <button type="submit" name="search">検索</button>←ボタンを押されたら表示 <thead>  <tr>   <th>年月</th>   <th>名前</th>   <th>金額</th>  </tr> </thead> <tbody> if(isset($_POST['search'])) $query.= "SELECT * FROM AAA"; if (!empty($nengetu)) { $query.=" WHERE nengetu = '$nengetu"; $dataview($query); ?> ------------------------------------------------------------------------ ------------------------------------------------------------------------ PDOで取得したテーブル内容を表示 class.table.php public function dataview($query) { クエリーを実行 ループ <tr> <td><?php print($row['name']); ?></td>←リンク付きで表示、table.phpで検索 <td><?php print($row['kingaku']); ?></td> <td><?php print($row['nengetu']); ?></td> </tr> } ------------------------------------------------------------------------

    • ベストアンサー
    • PHP