脱力系備忘録BloG ホーム »PHP

PHPのファイル関連関数でSSLを使った接続をしようとしたら接続できない  

PHP5.6で「file_get_contens」や「fopen」を使って「https://~」で始まるリモートファイルにアクセスしようとしたら、

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

とか

SSL operation failed

とかいうエラーを出して接続に失敗する。

なぜだ?

OpenSSLはインストールされている。もちろん、PHPのコンパイル時にも「configure」で組み込んでいる。

phpinfo()」を確認。

Registered PHP Streams
https」が記載されている。

allow_url_fopen
当然ながら、「On」だ。

うーむ。
あとやってないことと言えば・・・

「ふえぇぇぇぇ。PHPマニュアルちゃんと読んでなかったよぅ」

ということで今からバージョン変更時の注意書きを読みに行く

PHP 5.6.x における OpenSSL 関連の変更

書いてある。

category: PHP

PHPのヒアドキュメントの中で定数を表示する方法  

ありません。

PHPの仕様なので仕方がない。
けど、なんとか無理くそ表示させてみた。

category: PHP

PHPの文字列と数値の比較であせった  

プログラムを組んでテストする際、絶対エラーが出るデータを入力したらエラーがでず、調べたらPHPの仕様上のことなので今更ながらあせったメモ。

category: PHP

IF文の判定比較演算子をすぐ忘れるので困る  

PHP、JAVASCRIPT、VBAを同時に使っていると、IF文の比較演算子がどれがどうだったかわからなくなるのでここにまとめておく。
そうそう、文字列結合も混乱するので書いておく。

 PHPJAVASCRIPTVBA
比較
演算子
等価=====
厳密等価====== 
不等価!=!=<>
厳密不等価!==!== 
倫理
演算子
および&&
AND
&&AND
もしくは||
OR
||OR
文字列結合.(ピリオド)+&
※厳密判定は値の「型」まで判定します。
1 == "1" は TRUE(真)
1 === "1" は FALSE(偽)

※PHPの論理演算子は「&&」「||」の方が「AND」「OR」より優先度が上です。


さて、ここに書いたことを忘れないようにするにはどうしたら良いでしょう?

category: PHP JavaScript VBA

PHPをコマンドラインで実行(CLI)させたときのキー入力の方法  

PHPはWEBアプリケーションだけでなく、シェルスクリプトのようにコマンドライン実行させることができます。
そのとき、処理の過程でユーザーからのキーボード入力を受け付ける方法で悩んだ備忘録。

$Key = trim(fgets(STDIN));
単純だった。
標準入力からの取得。そりゃそうだ。

注意点はtrim()。
これがないと改行コードも取得するので、意図しない動きになる。

category: PHP

PDOを使った時のROLLBACKやVACUUMのエラー  

ロールバックやバキュームで原因不明の実行不可エラーが発生した場合、そのコマンドの前に
$sql->execute()
が実行されていないか確認する。もし、それがあれば、
unset($sql)
を間に挟んで実行してみる。

category: PHP

メール受信でPHPを起動したときのエラーの書き出し場所  

結構はまったのでメモ。

PHPのエラーはphp.iniの「error_log」で指定したファイルに書き出すことができる。
コマンドラインでPHPを起動した場合も、php.iniファイルを読みこんでくれるので問題なく動いていた。
しかし、メール受信をトリガーにしたPHP実行の時だけ、エラーが「/var/log/maillog」に書き出されていた。

なんで?なぜ?

かなり悩んだが、答えは単純。
php.iniで指定したエラーログファイルに、メールサービスユーザーの権限がなかったから。
やけくそでエラーログファイルとそのディレクトリに「chmod 777」を指定したら、ちゃんと書き出されていた。

う~ん。
maillogに権限がありませんとかのエラーが出てたら、もっと早く気が付いたんだろうけどなあ。

category: PHP

[PHP] preg_replace 後方参照でちょっと悩んだ  

強力な正規表現が使える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", 文字列);

category: PHP

PHPはリクエスト変数名のドットがアンダーバーに変わる  

$_POSTや$_GETで値を渡すときの変数名。
普段は変数名にドット「.」を使うことがないので今まで気が付かなかったが、今回ひょんなことで気が付いた。
リクエスト変数名に「.」を使うと、自動的にアンダーバー「_」に変わるんですね。
あらためて変数名の基本をPHPマニュアルで見てみると、「.」は使えないんですね。おほほ。今まで知らなかった。
ということは、$_COOKIEにも影響するんでしょうね。

category: PHP

プロフィール

お問い合わせ

最新記事

最新コメント

▲ Pagetop