質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
HTML5

HTML5 (Hyper Text Markup Language、バージョン 5)は、マークアップ言語であるHTMLの第5版です。

MySQL

MySQL(マイエスキューエル)は、TCX DataKonsultAB社などが開発するRDBMS(リレーショナルデータベースの管理システム)です。世界で最も人気の高いシステムで、オープンソースで開発されています。MySQLデータベースサーバは、高速性と信頼性があり、Linux、UNIX、Windowsなどの複数のプラットフォームで動作することができます。

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

Q&A

解決済

1回答

7412閲覧

PHP 検索をしてMySQLから取得・表示させたデータごとのページを作りたい

scksck

総合スコア27

HTML5

HTML5 (Hyper Text Markup Language、バージョン 5)は、マークアップ言語であるHTMLの第5版です。

MySQL

MySQL(マイエスキューエル)は、TCX DataKonsultAB社などが開発するRDBMS(リレーショナルデータベースの管理システム)です。世界で最も人気の高いシステムで、オープンソースで開発されています。MySQLデータベースサーバは、高速性と信頼性があり、Linux、UNIX、Windowsなどの複数のプラットフォームで動作することができます。

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

0グッド

0クリップ

投稿2016/03/28 16:40

編集2016/03/28 16:41

###前提・実現したいこと
◎つくっているもの
情報検索サイトのようなものを作っています。

◎実現したい機能
クックパッドで例えます。ユーザーは、トップページで知りたい料理方法を検索欄に入れ検索したら、検索ワードに引っかかったものがデータベースから「検索一覧として表示」され、そこから知りたい料理を「クリックし、そのページに飛び」ます。これと同じ機能を実装したいのですが、上手くいきません。

特に「」の部分を実現したいです。
もう一度分けて詳しく書くと

A:検索一覧ページにて、データベースから表示させた文章にリンク機能をつけ
B:Aができたうえで、それをクリックしたら検索一覧ページから個別の情報のページにリンクし、クックパッド(ニコ動とかとも同じ)のようにその詳細を表示したい。

です。

###発生している問題・エラーメッセージ
長々と書きましたが、「検索一覧ページから個別情報ページにリンクさせるコードが分からない」です。

###ソースコード
search.php

PHP

1<?php 2 3 4 //データを取得する 5 $keyword = $_GET["op_search"]; 6 7 $con = mysql_connect('localhost', 'root', 'root'); 8 if (!$con) { 9 exit('データベースに接続できませんでした。'); 10 } 11 12 $result = mysql_select_db('xxx', $con); 13 if (!$result) { 14 exit('データベースを選択できませんでした。'); 15 } 16 17 $result = mysql_query('SET NAMES utf8', $con); 18 if (!$result) { 19 exit('文字コードを指定できませんでした。'); 20 } 21 $result = mysql_query("SELECT * FROM sp WHERE title LIKE '%$keyword%' ORDER BY reg_date_sp DESC", $con); 22?> 23 24<table> 25 <tr> 26 <td>タイトル</td> 27 <td>引用元</td> 28 <td>意見</td> 29 </tr> 30 31<?php 32 while ($data = mysql_fetch_array($result)) { 33 echo "<tr>"; 34 echo "<td>" .$data['1']."</td>"; 35 echo "<td>" . $data['2']."</td>"; 36 echo "<td>" . $data['4'] ."</td>"; 37 echo "</tr>"; 38 } 39 40 41 ?> 42</table> 43 44<?php 45 $con = mysql_close($con); 46 if (!$con) { 47 exit('データベースとの接続を閉じられませんでした。'); 48 } 49?> 50

###補足情報(言語/FW/ツール等のバージョンなど)
PHPのバージョンは5.6.10です。

表現力が乏しく皆様の想像で補ってもらう部分の多い文章となってしまいましたが、どうぞ宜しくお願い致します。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

通常はデータベースから検索した結果のユニークなid列をパラメーターとして詳細表示ページに渡します。AタグのhrefにGETパラメータとしてidを追加します。
通常のテーブル構造では最初の列がid列ですので、以下の例ではクエリ結果の$row[0] をidとしています。

PHP

1<? 2 $result .= "<td><a href='result.html?id=" . $row[0] . "'>" . htmlspecialchars( $row[1], ENT_QUOTES) . "</a></td>\n"; 3?>

結果は以下のようなHTMLソースコードになります。

HTML

1<td><a href='result.html?id=2'>タイトル1</a></td>

クックパッドのようにhttp://hogehage.com/archives/1234567 のような数字ベースで運用する場合には以下のようにします。

PHP

1<? 2 $result .= "<td><a href='archives/" . $row[0] . "'>" . htmlspecialchars( $row[1], ENT_QUOTES) . "</a></td>\n"; 3?>

前の質問の回答にもある通り、十数年前のPHPが普及しだした初期に比べ現在はセキュリティー上の危険が非常に多いのでPDOなどを使ってデータベースに接続するのが推奨されています。

PDOを使った回答のサンプルを書いておきます。
(mysqlは詳しくないので間違っていたら補足お願いします)

PHP

1<? 2 //自作関数の読込 3 include( "../../include/function.inc" ); 4 5 //変数初期化 6 $result = ""; 7 $keyword = ""; 8 9 if( !empty( $_GET["op_search"] ) ) { 10 //GETパラメーターを消毒して代入 11 $keyword = sanitize( $_GET["op_search"] ); 12 } 13 14 //データベースへの接続設定項目 15 //本来はconfig.incなど別の設定ファイルに記述してインクルードします。 16 $db_name = "testdb"; 17 $db_user = "testdb01"; 18 $db_pword = "hogehoge123"; 19 $table = "post_data"; 20 $limit = 10; 21 22 try { 23 $option = array( 24 PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION, 25 PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_NUM, //添字を0 から始まるカラム番号にする 26 PDO::MYSQL_ATTR_USE_BUFFERED_QUERY => true, 27 PDO::ATTR_EMULATE_PREPARES => false, 28 PDO::ATTR_STRINGIFY_FETCHES => false 29 ); 30 //データベースに接続 31 $con = "mysql:host=localhost;dbname=$db_name;charset=utf8"; 32 $pdo = new PDO( $con, $db_user, $db_pword, $option ); 33 $pdo->query('SET NAMES utf8' ); 34 } catch ( PDOException $e ) { 35 $result = $e->getMessage(); 36 } 37 if( empty( $result ) ) { 38 try { 39 if( !empty( $keyword ) ) { 40 //キーワードが渡された場合 41 $sqls = "SELECT * FROM $table where title like :srh limit $limit"; 42 $sql = $pdo->prepare( $sqls ); 43 //Like検索文字列を作成する 44 $srh_string = "%" . $keyword ."%"; 45 //検索文字列をプレースホルダにバインド 46 $sql->bindValue( ":srh", $srh_string, PDO::PARAM_STR); 47 } else { 48 //キーワードが空の場合 49 $sqls = "SELECT * FROM $table limit $limit"; 50 $sql = $pdo->prepare( $sqls ); 51 } 52 //キーワード検索クエリを実行 53 $ret = $sql->execute(); 54 if( !$ret ) { 55 $info = $sql->errorInfo(); 56 $result = $info[2]; 57 } 58 } catch ( PDOException $e ) { 59 $result = $e->getMessage(); 60 } 61 if( empty( $result ) ) { 62 //結果テーブル文字列の作成 63 $result = "件数:" . $sql->rowCount() . "件<br>\n"; 64 $result .= "<table><tr><td>タイトル</td><td>引用元</td><td>引用文</td><td>意見</td></tr>"; 65 //行があるだけループする 66 while( $row = $sql->fetch() ) { 67 $result .= "<tr>\n"; 68 $result .= "<td>" . $row[0] . "</td>\n"; 69 // id列をリンク先のURLにパラメーターとして渡す 70 $result .= "<td><a href='result.html?id=" . $row[0] . "'>" . htmlspecialchars( $row[1], ENT_QUOTES) . "</a></td>\n"; 71 $result .= "<td>" . htmlspecialchars( $row[2], ENT_QUOTES) . "</td>\n"; 72 $result .= "<td>" . htmlspecialchars( $row[3], ENT_QUOTES) . "</td>\n"; 73 $result .= "<td>" . htmlspecialchars( $row[4], ENT_QUOTES) . "</td>\n"; 74 $result .= "</tr>"; 75 } 76 $result .= "</table>\n"; 77 } 78 } 79 $pdo = null; 80 81 //結果を表示する 82 print $result; 83?> 84<form class="navbar-form navbar-left" method="get" role="search" action=""> 85 <div class="form-group"> 86 <input type="text" class="form-control" placeholder="フリーワード" name="op_search"> 87 </div> 88 <button type="submit" class="btn btn-default">検索</button> 89</form> 90

動作確認環境
WADAX WX共用サーバー PHP Version 5.3.3 MySQL 5.1.73
Windows 8.1 Pro 64bit Firefox45.0.1

投稿2016/03/28 23:44

編集2016/03/28 23:53
chinyato

総合スコア241

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

scksck

2016/03/29 15:45

chinyato さん 回答ありがとうございます。 今から試してみます。初心者のため、用語や仕組み等理解→実装をするのに時間がかかりそうなので、ひとまずお返事を書かせていただきました。 また、出来次第ここにコメントさせていただきます。
scksck

2016/04/07 02:53

あれから作業にとりかかることが出来ず解決出来るかは分かっておりませんが、唯一の回答ということでベストアンサーとさせていただきました。 回答ありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問