PHP PEARのPagerをSmartyで使う

このQ&Aのポイント
  • PEARのPagerを利用してSmartyでページング機能を実装したいが正常に表示されず困っている。
  • MySQLからデータを取得してPagerのパラメータを設定し、ページデータを取得するが、全てのデータが1行目のデータだけ表示されてしまう。
  • データベースへの接続は正常に行えていて、ページャー機能も動作しているため、原因が分からない。
回答を見る
  • ベストアンサー

PHP PEARのPagerをSmartyで使う

初めまして、PEARのPagerを勉強していたのですが、Smartyで実装したいと思い試行錯誤していたらうまく表示されなくて困っています。 【PHP】 //PEARの読み込み、Smartyクラスの読み込み、MySQLクラスの読み込みは省略 //上記は正常に動作しています。 // テーブルの行数を数えます $sql = "SELECT COUNT(*) AS cnt FROM table_name;"; //レコード開始位置指定 $start = 0; //最大レコード数を指定 $limit = 10; // データを取り出すSQLを実行します。 $sql = "select * from table_name ORDER BY no DESC LIMIT $start, $limit"; $result = mysql_query($sql); while($rows = mysql_fetch_array($result)){ $res_data[]=array("title"=>$row['title'],"name"=>$row["name"],"no"=>$row["no"]); } //Pagerのパラメータを指定 $params = array( "itemData" => $res_data, "totalItems" => $limit, "perPage" => 6, "delta" =>5, "mode" =>"Jumping" ); //パラメータの連想配列を受け取る $pager =& Pager::factory($params); // ページデータの割り当て処理 foreach($pager->getPageData() as $item){ $res_data_page[] = $item; } //戻る/次/最初/最後のリンクとページリンクを返す $link = $pager -> getLinks(); //現在のページ番号を返す $currentPageID = $pager -> getCurrentPageID(); // テンプレート用に変数を設定 $smarty->assign('data', $res_data_page); $smarty->assign('pageNavi', $link['all']); $smarty->assign('currentPage', $currentPageID); ■tpl <table border="1"> <tr> <th>名前</th> <th>NO</th> <th>タイトル</th> </tr> {foreach from=$data item=i} <tr> <td>{$i.name}</td> <td>{$i.no}</td> <td>{$i.title}</td> </tr> {/foreach} </table> <p>{$pageNavi}</p> <p>{$currentPage}ページを表示</p> 参考URL http://meerweb.blog7.fc2.com/blog-entry-101.html データベースへの接続は出来ていて、ページャー機能は動いています。 取得しているデータ数もあっているのですが、全部1行目のデータだけ表示されます。 どなたか原因が分かる方いらっしゃいましたら、是非ともご教授ください。 よろしくお願い致します。

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

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

  • ベストアンサー
  • freetaka
  • ベストアンサー率53% (106/197)
回答No.1

1行目だけ表示されるというのが気になりますね 切り分けの為にまずはデータを追ってみたらどうでしょう tplの修正 {* 配列チェック *} {if is_array($data)} 配列である {else} 配列ではない {/if} {* 配列内に、調べたいデータが存在するかどうか *} {if in_array('調べたいデータ',$data)} 存在する {else} 存在しない {/if} <table border="1"> <tr> <th>名前</th> <th>NO</th> <th>タイトル</th> </tr> {foreach from=$data item=i} <tr> <td>{$i.name}</td> <td>{$i.no}</td> <td>{$i.title}</td> </tr> {/foreach} </table> まずはこれで実施 $smarty->assign('data', $res_data_page); ↓ 次にこれで実施 $smarty->assign('data', $res_data); としてSmartyテンプレート側で表示チェックをして Pagerのパラメータ指定以前以降の処理で 問題を切り分けしたほうがよさそうですね

tetujapan
質問者

お礼

回答ありがとうございます。 試行錯誤の結果、エラー箇所がわかり、直りました! 助かりました。

関連するQ&A

  • 【PHP】smartyとPHPの記述違いとメリット

    smartyというのが、デザインとプログラムを分けれるというので 使ってみたのですが、 //--------------------smarty--------------------- <table border=1> <tr> <th>{$table.title}</th> </tr> {foreach item=result from=$data_list} <tr> <td>{$result[0]}</td> </tr> {/foreach} </table> と、smarty用の記述をHTML内にいろいろ書かなければならず //------------------php---------------------- <table border=1> <tr> <th><?=$table[title] ?></th> </tr> <?php foreach($data_list as $key => $value){ ?> <tr> <td><?= $value ?></td> </tr> <?php } ?> </table> とHTML内にPHPをいろいろ書くのと  あまり大差無い気がして どういう点がよいのがイマイチ分かりません。 smartyは 使う メリットは どういうものがあるのでしょうか。

    • ベストアンサー
    • PHP
  • PHPとSmartyの関連について

    PHPとSmartyの関連について PHPからSmartyに出力しているのですが中身がNULLになります。 データベースアクセスにはPDOを使用しています。 PHPソース DBアクセス $SQL = "select ITEM_ID from ITEM_TBL limit 0, 3"; $STMT = $GLOBALS["PDO"] -> query($SQL); $ROW = $STMT -> fetchAll(PDO::FETCH_ASSOC); Smartyでアサイン $smarty -> assign("ITEM_LIST", $ROW); Smartyソース <table> {{foreach from=$ITEM_LIST item=LIST}} <tr> <td>{{$LIST.ITEM_ID}}</td> </tr> {{/foreach}} </table> のような感じでページ出力したいのですが、表示をすると中身がNULLでした。 PHP側で var_dump($ROW); を行うと array(3) { [0]=> array(1) { ["ITEM_ID"]=> string(1) "1" } [1]=> array(1) { ["ITEM_ID"]=> string(1) "2" } [2]=> array(1) { ["ITEM_ID"]=> string(1) "3" } } 中身が配列で格納されています。 smarty側で {$ITEM_LIST|@var_dump} を行うと array(3) { [0]=> NULL [1]=> NULL [2]=> NULL } でした。 いろいろとやってみたのですが、わからなくなってしまったので どなたかご教授いただけませんでしょうか。よろしくお願いします。

    • 締切済み
    • PHP
  • pearのpagerに関しまして

    pearのpagerを使用してページングの機能を追加しようとしたのですが、 次のような警告がでて、データの出力がされません。 Notice: Undefined variable: res3 in /var/www/html/***.php on line 215 Warning: pg_fetch_result(): supplied argument is not a valid PostgreSQL result resource in /var/www/html/***.php on line 215 for文でsqlを回す際に、適切に変数が入っていないようなのですが、 原因がわかりません。 どなたか分かる方、教えていただけますでしょうか。 よろしくお願いいたします。 #SQLを実行する $res3 = pg_query($dbcon, "SELECT status, city, address, line, station, bus, walk, rent, floor_space, parking, remark FROM estates LEFT OUTER JOIN cities USING (city_id) LEFT OUTER JOIN stations USING (station_id) LEFT OUTER JOIN lines USING (line_id) WHERE prefecture_id = '{$prefecture_id}' and status = '{$status}' and floor_space >= '{$floor_space_lower}' and floor_space <= '{$floor_space_upper}' and rent >= '{$rent_lower}' and rent <= '{$rent_upper}' and parking >= '{$parking_lower}' and parking <= '{$parking_upper}' ORDER BY station_id"); #失敗したとき、どんなSQLが失敗したかをエラーとして出力する if (! $res3) { trigger_error("query fail: ". $sql3); exit; } if (pg_num_rows($res3) == 0) { echo("<tr align = \"center\"><td colspan=\"11\"><br><b>現在、該当する情報はありません。</b><br></td></tr>"); } else { require_once("Pager/Pager.php"); function showPage($start,$cnt){ #SQL実行結果の行数だけ繰り返し for ($i = $start; $i < $start+$cnt; $i++) { #SQL実行結果を取り出して、HTML用にエスケープ処理をする $status = pg_fetch_result($res3, $i, 'status'); $city = pg_fetch_result($res3, $i, 'city'); $address = pg_fetch_result($res3, $i, 'address'); $line = pg_fetch_result($res3, $i, 'line'); $station = pg_fetch_result($res3, $i, 'station'); $bus = pg_fetch_result($res3, $i, 'bus'); $walk = pg_fetch_result($res3, $i, 'walk'); $rent = pg_fetch_result($res3, $i, 'rent')/10000; $floor_space = pg_fetch_result($res3, $i, 'floor_space'); $acreage = pg_fetch_result($res3, $i, 'floor_space')*0.3025; $rent_per_acreage = pg_fetch_result($res3, $i, 'rent')*0.00033/pg_fetch_result($res3, $i, 'floor_space'); $parking = pg_fetch_result($res3, $i, 'parking'); $remark = pg_fetch_result($res3, $i, 'remark'); #取り出したデータを出力する echo("<tr align = \"center\"> <td nowrap>{$status}</td> <td nowrap>{$city}<br>{$address}</td> <td nowrap>{$line}<br>{$station}</td> <td nowrap>{$bus}分<br>{$walk}分</td> <td nowrap>{$rent}万円</td> <td nowrap>{$floor_space}m2<br>{$acreage}坪</td> <td nowrap>{$rent_per_acreage}万円</td> <td nowrap></td> <td nowrap>{$parking}台</td> <td nowrap>{$remark}</td> </tr>"); } } $perPage=15; $params=array( "perPage"=>$perPage, "tatalItems"=>pg_num_rows($res3), "firstPagePre"=>"{", "firstPageText"=>"先頭", "firstPagePost"=>"}", "lastPagePre"=>"{", "lastPageText"=>"先頭", "lastPagePost"=>"}"); $o_page=Pager::factory($params); $navi=$o_page->getLinks(); showPage(($o_page->getCurrentPageID()-1)*$perPage,$perPage); print($navi['all']); }

    • 締切済み
    • PHP
  • Smarty 三次元配列を使いたい

    最近Smartyを使い始めた者です。 以下のような多次元配列を、$smarty->assign('data', $data); します。 $data = array( [0] => array( [id] => 23 [comment] => 'aaa' [name] = array( [0] => 'xxx' [1] => 'yyy' )) [1] => array( [id] => 24 [comment] => 'bbb' [name] = array( [0] => 'zzz' )) [2] => array( [id] => 25 [comment] => 'ccc' [name] = array( [0] => 'ttt' [1] => 'uuu' )) ) そして、以下のようなテーブルを表示させたいのです。 |-------------------| | 23  | aaaa | xxxx | |    |     |------| |    |     | yyyy | |-------------------| | 24  | bbbb | zzzz | |-------------------| | 25  | cccc | tttt | |    |     |------| |    |     | uuuu | |-------------------| <td>タグのrowspan属性を使おうと思っています。 {foreach}をつかって、以下のようなものを書きましたが、駄目でした。 {foreach from=$data item=value01 name=kiji} <tr> <td rowspan="{$value01.numgoods}">{$value01.id}</td> <td rowspan="{$value01.numgoods}">{$value01.comment}</td> {foreach from=$value01 item=value02 name=goods} {if $smarty.foreach.goods.first} <td>{$value02.name.0]</td></tr> {else} <tr> <td>{$value.name.1}</td> </tr> {/if} {/foreach} {/foreach} エラー表示は、 syntax error: unrecognized tag: $value02.name.0 です 本当は、$value02.name の.0を三次元での要素数分だけ自動でループしてほしいのですが、その書き方がわかりません。 ネットをあさっても、これと言うサイトを見つけれません。 そもそも、三次元目の要素を取得するsmartyの方法がわかりません。 どなたかご教授の程、よろしくお願いいたします。

    • ベストアンサー
    • PHP
  • PEARのPagerの設定の仕方

    初心者です。 ホームページでDBを利用しているのですが、データ量が多くなるのでページ送り機能をつけたいのでどうすればいいか探していたところ、PEARのPagerを使えばできるとわかりました。 しかしどうもうまくいきません。 Pagerのフォルダもきちんとアップロードしてやってみたのですがうまくいきません。 やりたいのは登録数300件のデータベースの検索結果で、10件ごとにページ送りします。ページ送りは検索結果の最下部におきたいです。 以下のソースのどこに加えればいいか教えていただけないでしょうか。 何度も試してみたんですが、ページ送りしてくれないのです。 よろしくお願いいたします。 <?php extract($_POST); 検索項目のフォーム×3 if($sig=="kb"){ mysql_connect('ほにゃらら','データベース名','パスワード'); mysql_select_db('データベース名'); 検索区分 //クエリの作成 $sql = "select * from データベースの項目 where "; if($wxxx<>""){ 省略 } //本検索 $result = mysql_query($sql); $rows = mysql_num_rows($result); if($rows == 0){ print "検索結果なし"; exit; } else { echo "<b>", $rows, "</b>件HITしました<br />\n"; while($row = mysql_fetch_array($result)){ print("<table>"); print("<tr><td scope='row' rowspan='3'>".$row[""]."</font></td><td>タイトル</td>"); print("<td>".$row["title"]."</td></tr>"); print("<tr><td>項目A<td><td>".$row["koumokua"]."</td></tr>"); print("<tr><td>項目B</td><td>".$row["koumokub"]."</td></tr>"); print("</table>");} } } ?>

    • 締切済み
    • PHP
  • SQL及びSMARTYの利用

    お世話になります SMARTYとmySQLを利用してサイトを構築しています。 下記の様なSQLデータからデータを一行ずつ生成したいです。 名前だけは取り出すことが出来たのですが、年齢の取り出し方が判りません。 アドバイスをお願い致します SQL------------------------------------------------------------------- ---------------------------- | id | namae | age | ---------------------------- | 1 | 田中 | 22 | ---------------------------- | 2 | 佐藤 | 29 | ---------------------------- PHP------------------------------------------------------------------- //空の配列を用意 $name = array(); //SMARTY用の代入変数を生成 while($data = $res -> fetchRow()){ array_push($name,mb_convert_encoding($data['namae'],"SJIS","UTF-8")); } $smarty->assign("namae",$name); HTML------------------------------------------------------------------ {foreach from=$namae item=namae} {$namae}{$age}<br> {/foreach} ----------------------------------------------------------------------

    • ベストアンサー
    • PHP
  • データの表示の仕方について教えてください(PEAR PAGERの使い方)

    PHP5.2.4 MYSQL14.12DISTRIB5.0.4 WINXP IE=6.0 PEAR PAGERを使って、1ページに10件ずつ表示されるようにしたくて、下のようなコードを書きました。不具合として、1ページ目の10件表示はされるのですが、2ページ目、3ページ目といどうさせても表示が1から10件目とおなじになります。結果セットからのデーターの表示の仕方がおかしいと思ってるんですが、どういうふうにしていいのか 全く判りません。どなたか、素人にも判るようにご教授いただけたらと思います。宜しくお願いいたします。 <?php require_once 'Pager/Pager.php'; $totalItems = 47; $perPage=10; /*ページャーのパラメーター設定 モード:スライディング ページごとの表示数(perpage)カレントページの前後の表示ページ数(dalta)アイテムの数(totalitem)  */ $params = array( 'mode' => 'sliding', 'perPage' => $perPage, 'delta' => 5, 'totalItems' => $totalItems ); /*ページャーインスタンスの生成*/ $pager =& Pager::factory($params); /*ページのデータの取得*/ $links = $pager->getLinks(); print($links["all"]); /*現在のページ番号を取得して配列に入れる*/ $currentPageID = $pager->getCurrentPageID();  /*ページIDのオフセット値を返す*/ $index=($currentPageID-1)*$perPage+1;          if($rows==0){ /* 取り出すデーターがないとき、エラーメッセージを表示 */    print "該当するデータが見つかりませんでした。\n";  }else{ for($i=$index;$i<$index+$perPage;$i++){   if($i<=$totalItems){ $row=mysql_fetch_array($result) ?> <div align="center"> <TABLE border="1"> <TR> <TD colspan="2" width="500" align="center"><?=$row["e"] ?></TD> </TR> <TR> <TD height="45"><?=$row["setumei"] ?></TD> </TR> </TABLE><br><br> <div> <?php } } } ?>

    • 締切済み
    • PHP
  • smartyで同じテンプレートを使いまわす

    list.tpl {foreach from=$data key=key item=row loop=test} <tr><td>{$row.name}</td>:<td>{$row.kokugo}</td><td>{$row.sansu}</td></tr> {/foreach} ----- index.tpl(一部) <h2>男の子</h2> {include file=list.tpl} <h2>女の子</h2> {include file=list.tpl} ----- index.php(一部) $Smarty -> assign( "data", $boy ); $Smarty -> assign( "data", $girl ); $Smarty -> display( 'index.tpl' ); (実際にこの書き方は間違っていますが…) index.php から index.tpl を display したいのですが、 この中で使うリストを、使いまわしたいと考えています。 こういうやり方はそもそも可能なのでしょうか? たしかに boylist.tpl 、 girllist.tpl とし中の割当変数を $boy 、 $girl に変えればいいのですが、 将来変更が加わった際に両方変えなければなりません。 今回は例なので男女ですが、もっと多くの要素が出て来た時に 厄介なことになるように思います。 何か解決方法はありませんでしょうか?

    • ベストアンサー
    • PHP
  • smartでのtable表示について

    ちょっとベタな書き方ですが下記のように、画像と名前のセットを表示して行く時に、 最後、余ったセルに{html_table}などを使って自動的に埋めて行く事は、出来ますでしょうか、 <table width="650" border="0" cellspacing="0" cellpadding="0"> {foreach from=$data item=data key=key name="loop"} {if $smarty.foreach.loop.iteration %5 ==1}<tr>{/if} <td> <table width="125" border="0" cellspacing="0" cellpadding="1"> <tr> <td><a href="{$data.id}.php"><img src="img/{$data.staff_file}" width="125" height="175" border="0"></a> </td></tr> <tr> <td>{$data.name} </td> </td></tr> </table> </td> {if $smarty.foreach.loop.iteration % 5 ==0}</tr>{/if} {/foreach} {if $smarty.foreach.loop.total % 5 ==4}<td> </td>{/if} {if $smarty.foreach.loop.total % 5 ==3}<td> </td><td> </td>{/if} {if $smarty.foreach.loop.total % 5 ==2}<td> </td><td> </td><td> </td>{/if} {if $smarty.foreach.loop.total % 5 ==1}<td> </td><td> </td><td> </td><td> </td>{/if} </table>

    • ベストアンサー
    • PHP
  • 自動で増えてくれるPHP

    以前に質問させて頂いた内容をもとに、以下のようなものを作成しました。 以前の質問 → http://okwave.jp/qa/q6858703.html 作成したもの ↓ 【Aサーバ】「a.txt」(データ用) $name01='一子'; $age01='11'; $name02='二郎'; $age02='22'; 【Bサーバ】「b.html」(表示用) <?php $data = file_get_contents ('http://www.A/a.txt'); foreach (explode("\n" , $data) as $value) { if (preg_match ("/\\$(.+)='(.+)'/", $value, $matches)) { $$matches[1] = $matches[2]; } } echo '<table>'; echo '<tr><th>'.$name01.'</th><td>'.$age01.'</td></tr>'; echo '<tr><th>'.$name02.'</th><td>'.$age02.'</td></tr>'; echo '</table>'; ?> ここで質問なのですが、↑のような仕組みで、a.txtの中身が $name03='三太'; $age03='33'; $name04='~~'; $age04='~~'; と増えていった場合、b.htmlの echo '<tr><th>'.$name~~.'</th><td>'.$age~~.'</td></tr>'; が自動的に増えてくれるようなものを作りたいと考えています。 配列(?)を使うという方法も調べてみたのですが、分からず……。 ご教示願います。

    • ベストアンサー
    • PHP

専門家に質問してみよう