09. 1月 2013 · Write a comment · Categories: WEB制作 · Tags: , ,

ちょっとハマったけど地味に便利だったのでメモ。

Smarty は PHP から配列を渡すことで、ラジオボタンやチェックボックスを簡単に作ってくれる機能があります。そして、テンプレート内で PHP の関数を使用できます。

PHP から渡す値は SQL で読み込んだデータそのもの、という単純な状態の場合、簡単な連想配列を使ってラジオボタンを作りたいという状況になりました。PHP のコードは追加したくない、Smarty だけで何とかしたい…と考えて、調べてみた結果、自分が求める方法はこちらが一番近いと感じました。

Smarty のテンプレートで配列を定義する – XCL Labo

ですが、これだと連想配列が使えません。考え方を変えて、連想配列を使わなくてもいいようにする、という方法も考えましたが、PHP の関数が使える → unserialize 使えばいけるんじゃね?ということで、Smarty のテンプレート内で連想配列を使う方法を考えてみました。

PHP 側でちょっとした準備が必要です(あとで消す)

unserialize するためには、serialize されたデータがなくてはなりません。簡単な配列をシリアライズしたものを一旦画面に表示させます。

echo serialize(array(‘Y’=>’はい’, ‘N’=>’いいえ’));

すると、配列がシリアライズされて表示されます。

a:2:{s:1:”Y”;s:6:”はい”;s:1:”N”;s:9:”いいえ”;}

これを Smarty で使ってしまおう!というわけですね。このシリアライズされた文字列が取得できれば、 PHP で記述した上記のコードはもういりません。

あとは Smarty だけでなんとかするよ

さて、これを Smarty で使うためには、一度変数に格納してから unserialize する必要があります。unserialize したデータは配列になっているので、ラジオボタンやチェックボックスに使うことができます。

シリアライズしたデータを Smarty で使うにあたってのポイントは、デリミタを変数で使用すること。こうしないと正常に渡せません。また、シングルクォーテーションで囲んでしまうと変数が無効になるので、そのまま渡しても良いのではないかと。

01. 12月 2012 · Write a comment · Categories: WEB制作 · Tags: ,

PHP
参考:PHP: strtotime – Manual

strtotime は、特定の書式の日付(文字列)を UNIX タイムスタンプに変換する関数です。
PHP4 では、下記のような引数を入れても正常に動作していました。

これが PHP5 になると、まったく動作しません。

strtotime(‘2012-13-00’) の結果が FALSE になるためです。
引数に存在しない日付を入れてるからだろうと思うなかれ、下記は PHP4 でも PHP5 でも同じ挙動です。(2012年はうるう年です)

要するに、年が増えると FALSE になってしまうのですね。これについてはこの辺が参考になると思います。

参考:PHP: 日付の書式 – Manual

注意:

シンボル dd と DD について、 オーバーフローやアンダーフローすることができます。 つまり、 0 日は先月の最終日の意味になりますし、 オーバーフローすると翌月に繰り越しになります。 このルールにより、”2008-08-00″ は “2008-07-31” と同一になり、 “2008-06-31” は “2008-07-01” と同一になります ( 6 月は 30 日までしかないので)。

また、シンボル mm と MM についても 0 を用いてアンダーフローすることができます。 0 月は前年の 12 月を意味します。 たとえば “2008-00-22” は “2007-12-22” と同一です。

もしこれらを併用し、日も月もアンダーフローした場合は次のようになります。 “2008-00-00” は、まず “2007-12-00” へと変換され、 さらに “2007-11-30” へと変換されます。 文字列 “0000-00-00” についても同様に “-0001-11-30” へと変形されます。 (ISO 8601 における -1 年は、予測的グレゴリオ暦 (proleptic Gregorian calendar) で言うところの紀元前 2 年になります。)

「アンダーフロー」というのは、0より小さくなった場合に繰り上げて処理すること、「オーバーフロー」というのは、例えば月だったら12より大きくなった場合に繰り越して処理すること。
2行目の「シンボル mm と MM についても~」という部分。アンダーフローについては記載がありますが、オーバーフローについては可とも不可とも記載がありません。

ただまあ、「使えてたから使った」というのは「無知は罪である」というのと通じるところがありますね。strtotime のマニュアルに、下記のような記載があります。

注意:

この関数を使って日付の足し算や引き算を行うことはおすすめできません。 PHP 5.3 以降なら DateTime::add() や DateTime::sub() を、そして PHP 5.2 なら DateTime::modify() を使いましょう。

「おすすめできません」とあるのだから、使うほうが間違っているのです。
上記は PHP5 以上ならという制限があるので、PHP4でも挙動が変わらない mktime を使うべきですね。こっちなら間違いありません。

これだからデザイナー上がりの自称 PHPer は!とか随所から聞こえてきそうですが、自戒を込めての post でした。

08. 11月 2012 · Write a comment · Categories: WEB制作 · Tags: ,

PHPロゴ
備忘録として。前にもちょっと違うの書いたな・・・。

*1 date() 関数を使ったら下記のようなエラーが出た場合の対処方法

Warning: date(): It is not safe to rely on the system’s timezone settings. You are *required* to use the date.timezone setting or the date_default_timezone_set() function. In case you used any of those methods and you are still getting this warning, you most likely misspelled the timezone identifier. We selected ‘Asia/Tokyo’ for ‘JST/9.0/no DST’ instead in /path/to/script.php on line NN YYYY-MM-DD

ということなので date_default_timezone_set() を設定する。サーバによっては php.ini で設定しないとダメな場合もあるかも?

*2 MySQL で呼び出した値が文字化けする場合の対処方法

値がすべて「?」になってしまう場合、MySQL の文字コードを latin1 で作っちゃってる場合が多い。それを解消するためのおまじない。

30. 10月 2012 · Write a comment · Categories: WEB制作 · Tags: ,

Old Fashioned Phone

Qdmail は PHP でフリーのメール送信ライブラリです。だいぶ前からお世話になっています。
本当にフリーなので、贅沢は言えないなあ、でも最近は開発が止まってしまっているのでもう下火なのかな、とも思いつつ。

それでも使い勝手が良いことに変わりはないので、主に Smarty + ガラケー対応の案件で利用させてもらっています。ありがとうございます。

PHP高機能日本語メール送信ライブラリ・文字化けフリー – Qdmail – PHP::Mail Library , Quick and Detailed for Multibyte

これを lolipop サーバで動かす際、SMTP での送信が少し厄介でした(使わなくても送れるかは未検証)。実は簡単だったんだけど、コレ!という情報に行き着きにくかったのでメモ。

ロリポはメールアドレスの送信に認証が必要

SMTP_AUTH プロトコルを設定する必要があり、ポート番号は 587 を使います。(SSLを使うわけではありません)

ロリポは安いし管理画面も充実してるけど、たまに重いし混んだことやろうとするとちょっと窮屈ですね。制限があまりないから今のところは良いんだけど。

そんなわけで、下記のようなソースになります。function にしておくと使いやすいですよ。

送信できてるっぽいけど、携帯(ガラケー)に届かない!

ログがエラーを出さず、Send Success になっているなら携帯の受信制限に引っかかっている可能性が高いです。「何もしてないよ~」という方こそ、自動で制限が強くなっているかもしれませんので、見なおしたほうが良いと思います。

私の場合(au):受信したいアドレスは info@example.com として

1)
受信許可リストに @example.com を追加して、
受信拒否リストに .com を入れたまま → 届かない…

2)
受信許可リストに @example.com を入れたまま、
受信拒否リストを無効に → 届いた!

3)
受信許可リストに @example.com を入れたまま、
受信拒否リストを有効にして .com を削除 → 届いた!

4)
受信許可リストに @example.com を入れたまま、
受信拒否リストに .com をもう一度入れる → 届かない…

以上から、受信拒否リストの方が優先されるようです。
メールアドレスに拒否リストに入っている文言がないか、見ておいたほうがいいですね。
ちなみにパソコンやスマートフォンには普通に届きました。

検証用にガラケー持ってるとはいえ、まわりの協力が得られないあたり、もうガラケーでネットをする時代は終わりつつありますねえ。ガラケーとかもう言わないのかな。「スマホじゃない携帯」と言ったほうが確実だったりして。iPhone5 にしたいなあ。

22. 9月 2012 · Write a comment · Categories: WEB制作 · Tags:

WP3.4.2 で Google XML Sitemaps を使おうとしたら、下記のようなエラーが出た。

Warning: Invalid argument supplied for foreach() in /path/to/wp/wp-includes/query.php on line 2762

foreach は配列を処理する関数ですが、そこに配列以外の値が入ってしまうと、PHPがこういうエラーを吐き出します。nullでも入ったんだろうか。ぬるぬる。

ということで、該当箇所を強制的に配列にします。
foreach() で渡す値の前に (array) を入れて配列へのキャスト(変換)を行えば良いわけです。
参考:PHP: 型の相互変換 – Manual

ついでに、crayon syntax highlighter でも同様のエラーが表示されました。

Warning: Invalid argument supplied for foreach() in /path/to/wp/wp-content/plugins/crayon-syntax-highlighter/crayon_wp.class.php on line 368

というわけで、こっちも該当箇所を配列として渡すように。

これで晴れてXMLが生成されました\(^O^)/

12. 6月 2012 · Write a comment · Categories: WEB制作 · Tags: , ,

Smartyの修飾子でPHPの関数を使えるので、利用して面白かった小技のメモ。増やしたい予定。

Smarty で in_array を使う

PHP だと in_array($needle, $haystack) なんだけど、Smartyで第二引数を修飾子の方に持って行って、こうなる。

{if $needle|in_array:$haystack}

この “干し草の山の中から針を捜す” って表現、ちょっと好き。でも無駄骨を折るって意味はどうよ。

range で 数字を選択するセレクトボックスを作成する

個数を選ばせたい時などに重宝します。1~5とか、0~10とか。ただ、optionsで設定するとvalueが0から振られるので、1から設定したい時はoutputとvaluesに設定すること。

PHP だと range(1,5) なので、第二引数を修飾子の変数として使うから、こうなる。

{html_options name=”num” values=1|range:5 output=1|range:5}
{html_options name=”num” options=0|range:10}

preg_replace を利用する

PHPだと preg_replace(/<span>.+</span>/, ”, $text) なので、

{‘/<span>.+</span>/’|preg_replace:”:$text}

となる。あくまで第一引数に対して修飾子を適用するイメージ。

08. 6月 2012 · Write a comment · Categories: WEB制作 · Tags: ,

Backups are important

PHPでcronなりなんなりで下記を動かそうと思ってました。

system(“pg_dump -d database -t table > bkupYmd.sql”, $return_code?);

だけど動かず・・・。動かないというか、$return_codeは127が返ってきて、sqlファイルはできるんだけど中身が空っぽ。

exec(“su -l postgres -c ‘pg_dump -d database -t table > bkupYmd.sql’”);

と、ユーザを指定して動かそうとしても同様。

exec(“/usr/bin/pg_dump -d database -t table > bkupYmd.sql”);

と、パスを指定すると、1が返ってきたけどやはりファイルは0バイト。

たぶんユーザ権限のあたりなんだろうと見当はつくものの、サーバの状況がすぐわからない状態だったのですぐにどうこうできるものでもなく。

考えを改めて、下記を参考にすることにしました。

pg_dump が使えないけどバックアップしたい+CakePHP – makogの日記

CakePHPを使ってるわけではないけれど、要するに pg_copy_to を使えばいいことがわかった。ほしかったのは限定されたテーブルだったし、ちょうどいい。これで出力されたものをファイルに保存しておく。

毎日動かすようにしてバックアップ取ればひとまず安心かなー。

28. 5月 2012 · Write a comment · Categories: WEB制作 · Tags: , ,

PHPロゴ
色々やっていたので若干遠回りになるかもしれないけど、メモ。

Navicatでアクセスできるようにする

root権限で、localhost以外でもアクセスできるユーザをひとつ追加しておく。

GRANT ALL PRIVILEGES ON *.* TO dbmanager@’%’ INDENTIFIED BY password;

ただ、これを実行したら

ERROR 1045 (28000): Access denied for user ‘root’@’%’ (using password: YES)

などと仰る。取り急ぎひとつのデータベースさえいじれれば良かったので、

GRANT ALL PRIVILEGES ON dbname.* TO dbmanager@’%’ INDENTIFIED BY password;

とやったら通った。この後でもう一度上記の *.* を実行したら、OKになった。なんじゃらほい。
最後に FLUSH PRIVILEGES; を実行する。

latin1とUTF8に関する文字化け

5/29追記:最終的にこちらが一番参考になった。

MySQLとPHPの連携:: set names utf8以外の文字化け対策 | KennyQi PHP Blog

MySQL 5.5で「default-character-set」が使えず文字化けする→「character-set-server」にするとOK | KennyQi PHP Blog

Mysql5.5以上の場合、/etc/my.cnf に

[mysqld]?
character-set-server=utf8
skip-character-set-client-handshake

を追加して?/etc/init.d/mysqld restart で再起動。

・・・で、見た目的にはすべてutf8になっているのだけど、実際に稼働させても文字化けが直らず。
mysql_client_encoding で調べてみると案の定、latin1 が返ってくる。

さらに mysql クライアントのオプションとしては character-set-client ではなく default-character-set のままなので注意が必要です。

ということなんだろう。

PHPとMySQLの個人的まとめ ? ぱんぴーまっしぐら

PHPはmy.cnfで[mysql]、[client]を設定しようがクライアントの文字コードはビルド時に指定されたキャラクタセット(通常latin1)。

ということなので、リビルドできる状況ではないため、mysqlに接続したあと mysql_set_charset(‘utf8’); を入れて解決。

—————

参考サイト

MySQLでrootなのにgrantコマンドが実行できない場合の対処法 – eth0jpの日記

Navicat.jp -データベースの管理・運用をより簡単にスムーズに-

18. 5月 2012 · Write a comment · Categories: WEB制作 · Tags: ,

@ or at sign made of puzzle pieces on white background

「だからおまいらは正規表現を書くな(ry」というお叱りと恥を承知で投稿。

経験談から、メールアドレス欄に入ってきたものがエラーになる場合、相手が人なら大抵は本人の勘違い。ということで「こういう入力だと困る」という観点から正規表現を考えてみた。

よくあるのが、

  1. 入力する欄を間違えている
  2. @が抜けてる
  3. .と,を間違える
  4. アカウントやドメインを間違える(docomo.ne.jp → docomo.nejp)

1は項目にもよるけど、日本語が入ってたら蹴ればいいんじゃないかと。4は携帯のドメインくらいならある程度は検証できる。でもメールアドレス間違えてたらどうしようもない。

あとはPG側で救済できる2と3の場合の簡単な正規表現を考えてみる。
(厳密なメールアドレスのルールに沿ったものは有名な http://goo.gl/yCr07 で掲載されているのは承知の上)

preg_match(“/^[^@]+@[0-9a-zA-Z]+.[a-zA-Z.]+$/”, $mail);

これでどうかな。
個人的には大文字がメールアドレスに入っているのが嫌なんだけど、使ってる人もいるのでいれておく。

目的は厳密なメールアドレスかどうかを調べることではなくて、入力した人が初歩的な入力ミスに気づけるようにすること。メールアドレス間違いまでは如何ともしがたいけどなあ・・・。

09. 2月 2012 · Write a comment · Categories: WEB制作 · Tags: ,

追記:エクスポート機能がどうしても使えないので、MYSQL管理ソフトで接続して使うことにしました。

——-

何か前にもエントリしたような・・・。その時は動いたんだけど、下記のエラーが出たので調べてみた。

Cannot start session without errors, please check errors given in your PHP and/or webserver log file and configure your PHP installation properly.

調べてみたら、session.save_pathを確認すると良いらしい。
WP-PortableでインストールしているPHPの設定ファイル(php.ini)を見たら、

session.save_path = “.temp”

とあったので、tempフォルダのアクセス権の問題だというところまでは行ったものの、FTPもSSHもlocalhostにつながらない(設定すればつながるのかもしれないけど)ので、フォルダのプロパティ見たら読み取り専用になっている。

ダメ元でチェックはずしたら、無事表示されました。
さて、あとはDBのdumpができるかどうかだなあ・・・