備忘録(PHP): 2008年4月アーカイブ

プログラムを構築していて、どーしてもエラーが出る箇所ってないですか?
エラーが出るのは分かっているんだけど、別に無視できるエラーだったり。
でも、PHPの仕様で絶対発生するエラー。

こんなときには、「@」を使います。
エラーが出る箇所の先頭に@をつけてあげるだけで、エラーを無視できます。

ちなみにこの「@」はエラー制御演算子と言います。
エラー制御できないのは、関数の定義、クラスの定義、条件構造などです。

エラーが発生しないのが、一番いいですけどね。

書いたスクリプトが@だらけにならないよーに注意しましょう。  
PHPでとある携帯サイトを構築していたときのことです。
携帯ではCookieが使える端末と使えない端末があるので、SESSIONIDを持ちまわればセッションの維持はできます。そして、SESSIONを有効にするにはphp.ini内の【session.use_trans_sid】をONにすればリンクのURLに自動的にSIDを付与してくれます。
ここまでは、先日書いたとおりです。

しかし、これではSEO的には不利です。
検索エンジンのクローラがアクセスするたびにSIDは違いますから、いつまでも違うページとして認識されてしまいます。
ここで、一つPHPスクリプトの先頭に付け加えることで対応できます。

PHPでWEBサイトを構築したときに一番頭を抱えるのがSEO対策についてです。
システムとして成立しないといけない上に、SEO的に有利なサイトを構築しないと無意味です。
特にショッピングカートシステムなんかは、集客の為にSEO対策が必須なのでかなり頭を悩まされます。

PHPでWEBサイトを構築したらURLにhttp://www.sample.com/sample.php?a=100&b=abcとなってしまうことがありますよね。
これは、SEO的には不利だと言われています。
なので、一般的にはhttp://www.sample.com/100/abc/sample.htmlのURLからrewriteしていることが多いのではないかと思います。

しかし、調べてみると事実は違っていました。

「動的URLも静的URLと同様に扱う」 - Google Matt Cutts氏
まさに、目からうろこと言った状態。
果たしてこの真意がどうなのかは知る術がないので、一概にURLをそのままにするはどうかと思いましたが、とりあえずこういうこともあるのだと頭に置いておくと気休めにはなるのではないかと思います。  

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


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

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

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

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

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

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

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

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

 

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

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

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全コピーで、別の端末で同じ情報を含んだページが表示できるというセキュリティ上の
問題が発生。

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

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

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

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

ところがっ!!

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

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

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

$sql = "SELECT ・・・・・・・・・・・・・・・・・・・・・・・・・・・";

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

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

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

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

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

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

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

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

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

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

 

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

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

・ ・ ・ ・ ・

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

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

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

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

・・・・・・・・

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

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

                                 」

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

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

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

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

ioPLAZA【アイ・オー・データ直販サイト】 ioPLAZA【アイ・オー・データ直販サイト】
あれもこれも標準装備のレンタルサーバ あれもこれも標準装備のレンタルサーバ


Web広告限定ストア(eクーポン)Web広告限定ストア(eクーポン)

問い合わせ

メールフォーム