php+MySqlでの検索結果について
以下のソースで検索結果が表示されるのですが、検索結果が多数ある場合、例えば10件ずつ表示して「次へ」「前へ戻る」「最終頁」等のリンクを貼る方法が分かりません。
また、検索結果から並べ替え(データの更新日時等から)も出来ればと思い質問させていただきました。
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "ttp://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
<title>検索</title>
</head>
<body>
<?php
# 入力値に不正なデータがないかなどをチェック。
function checkInput($var) {
if (is_array($var)) {
return array_map('checkInput', $var);
} else {
if (get_magic_quotes_gpc()) { // magic_quotes_gpc対策
$var = stripslashes($var);
}
if (preg_match('/\0/', $var)) { // NULLバイト攻撃対策
die('不正な入力です。');
}
if (!mb_check_encoding($var, 'UTF-8')) { // 文字エンコードの確認
die('不正な入力です。');
}
return $var;
}
}
function h($string) { // HTMLでのエスケープ処理をする
return htmlspecialchars($string, ENT_QUOTES);
}
# POSTされたデータをチェック。
$_POST = checkInput($_POST);
// データベース設定
$dbServer = 'localhost';
$dbUser = 'user';
$dbPass = 'password';
$dbName = 'sample';
$flag = TRUE;
// MySQLデータベースに接続
if (!$link = mysql_connect($dbServer, $dbUser, $dbPass)) {
$flag = FALSE;
}
// データベース選択
else if (!mysql_select_db($dbName, $link)) {
$flag = FALSE;
}
// 文字エンコードの指定(PHP5以降かつMySQL 4.1以降)
else if (!mysql_set_charset('utf8', $link)) {
$flag = FALSE;
}
# $flagの値の判定
if ($flag === FALSE) {
echo 'データベースエラー';
} else if (isset($_POST['data'])) {
$data = $_POST['data'];
$dataList = explode(' ', mb_convert_kana($data, 's'));
$sql = 'SELECT * FROM search WHERE 1';
foreach ($dataList as $word) {
if ($word == '') continue;
$sql .= sprintf(" AND data LIKE '%s'",
'%' . mysql_real_escape_string($word) . '%');
}
echo '<p>SQL: ' . h($sql) . '</p>';
$query = mysql_query($sql, $link);
if (!$query) {
echo 'データベースエラー';
} else if (mysql_num_rows($query) == 0) {
echo '<p>「' . h($data) . '」はデータベースに登録がありません。</p>';
} else {
echo '<p>「' . h($data) . '」はデータベースに登録がありました。</p>';
echo '<p>検索結果</p>';
echo '<table border="1">';
echo ' <tr>';
echo ' <th>ID</th>';
echo ' <th>データ</th>';
echo ' </tr>';
while ($row = mysql_fetch_array($query, MYSQL_ASSOC)) {
echo ' <tr>';
echo ' <td>' . h($row['id']) . '</td>';
echo ' <td>' . h($row['data']) . '</td>';
echo ' </tr>';
}
echo '</table>';
}
$sql = 'SELECT * FROM search';
$query = mysql_query($sql, $link);
if (!$query) {
echo 'データベースエラー';
} else {
echo '<p>データベースの内容一覧</p>';
echo '<table border="1">';
echo ' <tr>';
echo ' <th>ID</th>';
echo ' <th>データ</th>';
echo ' </tr>';
while ($row = mysql_fetch_array($query, MYSQL_ASSOC)) {
echo ' <tr>';
echo ' <td>' . h($row['id']) . '</td>';
echo ' <td>' . h($row['data']) . '</td>';
echo ' </tr>';
}
echo '</table>';
}
}
?>
<form method="post" action="">
<p>検索ワードを入力して下さい</p>
<input type="text" name="data" />
<input type="submit" value="検索する" />
</form>
</body>
</html>
このソースのどの部分に記述してよいのか等も含めてご伝授頂きたく思います。
宜しくお願いします。
お礼
ありがとうございました。 ご指摘の通り、DISTINCTを書いていなかった・・・というか、DISTINCTという命令を知りませんでした(恥ずかしい)