ロボットを排除する画像認証(CAPTCHA)をPHPで作ってみた 
2016/04/16 Sat.
煮卵と黒ギャルの尻が似ているというこれを見て感動しました。
そして、この相似関係を有効活用できないか?と思い、多角的にさまざまな黒ギャル画像を観察してみると、
「CAPTCHA技術に応用できるのではないだろうか?」
と気づき、作成したのが「にたまごCAPTCHA『niCAPTCHA』」です。
そして、この相似関係を有効活用できないか?と思い、多角的にさまざまな黒ギャル画像を観察してみると、
「CAPTCHA技術に応用できるのではないだろうか?」
と気づき、作成したのが「にたまごCAPTCHA『niCAPTCHA』」です。
category: PHP
HTTP_Request2でファイルをアップロードしたらエラーになる 
2015/09/17 Thu.
以下のようなエラーが返ってくる。
$req->setHeader('Expect', '');
を記載するとうまくいく。
417 Expectation Failed
Expectation Failed
The expectation given in the Expect request-header
field could not be met by this server.
The client sent
Expect: 100-continue
Only the 100-continue expectation is supported.
Expectation Failed
The expectation given in the Expect request-header
field could not be met by this server.
The client sent
Expect: 100-continue
Only the 100-continue expectation is supported.
$req->setHeader('Expect', '');
を記載するとうまくいく。
category: PHP
PHPのファイル関連関数でSSLを使った接続をしようとしたら接続できない 
2015/09/15 Tue.
PHP5.6で「file_get_contens」や「fopen」を使って「https://~」で始まるリモートファイルにアクセスしようとしたら、
とか
SSL operation failed
とかいうエラーを出して接続に失敗する。
なぜだ?
OpenSSLはインストールされている。もちろん、PHPのコンパイル時にも「configure」で組み込んでいる。
「phpinfo()」を確認。
●Registered PHP Streams
「https」が記載されている。
●allow_url_fopen
当然ながら、「On」だ。
うーむ。
あとやってないことと言えば・・・
「ふえぇぇぇぇ。PHPマニュアルちゃんと読んでなかったよぅ」
ということで今からバージョン変更時の注意書きを読みに行く
PHP 5.6.x における OpenSSL 関連の変更
書いてある。
Warning: fopen(): SSL operation failed with code 1. OpenSSL Error messages:
error:14090086:SSL routines:ssl3_get_server_certificate:certificate verify failed in Command line code on line 1
error:14090086:SSL routines:ssl3_get_server_certificate:certificate verify failed in Command line code on line 1
とか
SSL operation failed
とかいうエラーを出して接続に失敗する。
なぜだ?
OpenSSLはインストールされている。もちろん、PHPのコンパイル時にも「configure」で組み込んでいる。
「phpinfo()」を確認。
●Registered PHP Streams
「https」が記載されている。
●allow_url_fopen
当然ながら、「On」だ。
うーむ。
あとやってないことと言えば・・・
「ふえぇぇぇぇ。PHPマニュアルちゃんと読んでなかったよぅ」
ということで今からバージョン変更時の注意書きを読みに行く
PHP 5.6.x における OpenSSL 関連の変更
書いてある。
category: PHP
PHPのヒアドキュメントの中で定数を表示する方法 
2015/06/30 Tue.
ありません。
PHPの仕様なので仕方がない。
けど、なんとか無理くそ表示させてみた。
category: PHP
PHPの文字列と数値の比較であせった 
2015/06/04 Thu.
プログラムを組んでテストする際、絶対エラーが出るデータを入力したらエラーがでず、調べたらPHPの仕様上のことなので今更ながらあせったメモ。
category: PHP
IF文の判定比較演算子をすぐ忘れるので困る 
2015/02/17 Tue.
PHP、JAVASCRIPT、VBAを同時に使っていると、IF文の比較演算子がどれがどうだったかわからなくなるのでここにまとめておく。
そうそう、文字列結合も混乱するので書いておく。
※厳密判定は値の「型」まで判定します。
1 == "1" は TRUE(真)
1 === "1" は FALSE(偽)
※PHPの論理演算子は「&&」「||」の方が「AND」「OR」より優先度が上です。
さて、ここに書いたことを忘れないようにするにはどうしたら良いでしょう?
そうそう、文字列結合も混乱するので書いておく。
PHP | JAVASCRIPT | VBA | ||
---|---|---|---|---|
比較 演算子 | 等価 | == | == | = |
厳密等価 | === | === | ||
不等価 | != | != | <> | |
厳密不等価 | !== | !== | ||
倫理 演算子 | および | && AND | && | AND |
もしくは | || OR | || | OR | |
文字列結合 | .(ピリオド) | + | & |
1 == "1" は TRUE(真)
1 === "1" は FALSE(偽)
※PHPの論理演算子は「&&」「||」の方が「AND」「OR」より優先度が上です。
さて、ここに書いたことを忘れないようにするにはどうしたら良いでしょう?
category: PHP JavaScript VBA
PHPをコマンドラインで実行(CLI)させたときのキー入力の方法 
2014/03/26 Wed.
PHPはWEBアプリケーションだけでなく、シェルスクリプトのようにコマンドライン実行させることができます。
そのとき、処理の過程でユーザーからのキーボード入力を受け付ける方法で悩んだ備忘録。
$Key = trim(fgets(STDIN));
単純だった。
標準入力からの取得。そりゃそうだ。
注意点はtrim()。
これがないと改行コードも取得するので、意図しない動きになる。
そのとき、処理の過程でユーザーからのキーボード入力を受け付ける方法で悩んだ備忘録。
$Key = trim(fgets(STDIN));
単純だった。
標準入力からの取得。そりゃそうだ。
注意点はtrim()。
これがないと改行コードも取得するので、意図しない動きになる。
category: PHP
PDOを使った時のROLLBACKやVACUUMのエラー 
2013/02/22 Fri.
ロールバックやバキュームで原因不明の実行不可エラーが発生した場合、そのコマンドの前に
$sql->execute()
が実行されていないか確認する。もし、それがあれば、
unset($sql)
を間に挟んで実行してみる。
$sql->execute()
が実行されていないか確認する。もし、それがあれば、
unset($sql)
を間に挟んで実行してみる。
category: PHP
メール受信でPHPを起動したときのエラーの書き出し場所 
2013/01/24 Thu.
結構はまったのでメモ。
PHPのエラーはphp.iniの「error_log」で指定したファイルに書き出すことができる。
コマンドラインでPHPを起動した場合も、php.iniファイルを読みこんでくれるので問題なく動いていた。
しかし、メール受信をトリガーにしたPHP実行の時だけ、エラーが「/var/log/maillog」に書き出されていた。
なんで?なぜ?
かなり悩んだが、答えは単純。
php.iniで指定したエラーログファイルに、メールサービスユーザーの権限がなかったから。
やけくそでエラーログファイルとそのディレクトリに「chmod 777」を指定したら、ちゃんと書き出されていた。
う~ん。
maillogに権限がありませんとかのエラーが出てたら、もっと早く気が付いたんだろうけどなあ。
PHPのエラーはphp.iniの「error_log」で指定したファイルに書き出すことができる。
コマンドラインでPHPを起動した場合も、php.iniファイルを読みこんでくれるので問題なく動いていた。
しかし、メール受信をトリガーにしたPHP実行の時だけ、エラーが「/var/log/maillog」に書き出されていた。
なんで?なぜ?
かなり悩んだが、答えは単純。
php.iniで指定したエラーログファイルに、メールサービスユーザーの権限がなかったから。
やけくそでエラーログファイルとそのディレクトリに「chmod 777」を指定したら、ちゃんと書き出されていた。
う~ん。
maillogに権限がありませんとかのエラーが出てたら、もっと早く気が付いたんだろうけどなあ。
category: PHP
[PHP] preg_replace 後方参照でちょっと悩んだ 
2012/09/20 Thu.
強力な正規表現が使えるPHPの関数「preg_replace」で、後方参照を使おうとしたらちょっと悩んだのでメモ。
後方参照とは正規表現の機能の一つで、括弧「()」で括った内容が一時的にバッファに記憶され、その内容を後で使えるというもの。
置換処理でよく使います。
たとえば、
何らかの文字列-500 を 何らかの文字列-800 に変換したい場合、
preg_replace("/(何らかの文字列にマッチする正規表現)-500/", "$1-800", 文字列);
このように、「何らかの文字列にマッチする正規表現」を「()」で括り、replacement部に「$1」としてやると、$1の部分に()で括った内容が入るわけです。
「()」の数を増やせば、$1,$2,$3・・・と使えます。
で、今回悩んだのは、「$1」の直後に数字が来る場合です。
何らかの文字列500 を 何らかの文字列800 の場合、先ほどは間に「-」がありましたが今回は直後に数字が来ます。つまり、
preg_replace("/(何らかの文字列にマッチする正規表現)500/", "$1800", 文字列);
こうなる。
でも、これでは「$1」なのか「$18」なのかわかりません。
で、PHPマニュアルを見ると「\${1}」としなさいと書いている。
なるほど。
PHPなので、「{$1}」とやりがちだけどそれは間違い。
それと、ちょっと注意なのは、replacement部の括りがダブルクォーテーションなのかシングルクォーテーションなのかで「\」の有無が変わってくる。
おさらい。
preg_replace("/(何らかの文字列にマッチする正規表現)500/", "\${1}800", 文字列);
preg_replace("/(何らかの文字列にマッチする正規表現)500/", '${1}800', 文字列);
です。
違いは良く見てね。
なお、直後が数字でない場合はダブルクォーテーションの場合でも「\」はいらない。
preg_replace("/(何らかの文字列にマッチする正規表現)500/", "$1EightHundred", 文字列);
後方参照とは正規表現の機能の一つで、括弧「()」で括った内容が一時的にバッファに記憶され、その内容を後で使えるというもの。
置換処理でよく使います。
たとえば、
何らかの文字列-500 を 何らかの文字列-800 に変換したい場合、
preg_replace("/(何らかの文字列にマッチする正規表現)-500/", "$1-800", 文字列);
このように、「何らかの文字列にマッチする正規表現」を「()」で括り、replacement部に「$1」としてやると、$1の部分に()で括った内容が入るわけです。
「()」の数を増やせば、$1,$2,$3・・・と使えます。
で、今回悩んだのは、「$1」の直後に数字が来る場合です。
何らかの文字列500 を 何らかの文字列800 の場合、先ほどは間に「-」がありましたが今回は直後に数字が来ます。つまり、
preg_replace("/(何らかの文字列にマッチする正規表現)500/", "$1800", 文字列);
こうなる。
でも、これでは「$1」なのか「$18」なのかわかりません。
で、PHPマニュアルを見ると「\${1}」としなさいと書いている。
なるほど。
PHPなので、「{$1}」とやりがちだけどそれは間違い。
それと、ちょっと注意なのは、replacement部の括りがダブルクォーテーションなのかシングルクォーテーションなのかで「\」の有無が変わってくる。
おさらい。
preg_replace("/(何らかの文字列にマッチする正規表現)500/", "\${1}800", 文字列);
preg_replace("/(何らかの文字列にマッチする正規表現)500/", '${1}800', 文字列);
です。
違いは良く見てね。
なお、直後が数字でない場合はダブルクォーテーションの場合でも「\」はいらない。
preg_replace("/(何らかの文字列にマッチする正規表現)500/", "$1EightHundred", 文字列);
category: PHP