• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:PDOでDB ページング)

PDOでDBページングを実装する方法

このQ&Aのポイント
  • 一覧画面と検索画面を一緒にして、テキストが入力されていない場合は全件表示する方法について説明します。
  • また、ページングされたデータの表示方法と、検索結果の画面遷移についても考えます。
  • さらに、PDOとは何か、そしてDB接続とクエリの実行についても解説します。

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

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

>(1)がbになってしまいます ああなるほど、絞り込みをしない場合も全件表示でしたっけ? で、pageがあるときは絞り込みがない場合だけページング・・・ですか ようやく見えてきました。 試してみればわかりますが、正直あまりいいUIではありませんね 全件表示してあるところからページングをする意味がないので (全件表示させないためのページングですから) とりあえずご指示のとおりであればこんな感じ? $sql ="select * from tbl_test where 1 "; if($name!==""){ $sql.="and (0 "; $sql.="or `氏名` like concat('%',?,'%') "; $sql.="or `住所` like concat('%',?,'%') "; $sql.=") "; }elseif(isset($_GET["page"])){ $sql.= " limit {$page},{$perpage}" ; }

noname#197690
質問者

お礼

ありがとうございます あとは 15件中 1-10件目 何ページ目表示とやりたいです PDOで書くにはどうしたらいいですか? どう<a>タグに反映されるか教えてください <前 l1l2l次>

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

その他の回答 (11)

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

>PHPの板に書けば回答くれますか? ページングの部分に絞って質問をしてもらえれば回答できるかもしれません ページングで必要なのは ・現在のページ番号 ・検索結果のアイテム数 ・1ページに表示するアイテム数 ・現在ページが最初のページかどうか ・現在ページが最後のページかどうか あたりです。 このあたりの情報をまとめればさほど難しくない処理でしょう

全文を見る
すると、全ての回答が全文表示されます。
  • yambejp
  • ベストアンサー率51% (3827/7415)
回答No.11

>自分のソースに置き換えたらどう書けばいいですか? だからMySQLの板で回答すべきことではないので回答できません

noname#197690
質問者

お礼

PHPの板に書けば回答くれますか? とりあえず次のページ 前のページに移動できるようにしたいと思います <?php $cnt = $row[0] ; //ページ表示 if(!$cnt > 10) { echo ceil($cnt / 10), "ページの中の", $page + 1, "ページ目を表示<br>" ; } //前の10件 if ($page != 0) { echo '<a href="index.php?page=' . ($page - 1) . '">前の10件</a>'; } //次の10件 if (($page + 1)*10 < $cnt) { echo '<a href="index.php?page=' . ($page + 1) . '">次の10件</a>'; } ?> これでリンクも何も表示されないのですがなぜですかね?

全文を見る
すると、全ての回答が全文表示されます。
  • yambejp
  • ベストアンサー率51% (3827/7415)
回答No.10

>15件中 1-10件目 何ページ目表示とやりたいです 必要な情報が3つあります ・ヒットするアイテム数($totalItems) ・現在のページ番号($currentPage・・・$_GET["page"]の値) ・1ページ当たりの表示アイテム数($perPage) まずは$totalItemsを得ること select count(*) as totalItems from テーブル where 条件 あたりでいけるでしょう これをもとに for($i=0;$i<(int)($totalItems / $perPage);$i++){ print "<a href="hoge.php?page=".$i."&amp;name=".urlencode($name)."\">".($i+1)."</a>"; } のような処理で、表示一覧を得ます print $totalItems."件中 ".($currentPage*$perPage+1)."-"; print ($currentPage+1)*$perPage."件目"; のようにして現在のページの情報を表示します (最大数を件数の上限にしたい場合はもうちょい工夫がいります) 情報としては select * from テーブル where 条件 limit $currentPage*$perPage,$perPage から得たデータをテーブル形式に成型して表示します その他例外処理やらなにやら入れなくちゃいけない処理も多く ここまでくるとMySQLの板で質問するべきことではないですね。 PHP側でクラスを組んで機能を細分化しながらつくる必要があると思います

noname#197690
質問者

お礼

ありがとうございます やろうとしてることはわかります 自分のソースに置き換えたらどう書けばいいですか? 何度もすいません

全文を見る
すると、全ての回答が全文表示されます。
  • yambejp
  • ベストアンサー率51% (3827/7415)
回答No.8

ちなみに個人的には絞り込みがあろうが無かろうが「ページングする」というのが UIとしては正しいと思います。 出現頻度の高い特定のキーワードでヒットするのが何十件となったときに ユーザビリティがさがるので・・・ また、or検索(xかyでヒットする)やand検索(xかつyのときヒットする)など 実装していくとまた工夫が必要になっていきます とくにand検索は順列か(x,yで検索したときにx→yの順番でヒットした場合表示) ランダム(順番にかかわらずx,yがともにヒットしたら表示)かによっても 処理がことなるので実装に注意が必要

noname#197690
質問者

お礼

ありがとうございます そうですね。いまデータが少ないのでいいんですが何十件となったときに大変ですね。 絞り込みがなかろうがあろうが「ページングする処理にしたいです」 とりあえず今ないときのみやり理解してから行いたいと思います あとは 15件中 1-10件目 何ページ目表示とやりたいです PDOで書くにはどうしたらいいですか? どう<a>タグに反映されるか教えてください <前 l1l2l次>

全文を見る
すると、全ての回答が全文表示されます。
  • yambejp
  • ベストアンサー率51% (3827/7415)
回答No.7

>(1)はa >(2)はb >(3)(4)もa なるほどねぇ、私の理解がだいぶ違いました 絞り込みをしない場合はページングして 絞り込みをした場合はページングしないということですね $sql ="select * from tbl_test where 1 "; if($name!==""){ $sql.="and (0 "; $sql.="or `氏名` like concat('%',?,'%') "; $sql.="or `住所` like concat('%',?,'%') "; $sql.=") "; }else{ $sql.= " limit {$page},{$perpage}" ; } でいけるんじゃないでしょうか?

noname#197690
質問者

お礼

はいそういうこうです けど (1)がbになってしまいます <?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 "; if($name!==""){ $sql.="and (0 "; $sql.="or `氏名` like concat('%',?,'%') "; $sql.="or `住所` like concat('%',?,'%') "; $sql.=") "; }else{ $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 "該当するデータがありません"; } ?> こんな感じですか? あとは 15件中 1-10件目 何ページ目表示とやりたいです PDOで書くにはどうしたらいいですか? <前 l1l2l次>

全文を見る
すると、全ての回答が全文表示されます。
  • yambejp
  • ベストアンサー率51% (3827/7415)
回答No.6

場合分けをしましょう ○仮データ x=11件、y=5件というデータを投入したとして (1)検索語を指定しないとき 1-a)16件ヒットして全部表示 1-b)16件ヒットして10件ずつ表示 1-c)絞り込みをしない場合はヒットさせない 1-d)そのた? (2)「x」で絞り込み 2-a)11件ヒットして10件ずつ表示 2-b)11件ヒットして全部表示 2-c)そのた? (3)「y」で絞り込み 3-a)5件ヒットして全部表示 3-b)そのた? (4)「z」(存在しないデータ)で絞り込み 4-a)ヒットしないので「ヒットしない」と表示 4-b)ヒットしないので0件表示(テーブルのヘッダ部分はそのまま) 4-c)そのた? 今までの説明をみるとすべてパターンaだと思っていたのですが #5の補足をみるかぎり1はb? また(2)についてはページングの際に11件目からデータがとれないということ?

noname#197690
質問者

お礼

すいません 少し話を戻させていただきます これ聞いたらこの人自分のプログラム理解してないのかよって思われると思いますがこの一覧画面の表示の仕方 間違ってますかね?LIKEで表示しているので LIKEで表示してるからlocalhost/index.phpで開いても検索語がないと見なされるのですか?だから10件表示じゃなく全件表示されてしまうんですかね? 最初検索結果と一覧画面を分けて表示していたのですが一緒にして一覧画面から絞りだされてように検索結果を出しているのですが記述あってますか (1)はa (2)はb (3)(4)もa です 全件表示を10件でわけページングしたいです わかりにくくすいません

全文を見る
すると、全ての回答が全文表示されます。
  • yambejp
  • ベストアンサー率51% (3827/7415)
回答No.5

ごめんなさい、なにか話がかみ合ってない気がしますが 検索文字列になにか文字をいれても絞り込みされずに全件表示されるということでしょうか? それとも絞りこみはされるけど、10件ごとではなくlimitなしの検索に なってしまうということでしょうか? 見る限り、nameに文字がはいっていればそれを利用して検索して10件ずつ表示 nameに文字がはいっていない場合は絞り込みをせずに全件表示という仕様で そのとおり表示されるはずですが ちなみにソースの前半部の >if (isset ($_GET['page'])==false) { >$page=0; >} else { >//そうでなければpageパラメータの値をpage変数にセット >$page = $_GET['page']; >} このくだりは、別に記載があるので不要です

noname#197690
質問者

お礼

なんて言えばいいんでしょう 一覧画面と検索結果画面がイコール(同phpで実行されている)それでそのページを10件ごとわけて2ページには11件目からのデータ表示 今試しに適当にaというレコードを11件作ってaと入力して検索してた10件のみ表示されました。 そうではなくトップ画面=検索結果画面なんですけど最初検索結果画面を10件表示しl2lを押すと11件目したいに行い検索のテキストが空白で検索ボタンを押すと全件表示したいということです。 説明って難しいですね 言ってる意味がわからなかったらまた言ってください すいません お願いします

全文を見る
すると、全ての回答が全文表示されます。
  • yambejp
  • ベストアンサー率51% (3827/7415)
回答No.4

>消しましたが10件表示ではなく全件表示になっています ん?nameが空だからじゃないの? nameが空の場合は全件表示という仕様ですよね? 仕様をもう一度よく練り直した方がよいのでは?

noname#197690
質問者

お礼

はい 空だったら全件表示です いま一覧画面に検索結果を自分に返しているのですが、 最初にlocalhost/index.phpとアドレスバーに入力したら10件表示され検索のテキストボックズが空白だったら全件表示されるということです 日本語が下手でごめんなさい これやり方違ってますか?

全文を見る
すると、全ての回答が全文表示されます。
  • yambejp
  • ベストアンサー率51% (3827/7415)
回答No.3

>$sql.= "select count(*) from tbl_test " ; この行いらないね

noname#197690
質問者

お礼

消しましたが10件表示ではなく全件表示になっています なかなか難しいですね これってあれですかね pegeを渡してないからですか? <input type="hidden" name="page" value="0"> で自分自身に渡してるから大丈夫ですか $page=0、$perpae=10ってなって1件目から10件目が表示されるはずですよね <?php if ($_GET) { // データがGETされていたら $event = isset($_GET['event']) ? $_GET['event'] : ''; // 取得 if (isset ($_GET['page'])==false) { $page=0; } else { //そうでなければpageパラメータの値をpage変数にセット $page = $_GET['page']; } } $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 "; if($name!==""){ $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 "該当するデータがありません"; } ?>

全文を見る
すると、全ての回答が全文表示されます。
  • yambejp
  • ベストアンサー率51% (3827/7415)
回答No.2

よくよく考えたら$nameが空ならwhere句もいらないね $name=isset($_GET['name'])?$_GET['name']:""; $perpage=10; $page=isset($_GET['page'])?($_GET['page']*$perpage):0; $sql ="select * from tbl_test where 1 "; if($name!==""){ $sql.="and (0 "; $sql.="or `氏名` like concat('%',?,'%') "; $sql.="or `住所` like concat('%',?,'%') "; $sql.=") "; $sql.= " limit {$page},{$perpage}" ; } のような感じ ただしこのように?の位置関係が確定できな場合 prepareの関係で$nameを?に代入するのはbindValueにした方がよいかも 現レベルの絞り込みならexcuteに配列をセットするやり方でも 無視されるので問題はありませんが

noname#197690
質問者

お礼

いつもありがとうございます $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 "; if($name!==""){ $sql.="and (0 "; $sql.="or `氏名` like concat('%',?,'%') "; $sql.="or `住所` like concat('%',?,'%') "; $sql.=") "; $sql.= " limit {$page},{$perpage}" ; } $sql.= "select count(*) from tbl_test " ; $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 "該当するデータがありません"; } これで合ってますか? 該当者なしとしか出ないですね すいません

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

関連するQ&A

  • mysql

    一覧画面と検索画面を一緒にしています <!--一覧画面 index1.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 = "index1.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> limit10で10件表示にしています 検索のテキストボックスが空だったら全件表示したいのですが今10件しか出ません limitの書く場所が原因でしょうか? またこのように一覧画面と検索結果画面が一緒じゃまずいですかね? 検索結果を別ウインドウじゃなく自分に返したいと思いこのやり方にしたのですがよくないですか?

    • ベストアンサー
    • MySQL
  • 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で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、PDOでの接続とクエリの記述位置

    php初心者です。 (DB:mysqlをphp(PDO)で操作) 最近PDOの勉強をし始めましたが、記述の際に (接続に関する部分)と(クエリに関する部分) の記述位置に関してのルールがはっきりしません。 上記2つを続けて記述をすれば問題なく動くのですが、例えば、 ----------------------------------------------------------------------- try{ $link = new PDO($db, $user, $pass); }catch(PDOException $e){ echo 'データーベースに接続できません。' . $e->getMessage(); } ----------------------------------------------------------------------- だけ先に記述しておき(接続しておいて)、その後htmlやphpの記述をはさみ、 必要な部分で以下のように(クエリ)の記述をした場合、動きません。 <?php $stmt = $link->query('SELECT * FROM booked order by rsvTime asc'); ?> <table border="1"> <tr> <th>予約時間</th> <th class="wdt_at">施術開始</th> <th class="wdt_at">施術終了</th> <th>予約未、済</th> </tr> <?php if (!$stmt) { $info = $link->errorInfo(); exit($info[2]); }                (※ここでクエリしたものを使用)             ↓ while ($row = $stmt->fetch(PDO::FETCH_ASSOC)) { print "<tr>\n"; print "<td>".htmlspecialchars($row["rsvTime"])."</td>\n"; print "<td>".htmlspecialchars($row["startTime"])."</td>\n"; print "<td>".htmlspecialchars($row["finishTime"])."</td>\n"; print "<td>".htmlspecialchars($row["kafuka"])."</td>\n"; print "</tr>\n"; } print "</table>"; ?> ■質問内容 そこで質問です。PDOの接続とクエリの記述位置やその他のルールを 詳しく教えて下さい。 よろしくお願いします。

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

    プログラム初心者です 最近PDO使うようになりましたがまったく使いこなせません 何回もSQL発行して効率わるいコードになりました(--; 一回のSQL発行にまとめる方法はありますか? for ($i=0; $i<$count; $i++) { $id=$Array[$i][0]; $name=$Array[$i][1]; $stmt = $pdo -> prepare("INSERT IGNORE INTO table(id,name) VALUES (?,?)"); $stmt->bindValue(1, $id, PDO::PARAM_INT); $stmt->bindValue(2, $name, PDO::PARAM_STR); $stmt->execute(); } 質問2 prepareのキャッシュを利かすってどうゆうことでしょうか?上の場合でもキャッシュ生かせていますか? よろしくお願いします

    • ベストアンサー
    • PHP
  • MySQLについての質問です

    毎回お世話になっています。 今回も知恵を頂けたらありがたいです。よろしくお願い致します。 下記のようなプログラムを組んだところ、ページを開いたらすぐ全データがが出てくる状態になっています。ページを開いても何もデータが出てこない状態にして検索してからデータが出てくるようにするにはどのように書き換えれば良いのでしょうか? <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title>リーグデータ</title> <link rel="stylesheet" type="text/css" href="../common/style.css"/> </head> <?php error_reporting( E_ALL ^ E_NOTICE ); ?> <body id="list"> <div id="main"> <form name="search_form" action="player_list.php" method="post"> <input type="hidden" name="cmd" value="search" /> <table> <tr> <th class="th_top">選手名</th> <td class="td_top"> <input type="text" name="name" size="30" value="<?php echo $_POST['name'] ?>"> </td> </tr> <tr> <th>チーム名</th> <td> <input type="checkbox" name="team_id[]" value="1" <?php if (isset($_REQUEST['team_id']) and in_array('1',$_REQUEST['team_id'])) print 'checked'; ?>/> 名古屋 <input type="checkbox" name="team_id[]" value="2" <?php if (isset($_REQUEST['team_id']) and in_array('2',$_REQUEST['team_id'])) print 'checked'; ?>/> 徳島 <input type="checkbox" name="team_id[]" value="3" <?php if (isset($_REQUEST['team_id']) and in_array('3',$_REQUEST['team_id'])) print 'checked'; ?>/> 千葉 <input type="checkbox" name="team_id[]" value="4" <?php if (isset($_REQUEST['team_id']) and in_array('4',$_REQUEST['team_id'])) print 'checked'; ?>/> 浦和 <input type="checkbox" name="team_id[]" value="5" <?php if (isset($_REQUEST['team_id']) and in_array('5',$_REQUEST['team_id'])) print 'checked'; ?>/> 磐田<br /> </td> </tr> <tr> <th class="th_middle"> ポジション </th> <td class="td_middle"> FW MF DF GK </td> </tr> </table> <p> <input type="submit" value="検索"> <input type="reset" value="リセット"> </p> </form> <?php try { $dsn = 'mysql:dbname=xxxxx;host=localhost'; $user = 'xxxxx'; $password = 'xxxxxx'; $dbh = new PDO($dsn,$user,$password); $dbh->query('SET NAMES utf8'); $sql = 'SELECT code,name,team_name,price,position,gazou FROM mst_player_market WHERE 1'; $stmt = $dbh->prepare($sql); $stmt->execute(); $dbh = null; if(isset($_POST['name'])) { $name = htmlspecialchars($_POST['name']); print($name); } if(isset($_POST['name'])) { if(!$_POST['name']==true){print ''; }else{ $sqlN ='code IN (SELECT code FROM mst_player_market where name LIKE ("%'.$_POST['name'].'%"))'; $sql.=' and ('.$sqlN.')'; } } if(isset($_POST['team_id'])and is_array($_POST['team_id'])){ $ary = array_filter($_POST['team_id'], function($v) {return is_numeric($v);}); $sqlA = 'code IN (SELECT playerid FROM team WHERE team_id IN ('.implode(',', $ary).'))'; }else{ print ''; $sqlA = ' 1 '; $flag=false; } $sql.=' and ('.$sqlA.')'; if($flag) $sql.="AND 0 ";; //参考 print $sql."<br>"; //実行 $pdo = new PDO($dsn,$user,$password); $stmt = $pdo->prepare($sql); $stmt->execute(); //画像処理 $rows=array(); while($row = $stmt->fetch(PDO::FETCH_ASSOC)){ $rows[]=$row; }; //参考SQL文表示 print_r($rows); print'選手一覧<br /><br />'; print'</form>'; } catch(Exception $e) { print'ただいま障害により大変ご迷惑をお掛けしております。'; exit(); } ?> <?php foreach((array) $rows as $row ){ ?> <tr> <td><img src="../player/<?php print( htmlspecialchars( $row["gazou"], ENT_QUOTES )); ?>" /></td> <td><?php print( htmlspecialchars( $row["team_name"], ENT_QUOTES )); ?></td> <td>\<?php print( htmlspecialchars( number_format( $row["price"] ),ENT_QUOTES ) ); ?></td> <td> <?php print( htmlspecialchars( $row["name"], ENT_QUOTES ) ); ?> </td> <td> <?php print( htmlspecialchars( $row["position"], ENT_QUOTES ) ); ?> </td> </tr> <?php } ?> </table> </div> <!------------mainのdiv--------------> </body> </html>

    • ベストアンサー
    • MySQL
  • PHPでtableをループさせたい!

    【急募!】PHPでMysqlから取り出した値をHTMLのtableで出力したい。 うまくいかなくて困ってます。 今回で2度目の質問となります。今回も急いでおります。 現在、プログラムの勉強をして半年近くになります。本日3/3までに作成を完了しなければならず困っております。 何日か掛けて調べたのですが、まだまだ勉強不足の為に理解が出来ませんでした。 PHPで作成をしております。データベースから取り出した値をHTMLで作成したtableに出力後、tableをデータベースに入っている数だけループさせたいです。※イメージ画像あり おそらくwhile分でループさせれば良いとういうのは理解できるのですが、テーブル自体を増やすやりかたかが解りません。 while(データーベースの値をループさせてひとつずつ出力する。,テーブルも同じ数出力する) 全部取り出したら break で抜ける......となると思うのですが、書き方か解りません。 mysql_fetch_arrayというものもあるようですがまだ理解ができません。 答え合わせになってしまうのが恐縮でございますが、答え合わせのコードを頂けましたら嬉しいです。 まだ理解が浅いため、質問の内容に理解が出来なければ、ご連絡を頂きましたら改善改良をします。 お恥ずかしいですが、ソースを乗せさせて頂きますので宜しくお願い致します。 <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <link href="css/style2.css" rel="stylesheet" type="text/css"> <title>管理画面</title> </head> <body> <div id="main"> <?php $dsn='mysql:dbname=motorlinks;host=localhost'; $user='root'; $password=''; $dbh=new PDO($dsn,$user,$password); $dbh->query('SET NAMES utf8'); $sql='SELECT code,gazou,name,shiyo,price,shiharai,first,sample,comment FROM pone WHERE 1'; $stmt=$dbh->prepare($sql); $stmt->execute(); print'製品一覧<br><br>'; print'<form method="post"action="pone_branch.php">'; ?> <?php while(true) { $rec=$stmt->fetch(PDO::FETCH_ASSOC); if($rec==false) { break; } print $rec['gazou']; print $rec['name']; print $rec['shiyo']; print $rec['price'].'円'; print $rec['shiharai']; print $rec['first']; print $rec['sample']; print $rec['comment']; print'<br>'; }?> <table width="800" border="1" cellpadding="0"> <?php print'<input type="radio"name="ponecode"value="'.$rec['code'].'">'; ?> <tr> <th colspan="2" rowspan="4" scope="col"><?php '<img src="gazou/burank.jpg" width="200" height="150" alt=""/>'; ?></th> <th width="162" height="4" scope="col">Product Name</th> <th width="162" height="4" scope="col">Specification</th> <th width="162" height="4" scope="col">Price</th> <th width="162" height="4" scope="col">Payment</th> </tr> <tr> <td height="63">&nbsp;</td> <td>&nbsp;</td> <td>&nbsp;</td> <td>&nbsp;</td> </tr> <tr> <th width="162" height="4" scope="col">First Order</th> <th width="162" height="4" scope="col">Sample</th> <th width="162" height="4" scope="col">Comment</th> <th width="162" height="4" scope="col">Contact</th> </tr> <tr> <td height=63">&nbsp;</td> <td>&nbsp;</td> <td>&nbsp;</td> <td>&nbsp;</td> </tr> </table> <?php print'<br>'; print'<input type="submit" name="disp" value="参照">'; print'<input type="submit" name="add" value="追加">'; print'<input type="submit" name="edit" value="修正">'; print'<input type="submit" name="delete" value="削除">'; print'</form>'; ?> <br> <a href="index_mo.html">トップメニューへ</a><br> </form> </div> </body> </html>

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

    前に書き込んだのが状況がわかったので再度書きます update.phpでGETで取った番号のデータを表示します 番号は主キーなので変更できないように表示のみにします update.phpのフォームをuptate2.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(); $NAME = htmlspecialchars($row['氏名']); $ADDR = htmlspecialchars($row['住所']); ?> <form action="update2.php" method="post"> 番号<br> <?php echo $ID ?><br> <input type="hidden" name="ID" value="<?php echo $ID; ?>"> 氏名<br> <input type="text" SIZE = "50" NAME="NAME" value="<?php echo $NAME ?>"><br> 住所<br> <input type="text" SIZE = "130"NAME="ADDR" value="<?php echo $ADDR ?>"><br> <input type="submit"> </form> アップデ-トphp 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['ID'],$_POST['NAME'], $_POST['ADDR'])); ?> レコードを修正しました。 今の現状 エラーが出ないでレコードを修正しました。と表示されるがレコードが修正されていない どこがいけないと思いますか?

    • ベストアンサー
    • PHP
  • phpプリペアードステートメントについて質問です。

    phpの練習で、以下のようなhtmlファイルとphpファイルを作り XAMPで作業をおこなっています。 以下にあるhtml.phpファイルでのやり取りはうまくいっているのですが、 このphpをプリペアードステートメントにする所で躓いています。 いろいろ調べてやってはみたものの、どうしても%を使った あいまい検索のところがわかりません。 ---------------------------------------------------------------- 以下、プリペアードステートメントにする前の ページ内容です。こちらではうまくいっています。 html <form method="post" action="kensaku.php"> ご意見コードを入力してください。<br /> <input name="code" type="text" style="width:100px"><br /> <br /> <input type="submit" value="送信"> </form> php <?php $code=$_POST['code']; $dsn = 'mysql:dbname=phpkiso;host=localhost'; $user = 'root'; $password =''; $dbh = new PDO($dsn,$user,$password); $dbh->query('SET NAMES UTF-8'); $sql = "select * from `anketo` where `goiken` like '%{$code}%' "; $stmt = $dbh->prepare($sql); $stmt-> execute(); while(1) { $rec=$stmt->fetch(PDO::FETCH_ASSOC); if($rec==false) { break; } print $rec['code']; print $rec['nickname']; print $rec['email']; print $rec['goiken']; print '<br />'; } $dbh = null; ?> ---------------------------------------------------------------- 以上のphpの中の以下の分を $sql = "select * from `anketo` where `goiken` like '%{$code}%' "; $stmt = $dbh->prepare($sql); $stmt-> execute(); ↓ $sql ="SELECT*FROM anketo WHERE goiken like ?"; $stmt = $dbh->prepare($sql); $data[] = $code; $stmt->execute(array("%$_GET[$data]%")); こんな風に直しては見たのですが、なんだか うまくい行かずです。 よろしければ教えてください。 宜しくお願い致します。

    • 締切済み
    • PHP
  • 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
このQ&Aのポイント
  • 窓際で害虫Gが出現し、業者に駆除と対策を頼んだが、まだ不安が残る。
  • 対策をしっかりしてもらったが、Gの姿を見かけないという安心感がない。
  • 部屋の中を確認し続けることでしか不安が消えず、精神的にも苦しい。
回答を見る