人力検索はてな
モバイル版を表示しています。PC版はこちら
i-mobile

phpについて質問です。
わたしはphpのことは、ほとんど無知ですが、
やむを得ずやらなければいけない状況なので、力を貸してください。

あるWEBサイトの新着情報のページを制作していて、
1ページの中に、上から新しい順に記事を掲載したいと思っています。
各記事には画像と原稿があり、それぞれフォルダを作って入れています。

上から記事A、記事B、記事Cとした場合、
フォルダ内の更新日時が一番新しい画像をAに、二番目に新しい画像をBに、三番目に新しい画像をCに表示されるように、
phpで設定したいのですが、可能でしょうか?原稿も.txtファイルを同様に表示したいです。

どなたか力を貸してください!!


●質問者: helpme1111
●カテゴリ:ウェブ制作
✍キーワード:PHP txt webサイト ほと ファイル
○ 状態 :終了
└ 回答数 : 7/7件

▽最新の回答へ

1 ● hanako393
●5ポイント

可能です

・ファイル一覧

http://www.project-nya.jp/modules/weblog/details.php?blog_id=380

・ファイルの更新日取得

http://blog.loaferz.com/?eid=226594

◎質問者からの返答

回答ありがとうございます。

すみません、一覧や更新日を表示させたいのではなく、

質問に書いた通り、更新日時が一番新しい順に、

画像ファイルやテキストファイルを表示させたいんです。


2 ● koriki-kozou
●50ポイント ベストアンサー
<?php
 // 環境によって誤作動する場合があり、直接記述せずechoで出力
 echo '<?xml version="1.0" encoding="Shift_JIS"?>';
?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" 
 "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="ja" lang="ja">
<head>
 <meta http-equiv="Content-Type" content="text/html; charset=Shift_JIS" />
 <title>test</title>
</head>
<body>
 <?php
 $topicsDir = './'; // 記事フォルダ
 $imageDir = './'; // 画像フォルダ
 exec('ls -t ' . $topicsDir . '*.txt' , $topics); // ls で更新日付降順でファイルリスト取得
 for($i = 0; $i < 3; $i++) {
 // 最新3回分ループ
 if(isset($topics[$i])) {
 // 記事があればイメージを探す
 $images = array(); // イメージ一覧クリア
 exec('ls -t ' . $imageDir . preg_replace('!.*/(.+)\.txt$!', '$1_*.jpg', $topics[$i]), $images); // イメージファイル一覧取得
 echo '<div id="topic' . $i . '">'; // divで囲んだけど、このあたりは適当に変えてもらってかまわない
 // 記事を読み込んでタグと認識されてしまいそうな<や>などもろもろを変換後、改行コードをbrタグに変換して出力
 echo preg_replace("/\r\n|\r|\n/", '<br />', htmlentities(file_get_contents($topics[$i]),ENT_COMPAT,'Shift_JIS')) . '<br />';
 // 画像を出力(無ければ何も出ない)
 foreach($images AS $img) {
 echo '<img src="' . $img .'"/><br />';
 }
 echo '</div>'; // div で、以下同文
 echo "\n"; // 出来上がったHTMLのコードを見やすくするための改行コードだから本番ではなくてもいい
 } else {
 // 記事が無ければループ終了
 break;
 }
 }
 ?>
</body>
</html>

・記事テキスト作成時に文字コード問題がでるかもしれないので、とりあえずShift_JISを採用してますが好きに変えてください

・div で囲んでますけど textarea でも table でも好きな方法に変えてください

・画像ファイルのファイル名はコメント欄にも書きましたが「記事ファイル名_英数字,jpg 」にしてください

・画像ファイルの表示順を更新日ではなく英数字の部分でソートしたい場合は「ls -t 」ではなく「ls 」に変更してください

・phpのコマンドについては下記など(search for欄に入力して検索すればでてきます)で調べてください

http://php.net/manual/ja/function.htmlentities.php

・lsコマンドはphpではなくunix系のコマンドです(Windowsに例えればDOSコマンドのDirに相当します)

・記事フォルダ/画像フォルダはそれぞれ適宜書き換えてください


まだまだ、つっこみどころ満載のコードなので、さらに「ここはこうしたほうがいい」という意見も待ってみるようにしてください

(くだらない回答も来る危険性はありますが、はてなの回答に保証はありませんので、自己判断してもらうしかないです)

◎質問者からの返答

ありがとうございます!!

// 環境によって誤作動する場合があり、直接記述せずechoで出力

echo '';

?>

"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="ja" lang="ja">

<head>

<meta http-equiv="Content-Type" content="text/html; charset=Shift_JIS" />

<title>test</title>

</head>

<body>

$topicsDir = 'text'; // 記事フォルダ

$imageDir = 'images'; // 画像フォルダ

exec('ls -t ' . $topicsDir . '*.txt' , $topics); // ls で更新日付降順でファイルリスト取得

for($i = 0; $i < 3; $i++) {

// 最新3回分ループ

if(isset($topics[$i])) {

// 記事があればイメージを探す

$images = array(); // イメージ一覧クリア

exec('ls -t ' . $imageDir . preg_replace('!.*/(.+)\.txt$!', '$1_*.jpg', $topics[$i]), $images); // イメージファイル一覧取得

echo '

'; // divで囲んだけど、このあたりは適当に変えてもらってかまわない

// 記事を読み込んでタグと認識されてしまいそうな<や>などもろもろを変換後、改行コードをbrタグに変換して出力

echo preg_replace("/\r\n|\r|\n/", '
', htmlentities(file_get_contents($topics[$i]),ENT_COMPAT,'Shift_JIS')) . '
';

// 画像を出力(無ければ何も出ない)

foreach($images AS $img) {

echo '
';

}

echo '

'; // div で、以下同文

echo "\n"; // 出来上がったHTMLのコードを見やすくするための改行コードだから本番ではなくてもいい

} else {

// 記事が無ければループ終了

break;

}

}

?>

</body>

</html>

↑このように、記事と画像のフォルダ名を書き換えて、

このphpと同じ階層にimagesフォルダとtextフォルダを作成して、

20100615.txtと20100615_01.jpgを入れてテストしてみたのですが、

わたしのやり方がおかしいのか、何も表示されませんでした。。。

もう少し格闘してみます。


3 ● ヨネちゃん
●20ポイント

例えば下記ソースのPHPファイルを設置したとします。

<html>
<head>
<title>NEWS</title>
</head>
<body>
<?php
$datadir = "data";
$dir = opendir($datadir);
while( $file = readdir( $dir ) ){
$str = pathinfo($file);
if ($str['extension'] == "txt"){
 $txtfiles[] = $file;
 }
if ($str['extension'] == "jpg"){
 $jpgfiles[] = $file;
 }
}
closedir( $dir );
rsort($txtfiles);
rsort($jpgfiles);
echo "<p><img src=\"$datadir/$jpgfiles[0]\">"."<br />\n";
echo file_get_contents($datadir."/".$txtfiles[0])."</p>\n";
echo "<p><img src=\"$datadir/$jpgfiles[1]\">"."<br />\n";
echo file_get_contents($datadir."/".$txtfiles[1])."</p>\n";
echo "<p><img src=\"$datadir/$jpgfiles[2]\">"."<br />\n";
echo file_get_contents($datadir."/".$txtfiles[2])."</p>\n";
?>
</body>
</html>

同じフォルダ内に「data」というフォルダを置き、

その中にjpgファイルとtxtファイルをアップすると、

最後にアップされたファイルから順に3つ表示されます。


サンプル

http://vp.cool-music.org/test/news/

◎質問者からの返答

ありがとうございます!

このやり方だと、1つの記事に対して、画像が2つある場合はどうなりますでしょうか?


4 ● 小力子象
●0ポイント

修正ソース

<?php
 // 環境によって誤作動する場合があり、直接記述せずechoで出力
 echo '<?xml version="1.0" encoding="Shift_JIS"?>';
?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" 
 "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="ja" lang="ja">
<head>
 <meta http-equiv="Content-Type" content="text/html; charset=Shift_JIS" />
 <title>test</title>
</head>
<body>
 <?php
 $topicsDir = './'; // 記事フォルダ
 $imageDir = './'; // 画像フォルダ
 exec('ls -t ' . $topicsDir . '*.txt' , $topics); // ls で更新日付降順でファイルリスト取得
 for($i = 0; $i < 3; $i++) {
 // 最新3回分ループ
 if(isset($topics[$i])) {
 // 記事があればイメージを探す
 $images = array(); // イメージ一覧クリア
 exec('ls -t ' . $imageDir . preg_replace('!.*/(.+)\.txt$!', '$1_*.jpg', $topics[$i]), $images); // イメージファイル一覧取得
 echo '<div id="topic' . $i . '">'; // divで囲んだけど、このあたりは適当に変えてもらってかまわない
 // 記事を読み込んでタグと認識されてしまいそうな<や>などもろもろを変換後、改行コードをbrタグに変換して出力
 echo preg_replace("/\r\n|\r|\n/", '<br />', htmlentities(file_get_contents($topics[$i]),ENT_COMPAT,'Shift_JIS')) . '<br />';
 // 画像を出力(無ければ何も出ない)
 foreach($images AS $img) {
 echo '<img src="' . $img .'"/><br />';
 }
 echo '</div>'; // div で、以下同文
 echo "\n"; // 出来上がったHTMLのコードを見やすくするための改行コードだから本番ではなくてもいい
 } else {
 // 記事が無ければループ終了
 break;
 }
 }
 ?>
</body>
</html>
◎質問者からの返答

ありがとうございます!

なぜだか文字化けしてしまいます。。。

UTF-8に変えても、ダメでした。。。


5 ● koriki-kozou
●50ポイント

(1)文字化け

テキストファイルの保存形式をShift_JISと想定してますので、XHTMLのほうをutf8にしてしまうと文字化けします

XHTMLのほうをutf-8に変えたのであれば、テキストファイルもutf-8で保存するか、もしくはプログラムのほうで変換してやります

テキストファイルはShift_JISで、XHTMLはUTF-8にしたい場合の変更は下記のような具合

echo preg_replace("/\r\n|\r|\n/", '<br />', mb_convert_encoding( htmlentities( file_get_contents($topics[$i]), ENT_QUOTES, 'Shift_JIS'), 'UTF-8', 'auto')) . '<br />';

利用できる文字コードについては下記にあります

http://jp.php.net/manual/ja/mbstring.supported-encodings.php

文字コードを混在させると面倒なのでXHTML本体もShift_JISにしてあったこと理解いただけたと思います

(2)文字化け、その2

ENT_COMPAT を使ってしまっていたので ENT_QUOTES に変えてます

詳細は下記

http://jp2.php.net/manual/ja/function.htmlentities.php

◎質問者からの返答

ありがとうございます!!

文字化け解消されました。嬉しいです。

が。。。今更な問題に気づいてしまいました。

記事の日付とタイトルをトップページに3件だけ表示したいので、

topics_list.txtを作成して、

2010.6.15

ああああああああああああああああああああああああああ

2010.6.15

ああああああああああああああああああああああああああ

2010.6.15

ああああああああああああああああああああああああああ

↑こういう内容にして、

トップページは問題なく3件だけ反映できているのですが、

新着情報ページにもtopics_list.txtの内容(上から新しい順)を、

各記事に反映させることってできるんでしょうか?

ちなみに、トップページは、

こんな感じで反映させています(これも検索してコピペしただけなんですが)。

意味不明だったら、ごめんなさい。。。


1-5件表示/7件
4.前の5件|次5件6.
関連質問


●質問をもっと探す●



0.人力検索はてなトップ
8.このページを友達に紹介
9.このページの先頭へ
対応機種一覧
お問い合わせ
ヘルプ/お知らせ
ログイン
無料ユーザー登録
はてなトップ