PHPを学ぼう!

▼PHPを学ぶチャプターです。


SMS付き2Gは、900円。
通話付きは、1600円。

 

素材メニュー

 ◆Chapter 1

 ◆Chapter 2

 ◆Chapter 3

 ◆Chapter 4

 

制作ヒント

 ◆制作のヒント

 

レッスンメニュー

 ◆Chapter2 練習問題

 ◆Chapter3 DB練習問題

 

サイト運営者がPHPを学んだ
お勧めの書籍です!
これ一冊で基本的なPHPの仕組み、簡単なプログラムの作成、SQLiteを使ったデータベースなどかなり学べる要素が詰まっています!

↓↓↓ ↓↓↓

PHPレッスンブック―PHP5対応

新品価格
¥2,520から
(2013/2/24 04:38時点)

 

 

サイバーテロの技法について書かれた書籍です!
ハッカーの手法を知ることでご自身のサイトがハッカーに攻撃されたときそれを防ぐ手法を紹介しています。

↓↓↓ ↓↓↓

PHPサイバーテロの技法―攻撃と防御の実際

新品価格
¥1,890から
(2013/11/5 10:09時点)

 

 

★初年度100円! サブドメインやメールアカウントを無制限に設置できます。
PHPやCGIは勿論、WordPress、Movable Type Open Source、掲示板、ブログ、ショッピングサイトなどが簡単に導入できるので複数サイトを運営したい場合に便利なサービスです。

↓↓↓ ↓↓↓

 

PHPが動作するサーバー

 

はじめてのHP | 無料素材 | タグ辞典 | CSSガイドEX | PHPを学ぼう!

◆Chapter 3 - ページ送り(ページャー)機能をつける

データベースから目的のデータを取り出すことができたら、
次にページ送り(ページャー/Pager)の機能を付けてみましょう!

 

「ページ送り?」

 

と思った人、よく思い出してください。
何処かしらで必ず一度は、目にしているはずです。

 

例えば、Google や Yahoo! でキーワード検索をすると、下の方に「次へ」のリンクが表示され、クリックするとページが遷移し次のデータが表示されます。
これがページ送り(ぺージャー)と呼ばれるものです。

 

実はこのページ送り機能を追加することは、データーベースにとってみれば、とても簡単に実現できるのです。
まぁ~、考えてみるとデータの扱いを得意とするデータベースですからある特定の範囲を絞る、つまり条件で絞ることは得意なわけです。
SQLiteも簡易データベースですから、例外ではありません。

 

ではどのようにするのか紹介をしていきましょう!
その前に「DB練習問題4」で紹介しました "LIMIT" 句について思い出してください。

 

"LIMIT" は抽出するデータ数に制限をかけるものでした。
次の例のようなクエリでは、

"SELECT * FROM samples";

全てのデータを抽出してしまいます。
もしこのファイルに数万件のデータが存在し、全てを表示させるようなら処理に時間がかかってしまいサーバーやパソコン、ブラウザ、メモリ、回線に負荷がかかってしまいます。
恐らく何処かで処理能力を超えてしまうでしょう。
それを制限する処理として "LIMIT" 句を紹介しました。

"SELECT * FROM samples LIMIT 20";

とするとことで昇順で20件のデータ抽出に絞ることを学習しました。
しかしこれではページ送りになりませんね・・・。
そこで "OFFSET" 句を付加します。
例えば次のような場合、

"SELECT * FROM samples LIMIT 20 OFFSET 40";

昇順で40件目から20件のデータを抽出することになります。
次の20件のデータを抽出したければ、

"SELECT * FROM samples LIMIT 20 OFFSET 60";

となります。

この "OFFSET" の値を取得してパラメーターで渡してやれば、次のページのデータの取得が可能になるのです。

 

値の算出は簡単です。
1ページに表示するデータ数を設定する、つまり "LIMIT" 数を決めることで "OFFSET" に渡す変数をパラメーターで渡します。
例えば、

$limit = 20;
$offset = isset($_GET['p']) ? intval($_GET['p']) : 0;
$offset = $offset * $limit;
$stmt = $db->query("SELECT * FROM samples LIMIT $limit OFFSET $offset");

とすると、$_GET['p']の値から "OFFSET" の値ができます。
  $offsetの値が1なら、1~20件のデータ、
  $offsetの値が2なら、20~40件のデータ、
  $offsetの値が3なら、40~60件のデータ・・・
のようにデータに対応できるのです。

 

ということは、現在のページの "$offset" の値を +1 したら次のページのパラメーターとなり、-1 にしたら前のページのパラメーターとなります。

 

しかしこれでは、前後のページにデータが存在するのかわかりません。
それを確認する必要があります。

 

では実際に「DB練習問題4 - 曖昧検索機能を作る」の解凍例を参考にしてページ送り機能を作ってましょう。

 

 

【sample_search.php】

01|<html lang="ja">
02|<head>
03|<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
04|<title>ページ送り機能を付ける</title>
05|</head>
06|<body>
07|<?php
08|//actionのページ指定
09|$self_page = "./sample_search.php";
10|
11|//POSTの処理
12|$word =
13|isset($_REQUEST['word']) ? htmlspecialchars($_REQUEST['word']) : "";
14|$submit = isset($_REQUEST['submit']) ? $_REQUEST['submit'] : "";
15|$search_task =
16|isset($_REQUEST['search_task']) ? $_REQUEST['search_task'] : "";
17|
18|//データベースに接続する
19|try{
20|  $db = new PDO("sqlite:data/ejdict.sqlite3");
21|  $db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
22|}catch(PDOException $e){
23|  echo "データベースにアクセスできません".$e->getMessage();
24|  exit;
25|}
26|?>
27|<form action="<?=$self_page;?>" method="POST" name="serach"
28| style="margin:0 0 0 20px; font-size:9pt">
29|<input type="text" name="word" value="" maxlength="16" size="20">
30|<input type="submit" name="submit" value="検索する">
31|</form>
32|<?php
33|if($submit == "検索する"){
34|  $mess="";
35|  $search_task = "off";
36|  if($word==""){
37|    $mess="*キーワードを入力してください。";
38|  }else{
39|    $search_task = "on";
40|    $mess=" ";
41|  }
42|  echo "<p style='font-size:11pt; color:red;'>".$mess."</p>\n";
43|}
44|
45|//データの表示
46|$p = isset($_GET['p']) ? intval($_GET['p']) : 0;
47|$chk = isset($_GET['chk']) ? $_GET['chk'] : 0;
48|$limit = 10;
49|$v_page = $limit + 1;
50|$offset = $p * $limit;
51|
52|if($search_task == "on" || $chk==1){
53|  echo "<h3>【'{$word}' の曖昧検索結果】</h3>";
54|  $stmt = $db->prepare("SELECT * FROM items WHERE word LIKE ?
55|  LIMIT $v_page OFFSET $offset");
56|  $stmt->execute(array($word."%"));
57|  $rows = $stmt->fetchAll();
58|
59|  if(count($rows) > $limit){
60|    array_pop($rows);
61|    $next_num = $p+1;
62|    $pager_next = "<a href='{$self_page}?p={$next_num}
63|    &word={$word}&chk=1'>次へ→</a>";
64|  }else{
65|    $pager_next = "次へ→";
66|  }
67|
68|  if($p > 0){
69|    $prev_num = $p-1;
70|    $pager_prev = "<a href='{$self_page}?p={$prev_num}
71|    &word={$word}&chk=1'>←前へ</a>";
72|  }else{
73|    $pager_prev = "←前へ";
74|  }
75|  $pager_str = "<p style='text-align:center;color:#bbbbbb'>
76|  {$pager_prev}    {$pager_next}</p>";
77|  echo $pager_str;
78|
79|  $i=0;
80|  foreach($rows as $row){
81|    $word = htmlspecialchars($row["word"]);
82|    $mean = str_replace(" / ", "\n", $row["mean"]);
83|    $mean = nl2br(htmlspecialchars($mean));
84|    echo "<h4 style='margin:0; background:#eeeeee;'>$word</h4>\n";
85|    echo "<div style='margin:2px 6px 18px 6px;'>$mean</div>";
86|    $i++;
87|  }
88|
89|  if($i<1){ echo "<p style='margin:0 0 0 20px; font-cloro:red'>
90|検索結果がありません。</p> "; }
91|  echo $pager_str;
92|
93|  //DBから切断する ( $db = null; も可能)
94|  unset( $db );
95|}
96|?>
97|</body>
98|</html>

主に改編した箇所は赤字の部分です。
プログラムの動作確認が、こちらできます。

 

例えば、「book」で検索すると、31件がヒットして10件単位で1ページに表示され、表示結果と共にページ送りの文字、「前へ」と「次へ」が表示されているのが確認できます。

 

ではこのプログラムについて簡単に説明していきます。

 

46~50行は、ページ送りの変数の初期化と計算についての記述ですが、クエリを実行する前であれば任意の箇所に記述できます。

46行目は、ページ送りの基本となるページ数です。
つまり、今何ページ目を表示しているのかを決める変数です。

47行目は、キーワード判定が有効なのかを判断する変数になります。

48行目は、ページに表示するデータ数を "$limit" で設定しています。

49行目の "$v_page" は、このコードで重要な役割をします。
"$v_page" は48行目の "$limit" に "+1" の値を54~55行のクエリに渡すことでデータベースに問い合わせる件数が11件となります。
つまり次のページにデータが存在するのかしないのかを確認できる、ページ送りの判定基準になるわけです。

50行目は、検索開始の位置を算出する計算式です。

52行目の "$chk" はページ送りの処理中かを判定しています。

 

57行目の、

$rows = $stmt->fetchAll();

は、抽出されたデータを一度全部、変数 "$rows" に格納しています。

 

59~66行は、次へのページ送りの処理です。
59行目の判定は、"$v_page" で抽出したデータが "$rows" に代入され11件目のデータが存在するかを判定しています。
その判定内容によりリンクの書き出しを分岐しているのです。
60行目では、"$roes" に11件目のデータが存在するので最後のデータを削除する処理です。
61行目は、次のパラメータとして今のページカウントに "+1" を育成しリンク先に渡しています。

 

68~74行は、前へのページ送りの処理です。
先程とは違いこちらはページが存在するかどうかの判定だけなので、"0" 以上か以下かで判定ができます。
パラメータも次へは、"+" でしたが、今回は "-1" で育成しリンク先に渡しています。

 

 

80~87行は、"$rows" に格納されているデータを表示する処理です。
11件目のデータは削除しましたので10件までで表示します。

 

OFFSET の使い方がわかれば意外と簡単にページ送りが導入できます。

 

 

DB練習問題

 

 

 

 

 

 

 

 

 

 

 

 

 

ex-mode.net | ツールEX | 素材EX | アフィモール | 初級者向 初めてのホームページ作り | Htmlタグ辞典 | 初めてのプランター菜園 | リンク・ボード
気のみ気のままなブログ | CSSガイドEX | ホビ★コレ | 班長日記!

▲UP

Copyright (C) ex-mode.net 2017. All Rights Reserved.