PHPを学ぼう!

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


PHPプログラマ 緊急募集!

 

素材メニュー

 ◆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を学ぼう!

◆Answer! - DB練習問題5の答え

【解答】

【sample_search.php】

01|//データの表示
02|$p = isset($_GET['p']) ? intval($_GET['p']) : 0;
03|$chk = isset($_GET['chk']) ? $_GET['chk'] : 0;
04|$limit = 10;
05|$offset = $p * $limit;
06|
07|if($search_task == "on" || $chk==1){
08|  $stmt1 = $db->prepare("SELECT * FROM items WHERE word LIKE ?");
09|  $stmt1->execute(array($word."%"));
10|  $rows1 = $stmt1->fetchAll();
11|  $s_count = count($rows1);
12|
13|  $stmt2 = $db->prepare("SELECT * FROM items WHERE word LIKE ?
14|  LIMIT $limit OFFSET $offset");
15|  $stmt2->execute(array($word."%"));
16|  $rows2 = $stmt2->fetchAll();
17|
18|  $pager_num = floor($s_count / $limit);
19|
20|  echo "<h3>【'{$word}' の曖昧検索結果: {$s_count}件】</h3>";
21|
22|  if($p < $pager_num){
23|    $next_num = $p+1;
24|    $pager_next = "<a href='{$self_page}?p={$next_num}
25|    &word={$word}&chk=1'>次へ→</a>";
26|  }else{
27|    $pager_next = "次へ→";
28|  }
29|
30|  if($p > 0){
31|    $prev_num = $p-1;
32|    $pager_prev = "<a href='{$self_page}?p={$prev_num}
33|    &word={$word}&chk=1'>←前へ</a>";
34|  }else{
35|    $pager_prev = "←前へ";
36|  }
37|  $pager_str = "<p style='text-align:center;color:#bbbbbb'> {$pager_prev}  {$pager_next}</p>";
38|  echo $pager_str;
39|
40|  $i=0;
41|  foreach($rows2 as $row){
42|    $word = htmlspecialchars($row["word"]);
43|    $mean = str_replace(" / ", "\n", $row["mean"]);
44|    $mean = nl2br(htmlspecialchars($mean));
45|    echo "<h4 style='margin:0; background:#eeeeee;'>$word</h4>\n";
46|    echo "<div style='margin:2px 6px 18px 6px;'>$mean</div>";
47|    $i++;
48|  }
49|
50|  if($i<1){
51|    echo "<p style='margin:0 0 0 20px; font-cloro:red'> 検索結果がありません。</p> ";
52|  }
53|  $pager_str;
54|
55|  //DBから切断する ( $db = null; も可能)
56|  unset( $db );
57|}

このプログラムの動作確認がサンプルページ で行えます。

 

主な修正箇所は、"sample_search.php" のデータ表示部分で45~95行内の赤色文字部分となります。
ここではその部分を抜粋して説明していきます。

ポイントはまず8~11行、

$stmt1 = $db->prepare("SELECT * FROM items WHERE word LIKE ?");
$stmt1->execute(array($word."%"));

でキーワードに該当する全データを取得します。

10~11行で "$rows1" に全データを格納し、count 関数でカウント数を取得してから、"$s_count" に代入しています。

$rows1 = $stmt1->fetchAll();
$s_count = count($rows1);

以下の記述は、全データを変数に格納したいときに使える便利な方法です。

$rows1 = $stmt1->fetchAll();

 

13~16行では、同じように "LIMIT" で設定した件数と "OFFSET" を元に "$rows2" に該当するデータを格納します。
この例では、10件迄のデータが格納されることになります。

 

18行目の

$pager_num = floor($s_count / $limit);

は、キーワードで検索された該当データが全て表示するには何ページ必要なのかという計算式です。
つまり、"件数 ÷ リミット" で必要なページ数が取得できます。
floor 関数は小数点以下を切り捨てる処理をします。
半端なページ数、例えば3.33ページを3ページに整数化してページ送りで利用します。

 

22行と41行の「前へ」と「次へ」の分岐は条件を変更することで対応できます。
リンク先を "$pager_str" の変数に代入しているのは検索結果の前と後、すなわち38行目と53行目で表示させる為に一度、変数処理をかけてます。
リンク先の使い回しですね。

 

この方法は、キーワード検索結果のカウント数を取得しますので検索結果数をホームページに表示させることができます。
毎回ページアクセスする毎にデータベースにアクセスし、カウント数を取り直すのに抵抗がある人は、"SESSION" を利用し一度アクセス数を取得したら二度目はしないという処理を施すこともできるでしょう。
そこは、ご自身で挑戦してみてください。

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

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

▲UP

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