これで【$arrHairetsu】の【haishitai】以外の項目はそのままに、【haishitai】だけ破棄されます。変数の定義で書いたユーザーさんから動いたとの連絡をいただきました。【php.ini】のパスを指定してcronやコマンドからPHPを動かしてみてください、という内容のメールをお送りしていました。そのユーザーさんのサーバーでは【php.ini】が使えないので、【.htaccess】にPHPの設定をしておられました。cronからの実行時に、【.htaccess】の設定を読み込んで実行していなかったため、設定が有効にならず【Notice】が出ていたとのことでした。【wget】を利用したら、動くようになったとのことでした。詳しいユーザーさんで、私も勉強になりました。【タイマーメール】のユーザーさんから、動かないとの連絡がありました。サーバーの設定を少し変えたら動くのだろうと思います。出ているエラーから、対処法を探してみました。対処法はhttp://www.sakura-pc.jp/php/02020000.shtmlの【補足】どうやらPHP5から変数を初期化するようになったようです。PHPも変数の初期化を意識するようになったのか。私のサーバーではエラーは出ない設定になっているけれど、ユーザーさんのサーバーは出る設定になっているようです。ユーザーさんに対処法をお知らせしました。これで動けばよいのですが。変数も初期化したほうがセキュリティ上良いようなので、ボチボチ(とても一気にはできない・・・)変更していくことにします。変数を定義というか初期化することになったのはよいことですが、その変更を知らなかったのは不覚でした!PHPの基礎体力ここ面白そうです。Found");を使っていたのですが、アクセスカウントしてみると、なぜか2回踏んでいることがわかりました。Forbidden");の場合は1回しか踏まないようです。404);という書き方もあるようです。こちらはアクセスカウントはされません。アクセスしようにもURLが存在しないのでアクセスできない、つまりカウントもされないということのようです。403);も同様です。4096);}}@fclose($objMail);で読み込むことができます。メールヘッダも本文も、全てが取り込まれるので、ここから必要な情報を抜き出していくことになります。ヘッダと本文は、【¥n¥n】と改行コードが2回続くことで区切られています。【¥n¥n】より前がヘッダ、後ろが本文です。ちなみに、ヘッダも本文も、メールの改行コードは【¥n】です。・のようになっています。1行ずつチェックして、上の形式から必要な情報を取り出します。メールの差出人を会員などに登録する場合、【差出人メールアドレス】を抜き出し、登録処理を行えばOKです。<メールアドレス>の場合もあれば、<メールアドレス>の場合も、メールアドレスの場合もあります。名前、件名などに、日本語が含まれる場合、エンコードされてますから、【mb_decode_mimeheader】でデコードしてください。ステップメール】を空メール登録に対応させることができます。ステップメール】への空メール登録へ対応してみることにしました。空メールだけでなく、本文に姓名が書いてあれば、名前も登録されるようにしたいと思います。これを実現するためには、メールを受信したらCGIを実行する、という設定がサーバーに必要になります。この設定ができるものに、【aliases】、【procmail】、【.forward】ファイルがあるようです。レンタルサーバーで一番使われているのが、【.forward】ファイルのようなので、ここでは【.forward】ファイルで試してみることにします。サーバーによっては、セキュリティ上設定を許可していないものもあるようです。実行したいCGIのパス"】となります。/usr/home/xxx/yyy/run.php"】のようになります。ご自分のサーバーの環境に合わせてパスは変更してください。これでメール受信と同時に【run.php】が実行されます。【.forward】ファイルはメールの転送を設定するファイルですが、転送先にCGIファイルを指定すると、プログラムを実行できるようになります。【.forward】で転送を設定する場合は、無限転送にならないように十分注意してください。永遠にメールが転送され続け、サーバーに無駄で過大な負荷がかかることになります。【PayPalオートメール】のユーザーさんからの連絡でもう1点おかしなところが判明しました。ファイルダウンロードの部分ですが、どうやらダウンロードファイルだけでなく、ダウンロードを行っているWebページのhtmlまで出力されてしまってます。私のサーバーでは見られない現象。サーバーによって少し動きが違うのでしょう。ダウンロードの前に、キャッシュかhttpをクリアしておかなければいけないのでしょう。自分のサーバーではクリアしなくても大丈夫だったので、気が付かずそのままになっている、ということです。ネットで調べてみると、これかな、というものが見当たりました。PHPマニュアルや当時参考にしたサイトには書かれていなかったので、思いもしませんでした。【ob_start】関数をDL前にコールするだけ。DL後に【ob_clean】関数をDL前にコール。filesize($DLFilePath));ob_clean();flush();readfile($DLFilePath);clearstatcache();となります。これ、どこかのサイトから拝借したんですが、出所が分からなくなってしまいました。ブラウザのお気に入りにうっかり残し忘れたようです。【PayPalオートメール】のユーザーさんから、メールの本文にヘッダが出力される、と連絡がありました。そんな現象見たことない!こちらにもテストメールを送っていただきました。Expressで表示してみます。表示できてますよ、と連絡すると、『そうなんです。Expressだけおかしいんです。Expressのバグ?ということでその線で調べてみることに。http://support.microsoft.com/kb/973459/ja『こんなのありました。』とユーザーさんから連絡が。これだと思ったのですが、違っていたようです。何???私のサーバーから送ったメールは、みんなのところでちゃんと見えている。ユーザーさんのサーバーから送ったメールは、ユーザーさんのメーラーでだけ表示がおかしい。Express以外のメーラーはそのバグを吸収してくれている、と解釈すればいいの?今度はその視点で調べてみます。ものがあります・・・』に当てはまる?更に調べると、qmailがこれに当たるようです。qmailにバグが多いのは結構有名な話なんですね。【ini_get('sendmail_path')】で何が出力されるか調べてみました。【qmail】じゃあないの?でも、一か八かで、改行コードを変更してテストしてもらいました。表示され始めたとのこと。原因は!!!で、一件落着。しても【qmail】を利用しているかどうかのチェックの方法が見つからなかったので、どうしてもうまく送信できない場合は、管理画面から改行コードを指定してもらう仕様にちょっと修正。Parametersこの辺りが参考になります。コメントTop↑PHPコーディングマルチバイト文字列置換2011年04月03日PHPの【str_replace】関数は、マルチバイト文字列に対応していないようです。今まで気が付かなかった・・・なんてこった。いえは、マルチバイトに対応した関数は【mb_】というプレフィックスが付いています。【mb_str_replace】という関数は見当たりません。ないなら自分で作らなければ、ということで、探してみました。マルチバイトを考慮したstr_replace関数が参考になります。これでちゃんと動くようになりました。コメントTop↑PHPコーディングMySQLのトランザクション2011年01月09日MySQLのトランザクションです。$Connect);となります。0】は見たことがありません。トランザクションを切らずにSQLを発行した場合、自動でコミットされるのをoffにするようです。なくても、きちんとトランザクションを切れば大丈夫なようです。今日もPostgreSQLのソースとインターネットを参考にMySQLのコーディングです。$Connect);となります。概ねPostgreSQLは【pg_xxx】だったのが、MySQLでは【mysql_xxx】になるようです。クエリの発行は、SQLとリソース(DBへのリンク)が、PostgreSQLとMySQLでは逆に(引数の順序)なります。ここをうっかり変更し忘れて、あれ?を何度かやってしまいました。処理件数の取得は、pg_affected_rows($result);が、mysql_num_rows($result);へ、リソースの開放はpg_free_result($result);からmysql_free_result($result);になります。一点、気をつける点が。クエリの結果取得です。PostgreSQLでは、【pg_fetch_assoc】以外に、【pg_fetch_object】も使えました。MySQLでは使えないようです。【mysql_fetch_assoc】を使います。$rsData;とやれば、1レコードずつ一気に取得できます。$rsData['id']でそのレコードのidフィールドが取得できます。今日はPHPからMySQLへ接続、テーブルへの読み書きをしてみました。PostgreSQLのソースとインターネットを参考にコーディングしていきます。$Connect);でDB選択となります。切断はpg_close($Connect);はmysql_close($Connect);となります。コメントTop↑PHPコーディングオブジェクト指向で書いてみる2010年11月17日いよいよオブジェクト指向で書いてみました。オブジェクト指向PHP.NETとにらめっこしながら、自分のサイトに当てはめてみます。各ページで共通にある処理を洗い出してみます。DB接続、DB切断などがありました。$this->Main();DB切断}}こんな感じで共通クラスを作ります。各ページの処理はこのクラスを継承します。それぞれのページを見ると、いくつかのパターンに分類できます。・左メニューとメインメニューのある2カラムページ・左ではなくページの上にメニューがあり、その下にマニュアルのあるマニュアルページ・商品を売っているセールスページなどです。次に、例えば、2カラムページを処理するクラスを作ります。$html}}これでBaseProcessが継承されます。DBからデータを取得する部分は、表ページの表示にも使いますが、管理画面でも使うので、これもクラス化しておきます。$html;これだけです。