備忘録(PHP)」カテゴリーアーカイブ

PHPで携帯の絵文字を表示する

PHPで携帯サイトを構築することになったのですが、携帯の小さい画面でPCサイトと同様の文字を
表示するとわずらわしくてしょうがありません。
そこで絵文字を使って表現することにしたのですが、携帯のキャリアごとに絵文字のコードがあるんですよね。
そこで絵文字変換スクリプトを作ってみました。

続きを読む

PHPでWarning:Cannot modiy・・・・・・

PHPで初期のころに悩まされたエラーの話です。

とあるシステムを開発していて「Warning:Cannot modify header information-headers already sent by  ・・・・・」エラーが発生しました。

今となってはエラーを見れば原因はすぐに分かるのですが、(今さらエラーを出すスクリプトを書く時点でおかしい話ですが)ググッてみれば結構検索にはひっかります。

みなさん同じような悩みを抱えているようで。

さて、原因はheader()の前に何かしらの文字を出力してるのが原因です。

例えば、デバッグ中のダンプする処理がそのまま残っていたり、全角のスペースが入力されていたり。

このエラー自体を無視する方法は、

php.iniで[output_buffering = ON]とするか、スクリプトの最初にob_start()を呼び出す。

 

いろいろと悩んで成長していくんですよね。

まさに失敗は成功の母と言ったところでしょうか。

PHPで携帯サイトを構築する

PHPで携帯サイトを構築するにあたって最大の難関はセッション管理ではないかと思います。
調べると結構な情報がいろいろサイトに掲載されていて参考になります。
私も、いろいろなサイトを参考にしたのですがなかなか解決策が見つからず苦労しました。
とあるサイトで見つけた情報によると、php.ini内の[session.use_trans_sid]をONにするという方法を
試してみたのですが、なぜか動作しない。
[session.use_trans_sid]をONにするとリンクにセッションIDを埋め込んでくれるらしいのですが、
次の条件があるらしい。
1.ファイルがPHPであること(拡張子が.php)
2.php.ini内の[session.use_cookies]をOFFにする。
と試してみたけどNG・・・orz

とりあえず、セッションを使うに当たって次のことをやりました。
1.全てのファイルをHTMLではなくPHPに変更。
2.内部ページリンクにセッションIDの埋め込み(リンクURL?sid=SID)

とりあえず上記の方法でセッションが使えるようになりましたが、ここで重大な問題が。
URL全コピーで、別の端末で同じ情報を含んだページが表示できるというセキュリティ上の
問題が発生。

さて、どうしたものか・・・・。

PHPのバージョンは最新版がいい

結構前の話なんですが、PHP5.0.4でとあるシステムを構築していました。
開発初期の段階では最新版でした。
仮納品したあと、とある問題が発生しました。
データベースのレコード数が増えてきたため、データをエクスポートするのに失敗している現象が発生。
エクスポートにはCSV形式とExcel形式での出力に対応していたのですが、なぜか2MBちょうどしかダウンロードされないのです。
プログラムの見直し、Apache、PHP、通信経路などさまざまな要因を探りました。
かなり悩んでいましたが、原因は意外なところにありました。
PHPのバージョンです。
そのときには、5.1.6が最新でした。
どうも、5.0.4だと上記のような現象が発生するらしく、バージョンアップすることで解決しました。

定期的なバージョンアップって必要なんですね。

PHPでSQL文を実行するときは、ほどよく改行

私がPHPを使いはじめて間もないころ、仕事でMySQLを使うことになりました。

そのときはSQL文については知識が多少あったので、順調にシステムを構築していました。

ところがっ!!

あるとき、どーしてもエラーになってしまうSQL文が出てしまい、原因が分からずかなり悩んだ記憶があります。

当時、私はPHPのソースをとりあえずがむしゃらに書くことに専念していて、後で見ることに対してはまったく気にせず、ただ打ち込むことだけをしていました。

そのエラーが発生するSQL文を見ると・・・

$sql = “SELECT ・・・・・・・・・・・・・・・・・・・・・・・・・・・”;

改行をいれることなくただ、横に長~く書き込んでいました。

あるとき、何を思ったか改行コード(\n)を入れて見やすくしたころ、エラーもなく問題なくSQL文は実行されました。

私の知る限り、私が見てきた書籍にはSQL文中に改行がなく長いSQL文の場合はエラーとなるなんて書いてなかったです。(←常識なのかもしれません)

こんな、トラブルに見舞われるのは私ぐらいかもしれませんけど、みなさんソースは見やすくかきましょうね。

PHPで短縮型タグ<?~?>が使えない

PHPを使っている人で<?php~?>のタグを短縮型の<?~?>で書く方って結構いませんか?

本来は、<?php~?>の型で書くのが推奨されているみたいですが、HTML文中に変数だけを表示したい場合に<?=$hensuu?>で書くことがたまにあります。

開発用サーバAでは使用できたのですが、運用サーバBでは使用できなかったことがありました。

結構単純な確認ミスではあるのですが、原因はphp.iniの設定です。

php.ini内の[short_open_tag]の設定がOFFになっていると使えません。

ここをONにして、Apacheを再起動することで<?~?>の短縮型タグが使えるようになります。

 

PHPで意外な落し穴

以前、とあるシステムでサーバAにあるDBのデータを遠隔地にあるサーバBへ反映するという処理を行うというシステムを構築していたときの話です。
データはまず、サーバA側でデータを抽出しCSVファイルとして書き込み、サーバBへFTPで転送したあと、headerでページを移動してサーバBでCSVを取り込むという流れで構築しようとしていました。

ところがっ!
FTPでの転送まではうまくいっているのですが、サーバBでの処理が上手くいきません。
原因を探ってみたんですが、まったくわからず。

・ ・ ・ ・ ・

あれこれ悩んだ結果、原因は操作をしてるPCにインストールされているウィルス○スターでした。その中にあるURLフィルタ機能というのがどうもブロックしているらしく、処理が上手くいかなかった。ということがありました。

インターネットが普及してきた影響で、多機能になったウィルスソフト。
便利なようで、意外に不便だと感じました。

PHPでメールを送信するときのCC、BCCの指定は・・・

PHPでメールを送信するときは、mb_send_mail関数を使うことが多いですが、指定できる宛先は1つのみですよね。

CCやBCCで宛先を指定してメールを送信したい場合はどうすればいいのでしょうか?

・・・・・・・・

特に難しくはないんですが、header句を指定するときに、

From:送信元\nCc;宛先B,宛先C\nBcc:宛先D,宛先E

                                 」

といった感じでヘッダ部に送信元に続けて登録して送信すると送れます。

phpmyadminの実行制限

phpmyadminってPHPとMySQLを使っている人にとっては結構便利なツールですよね。
私もDBの構築・修正にはよく使っているのですが、レコード数が増加するにあたってSQLを実行したあと、タイムアウトになります。
タイムアウトしましたという表示が出ることはなく、白紙のページが表示されることがあります。
PHPやApacheでの設定ではタイムアウトは少し長めの時間を設定しているにも関らずタイムアウトになることがあります。
実は、(知っている方もおられると思いますが)phpmyadmin側でもタイムアウトの設定ってあるんですね。
バージョンが2.6.3だと、config.inc.php内に【ExecTimeLimit】という文字列があるのですが、そこがデフォルトだと300になっています。この値を変更すると実行時間の延長が可能です。

新しいバージョンだと、librariesフォルダ内のconfig.default.php内に同じ設定があります。

300超えるSQL文はあまりシステム上よくはないのですが、バックアップや復元のときには便利だと思います。

PHPタイムアウトについて捕捉

先日、PHP処理でのタイムアウトについて書きましたが、捕捉です。
タイムアウト処理うんぬんの前に、PHP側及びApache側での設定で強制的にタイムアウトになります。
【php.ini】
max_execution_time = 300
// 300秒でタイムアウト
【PHP】
set_time_limit(300);
//300秒でタイムアウト
【httpd.conf】
Timeout 300
//300秒でタイムアウト
KeepAliveTImeout 300
//300秒でタイムアウト

上記の設定は0にすればタイムアウトしない設定になります。
ちなみに、わたしの場合上記設定でもダメな場合がありました。
構成としては拠点Bからサーバ設置場所Aという状態で、拠点Bから拠点Aへのアクセスの際にどんなに対策をしてもタイムアウトになっていました。
原因は、ファイアーウォールでした。
ファイヤーウォール側でセッションのタイムアウトを設定していてアウトでした。
参考までに。