デジットさんの生活便利サイトトップへ デジットさんの動的リンク2(PHP相対アドレス検知)

トップページ > ホームページ作成 > 動的リンク2

PHPを利用した動的リンクリスト(その2)です。動的ページを静的ページらしく見せています。ここでは、自分の相対アドレスを検知し実行ファイルや相対アドレスへのリンクを自動的に作成します。ファイルを置くディレクトリの位置を気にせず使うことが出来ます。

動的リンクリスト(PHP相対アドレス検知)の作成方法

動的リンクのサンプルリストをベースに作ってみました。
リンクリスト用のCSVファイル「smpl_links_smarty.csv」とSmartyテンプレートファイル「smpl_links_smarty.tpl」は、動的リンクと同じリストを使用しました。実行ファイル「smpl_links_smarty2.php」で、変更した所だけ説明します。urlの引数は、"・・・・/smpl_links_smarty.php?ttl=%E9%9B%BB%E8%BB%8A"という形だったのを、静的ページらしく"・・・・/smpl_links_smarty2/%E9%9B%BB%E8%BB%8A"という形にしました。

動的リンクリスト(PHP相対アドレス検知)のサンプルリスト

実行ファイル「smpl_links_smarty2.php」

引数を"/"をつかって受け渡しているので、ブラウザが判定するリンク用の相対アドレスは引数の"/"の数も関係します。したがって、引数の"/"の数を含めた階層数を相対アドレスに渡す必要があります。引数の最後に"/"をつけない場合は、「$_SERVER['PHP_SELF']で読み取ったパスを含むファイル名を「dirname() 」で判定したディレクトリ数になるようです。引数の最後に"/"をつけた場合は、「dirname() 」で判定した「ディレクトリ数+1」となります。したがって「dirname() 」から"/"の数をカウントし、カウントした数だけ"../"を加えれば、相対アドレスになります。"../"を必要回数繰返した変数は、「$src」です。
「$thispg」は、パスつきのファイル名が入っています。後から"../"を加えるため、最初の"/"は、削除しました。したがって、 "<?a href = \"$src$thispg/"のように、「$src」と「$thispg」をつづけると、このページからブラウザが見た相対アドレスを作ることが出来ます。「$thispg」の後の"/"の次に動的引数を付け加えています。

<?php
//引数を読む$_GET['ttl']
list(,$ttl) = explode('/', $_SERVER['PATH_INFO']);//文字列を'/'で分割する
$title = htmlspecialchars($ttl); //タイトルキーワード
//自分の見かけ上のパスを計算('/'で引数をつた分リンクの相対アドレスが変化する)
$file_name = $_SERVER['PHP_SELF'];
$cnt = substr_count( dirname($file_name) , "/" ); //"/"の出現回数
$cnt = ( !strcmp(dirname($file_name), "/" ) ) ? (0) : $cnt ;//"/"だけだったら0
$src = ($cnt == 0) ? ("./") : str_repeat( "../", $cnt ) ;//自分のファイルまでのパス

//このファイルの本当の相対パス
$file_name = substr_replace($file_name,'', -strlen($_SERVER['PATH_INFO']));//引数削除
$cnt = substr_count( dirname($file_name) , "/" ); //"/"の出現回数
$cnt = ( !strcmp(dirname($file_name), "/" ) ) ? (0) : $cnt ;//"/"だけだったら0
$real_src = ($cnt == 0) ? ("./") : str_repeat( "../", $cnt ) ;
//このファイル名
$thispg = substr_replace($file_name,'',0,1);//このページ(.phpはつけない)最初の"/"削除

//リンクリストを$fnameファイルから読みリンクデータを配列$lists[]にセット
$fname = "smpl_links_smarty.csv";//リンクリストCSVファイル
//ファイルを開く
$file = fopen($fname,"r");
//データを二次元アレイに格納
$knw_ck = 0 ;//リンクリストの階層判定用
while ($arry = fgetcsv($file,1000,",")){
$chng_ck = $arry[0]-$knw_ck;
$kyw = ( $title == $arry[1] ) ? ($arry[1]) : ( "<a href = \"$src$thispg/" .urlencode($arry[1])."\">" .$arry[1]. "</a>"); //リンクキーワードと等しい時はリンクしない
$lists[] = array(
"knw" => $arry[0],//リストの階層
"kyw" => $kyw,
"chng_ck" => $chng_ck,//0:変化なし,1:階層一つ下,-1:一つ上
);
$knw_ck = $arry[0];//次の判定用に現在の階層を記憶
}
//ファイルを閉じる
fclose($file);

//Smartyで結果表示
require_once("/usr/local/lib/php/Smarty/Smarty.class.php");
$smarty = new Smarty();
$smarty -> caching = false;//動的ページなのでキャッシュしないようにする
$smarty -> assign("title",$title);
$smarty -> assign("lists",$lists);
$smarty -> display("./sample/php/smpl_links_smarty.tpl");
?>

ここで、注意しなければならないのは、このページから直接実行するファイル( "<?a href = ""で指定していない)の相対アドレスです。ブラウザ用には「$src」でよかったのですが、直接実行するファイルは、実際あるこのファイルとの位置関係にあります。サーバーが実行しているファイルですから、当然といえば当然です。たとえば、「smpl_links_smarty.csv」は、この実行ファイルと同じディレクトリにおいてありますので、相対アドレス無しの「smpl_links_smarty.csv」だけで指定しないといけません。
同じように、ここでは使っていませんが直接「require」などでファイルを指定する場合の相対アドレスは、「$src」ではなくて、「$real_src」を利用します。「$real_src」は、パスつきファイル名から引数「$_SERVER['PATH_INFO'])」を除いた実際のディレクトリ数を数えてあります。

動的リンクリスト(PHP相対アドレス検知)の動作サンプル

これで、動的リンクリストが出来ました。動作サンプルは、動的リンクリスト(PHP相対アドレス検知)サンプルにあります。動的リンクリストサンプルと全く同じ動作になります。
レンタルサーバーのロリポップでは、動作確認できています。

ホームページを公開するレンタルサーバーは、 ロリポップ! がお薦め、 PHP5を使うならPHP5から選ぼう。

関連ページ

ホームページ作成

PHP5を使う

アフィリエイトをする

PHPの使い方

デジットさんのホームページ入門に移行中

スポンサード リンク

Amazon.co.jpアソシエイト:
PHP&プログラミング

売れている順 新刊順

:%E3%83%97%E3%83%AD%E3%82%B0%E3%83%A9%E3%83%9F%E3%83%B3%E3%82%B0%20php :php2_  :5

とことん!ホームページホームページ入門役立つサイトデジットさんのリストラ日記仮福真琴の精神科医はうそだらけ

2005-2010 Copyright © Digit-01 All Rights Reserved.