[PHP-users 23847] クエリーしたデータに詳細ページへのリンクを付けたい

Tomonori Ueno tomo-u @ abeam.ocn.ne.jp
2004年 12月 10日 (金) 14:58:23 JST


みなさま、こんにちは。

ご回答いただけましたら、幸いです。
自分のスキルでは手に負えない(ぜひ勉強し自分のものにしたい)と思い
藁にもすがる思いでメールしました。

■やりたいこと
DBから自分の持っているCDのidやタイトルや作者名などをとりだして、
そのタイトルにリンクを自動的に付けて、クリックすると詳細
ページに飛ぶようにしたい。
詳細ページはdataディレクトリに「"id".html」のようにして
置き、もしファイルがない場合は自動で空のページを作成したい。

■私のスキル
アマチュアで、あれこれいじってみて「ああ、こうするのか」
といったレベルです。 プログラミング初心レベルです。
このプログラムもAllaboutJapanのサンプルソースを改変してたまたま
作成できたものですので、残ねーんながら全く白紙から作成できるレベ
ルではありません。

■環境
Linux Debian/Woody カーネル2.2.20
PHP 4.1.2-7.0.1
MySQL 3.23.49-8.6

■以下にソースさらします
<?
//HTMLescape
require_once ( "common.php" );

//HTML文を出力 HTMLの開始
print("<HTML>\n");

//HTML文を出力 HEADの開始
print("<HEAD>\n");

//文字コードをSHIFT_JISと指定
print("<META HTTP-EQUIV=\"Content-Type\" CONTENT=\"text/html; charset=\"EUC-JP\">\n");

//HTML文を出力 TITLEの指定
print("<TITLE>MyCD</TITLE>\n");

//HTML文を出力 HEADの終了
print("</HEAD>\n");

//HTML文を出力 <BODY>の開始
print("<BODY bgcolor=#DADADA>\n");

//HTML文を出力  
print("<b>MyCD</b>\n");

//DBへ接続開始 サーバー名--localhost ユーザー名-- パスワード
--
$dbHandle = mysql_connect("localhost","hoge","huga");

//頁内に表示する行数
$maxline = 20;

//DBの接続に失敗した場合はエラー表示をおこない処理中断
if ($dbHandle == False) {
	print ("can not connect db\n");	
	exit;
}

//GETで渡された?pageを取り出し$pageにセット
$page = $_REQUEST ["page"];

//頁数がセットされていない場合は頁数に1をセット
if ($page < 1) {
	$page = 1;
}

//開始行を算出
$startline =  ($page - 1) * $maxline;

//終了行を算出
$endline   =  $page * $maxline -1;

//db名 mydb
$db = "mydb";

//入力フォーマットに入力されたデータをpostで渡されるので
//$_REQUESTによりフィールド str_key の内容を取り出し $str_keyに格納
$str_key = $_REQUEST["str_key"];
$str_key2 = $_REQUEST["str_key2"];

//条件判断部分
// タイトル/アーティスト名が入っている、ジャンル別が空白の場合の処理
if( $str_key != "" && $str_key2 == "")  {

//SQL文 cdshop表からid列の値が入力フィールドで入力された値と等しい行を抽出
	$sql = "select * from cdshop where title like '%$str_key%' or 
artist like '%$str_key%' or genre like '%$str_key%' order by release desc";



// タイトル/アーティスト名が入っている、ジャンル別も入っている場合の処理
// 両方のキーを併用しての検索が可能になった。
}else if ( $str_key != "" && $str_key2 != "" ) {
	$sql = "select * from cdshop where (title like '%$str_key%' or 
artist like '%$str_key%') and genre = '$str_key2' order by release desc";

}else if ( $str_key == "" && $str_key2 != "" ){
//タイトルやアーティスト名が空白だが、ジャンル別指定だけがある場合。  
	$sql = "select * from cdshop where genre like '%$str_key2%' order 
by artist asc";

}else{
	$sql = "select * from cdshop order by artist asc";
//SQL文を実行する
}
	$rs = mysql_db_query($db,$sql);
	$row = mysql_fetch_array($rs);
	if ($row < 1){
	print "<br><font color=red>このキーワードでは見つかりません</font>";
	exit;
	}


//結果から列数を取得する
$num = mysql_num_fields($rs);

//mysql_num_rows 関数を使用し行数を取得する
$rows = mysql_num_rows($rs);

//取得した行数から最終頁を算出
//ceil(数値)は小数点以下を切り上げる関数
$maxpage = ceil(mysql_num_rows($rs) / $maxline);
?>

<table border=0 width=80% align=center cellpadding=5>
<FORM METHOD=POST NAME="search" action="<? echo $_SERVER[PHP_SELF];?>">
<b>タイトルまたはアーティスト名</b><br>
<INPUT TYPE="text" SIZE="40" NAME="str_key">
<INPUT TYPE="submit" VALUE="検索">
<INPUT TYPE="reset" VALUE="クリア"><BR><br>
<b>ジャンル</b><BR>
<SELECT NAME="str_key2">
 <OPTION VALUE=""SELECTED>- - - -
 <OPTION VALUE="Jazz" >Jazz
 <OPTION VALUE="Rock">Rock
 <OPTION VALUE="Hiphop">Hiphop
 <OPTION VALUE="Pop">Pop
 <OPTION VALUE="R&B">R&B
 <OPTION VALUE="Funk">Funk
 <OPTION VALUE="World">World
 <OPTION VALUE="Classical">Classical
 <OPTION VALUE="Other">Other
</SELECT>
<INPUT TYPE="submit" VALUE="検索">
</FORM>
<?
//現在の頁/最終頁を表示
print("<caption valign='top' align='right'>Page ".$page."/".$maxpage."</caption>");

//cdshop表の列数と同じ回数を繰り返す
for ($i=0;$i<$num;$i++){

//HTML文を出力 列名を <td>で囲んで出力
	print("<td bgcolor=#FFCCCC align=center >".mysql_field_name($rs,$i)."</td>");
}
//mysql_data_seekによりcdshop表内の指定した行に移動する
mysql_data_seek($rs, $startline);

//$iに$startlineを代入
$i = $startline;

//最終行でなく かつ $i<=$endlineの条件の間
//cdshop表から行を取り出す
 while($row=mysql_fetch_array($rs) and $i<=$endline){	
//HTML文を出力 表の行の開始<tr> を出力
	print("<tr>");
	
//cdshop表の列数と同じ回数を繰り返す
	for($j=0; $j<$num; $j++){

//HTML文を出力 列の内容を <td>で囲んで出力
   	print("<td bgcolor=#ffffcc>" . $row[$j] . "</td>" );

}
//HTML文を出力 表の改行</tr> を出力
	print("</tr>");
	
//$iに1を加算
	$i = $i + 1;
}
//HTML文を出力 caption を出力
print("<caption align='bottom'>");

//検索条件をいっしょに送る urlencodeをつかう
$encodedstr_key = urlencode($str_key);
$encodedstr_key2 = urlencode($str_key2);

//現在表示している頁が1ページより後の頁の場合は前の頁のリンクを作成
if ($page > 1) {
		$i = $page - 1;
//HTML文を出力 $pageに指定された頁数をセットしてGETで渡すリンクを作成
	print("<a href='$PHP_SELF?page=". $i ."&str_key=". $encodedstr_key .
"&str_key2=". $encodedstr_key2 . "'>前頁</a>");

}
//現在表示している頁が1ページではなく最終頁ではない場合は前頁と次頁を
//区切る「・」を出力
if ($page <> 1 and $page <> $maxpage) {
	print("・");

}
//現在表示している頁が最終頁より前の頁の場合は前の頁のリンクを作成
if ($page < $maxpage) {
	$i = $page + 1;
//HTML文を出力 .$pageに指定された頁数をセットしてGETで渡すリンクを作成
	print("<a href='$PHP_SELF?page=". $i ."&str_key=" .
		$encodedstr_key . "&str_key2=" . $encodedstr_key2 . "'>次頁</a>");
}
///HTML文を出力 改行
print("<br>");

//出力可能な頁数分繰り返す
for ($i=1;$i<=$maxpage;$i++) {

//現在の頁の時は [ ]で囲む
	if ($i==$page){
		print("[".$i."]");
	} else {
//HTML文を出力 .$pageに指定された頁数をGETで渡すリンクを作成
		print("<a href='$PHP_SELF?page=".$i. "&str_key=" . 
 			$encodedstr_key . "&str_key2=" . $encodedstr_key2 .
			"'>$i</a>");
	}
//最終頁以外では頁間を区切る「・」を出力
	if ($i <> $maxpage) {
		print("・");
	}
}
//HTML文を出力 テーブルの終了を指定
print("</table>");

//HTML文を出力 /caption を出力
	print("</caption>");

//結果レコードをメモリから開放
mysql_free_result($rs);

//DBへの接続を切断
mysql_close($dbHandle);

?>





PHP-users メーリングリストの案内