2009年3月アーカイブ

例えば、1, 2, 3をすべて、001, 002, 003と表示させたい場合は
下記のような使い方をする。

{$cnt|string_format:"%03d"}

// $cntに数値が入るとする。

そして、それをfor文でまわすと下記のようなコードになる。

{section name=cnt start=1 loop=3}
   {$smarty.section.cnt.index|string_format:"%03d"}."<br />"
{/section}

突然、セッションエラー

| コメント(0)
作業中に突然セッションエラーが発生するようになった・・・なぜ?
エラーの行を見てみると、最初のsession_start();の部分。
思い当たる節もなく、レンタルサーバー会社に即連絡。
サーバーの再起動で直ったもののしばらくするとまた発生。何なの?

エラーの内容は下記の通り。
**********************************************
Warning: session_start() [function.session-start]: open(/tmp/sess_e102d79a5e5f8a2accd0e3bc1dfbc1f8, O_RDWR) failed: Permission denied (13) in /public_html/index.php on line 7

Warning: Unknown: Failed to write session data (files). Please verify that the current setting of session.save_path is correct () in Unknown on line 0
**********************************************

またサーバーの再起動をしてもらったところで根本的な解決にはならないので
セッションパスを変えてみることにした。

新たにsessionというフォルダを作り、パスを変更。
session_save_path('/home/*****/session');

そして、エラーの内容からパーミッションに問題がありそうなので
777に設定変更し、再度実行してみると・・・なんと解決!

777でセキュリティ的にどうなのかという問題もあるが、public_htmlより
上の階層に作ってあるからまぁいいかということで・・・。

ちなみにsession_save_pathは、session_start()よりも先に書かなければならない。
ついでにタイムアウトの時間も変更。
デフォルトは180分らしい。そんなにはいらないので、30分くらいに・・・。

<?php
session_save_path('/home/*****/session');
session_cache_expire(30);
session_start();


?>

先の記事で、fgetcsv関数を紹介しましたが
どうもこの関数は処理速度が遅いらしい。

ともかく少しでも速くしたいので、別の方法を試してみた。
fgetcsvに変えて、file_get_contentsを使ってみる。
ただし、file_get_contentsだと1行ずつ取り出してくれないので
explodeを2回入れる必要がある。
改行(\n)での分割とカンマ(,)での分割。
ちょっとコードが長くなるが、速いに越したことはない。

$fname = "csv/sample.csv";
$file = file_get_contents($fname);
$file_line = explode("\n", $file);
$i = 0;
foreach($file_line as $value) {
    list($sp_date, $sp_title, $sp_detail, $sp_url, $sp_photo) = explode(",", $value);
    $sp_data[$i]["sp_date"] = $sp_date;
    $sp_data[$i]["sp_title"] = $sp_title;
    $sp_data[$i]["sp_detail"] = $sp_detail;
    $sp_data[$i]["sp_url"] = $sp_url;
    $sp_data[$i]["sp_photo"] = $sp_photo;    
    $i++;
}// end foreach

ストップウォッチ片手にベンチマークしてみると
Firefoxにおいては、たしかに1秒ほど速くなった。

ただIE7.0でのテストは、わずかに速いかなという程度で
ほとんど変わらなかった・・・というかどちらも遅い。

DBが使える環境であれば、CSVよりも間違いなく
DBをおすすめする・・・当たり前か(^^;)

どちらにせよ、DBが使えない特殊な環境もしくは
制限がある場合は、CSVを使うしかないのだが
データを取り出す際には、fgetcsvよりもfile_get_contentsの方が
いいかもしれない。
他にもfile関数やfopen関数があるが、あまり変わらない
ということなので今回は試していない。

参考にしたサイト: 2Y's BLOG

CSVファイルから取り出したデータを配列に入れて
Smartyで呼び出してみる。
DBが使えない環境でとりあえずの策として利用してみた。

$fname = "csv/sample.csv";
$file = fopen($fname, "r");
$i = 0;
while(list($sp_date, $sp_title, $sp_detail, $sp_url, $sp_photo) = fgetcsv($file, 1000, ",")) {
    $sp_data[$i]["sp_date"] = $sp_date;
    $sp_data[$i]["sp_title"] = $sp_title;
    $sp_data[$i]["sp_detail"] = $sp_detail;
    $sp_data[$i]["sp_url"] = $sp_url;
    $sp_data[$i]["sp_photo"] = $sp_photo;    
    $i++;
}//end while
fclose($file);

$smarty = new Smarty();
$smarty -> assign("sp_data", $sp_data);