HTTP_Request2で$postParamsをクリアするには
少し戸惑ったのでメモ。
PEARのHTTP_Request2(http://pear.php.net/package/HTTP_Request2/)を使ってPOSTを送信しながらいくつかのページを読み込んで行く、というコードを書いていました。
HTTP_Request2のインスタンスを一つ作って、addPostParameter()でページ遷移に必要となるパラメータを次々入れていき、setUrl()でページを読み込んで行ったのですが、ページ遷移後に$postParamsをクリアする事を忘れていました。
お陰でHTTPリクエストのメッセージボディがページ遷移するするたびに増えてしまい、
本来必要ないはずのPOSTのデータが残っていてバグの原因となっていました。
一度addした$postParamsを消せば良いのですが、HTTP_Request2で$postParamsを直接扱う関数はaddPostParamater()のみです。HTTP_RequestにはclearPostData( )という関数があったようなのですが・・・
結論としては、addPostParameter()にフィールド名を指定し、値にnullを入れて消さなければならないようです。
公式Documentationによると
addPostParameter( string|array $name, [mixed $value = null])
とう定義で、デフォルトの$valueがnullになっているので特定のフィールドのPOSTデータを消したい時には
addPostParameter($field_name);
とすればいいわけです。addって名乗ってるのに!!
これじゃあまりにも読めないコードなので
addPostParameter(array($field_name => null));
が分かりやすいかな。それでもaddだけど。setならまだいいのに・・・
もう一つの解決法として、特定のフィールドだけ消したいのではなく、全部の$postParamsを消したい時には
setBody("");
として、HTTPリクエストのメッセージボディをクリアにしてもいいと思います。
演算子の優先順位のはなし(&&と=の場合)
大した事でも無いのですけど
PHPで
if($str_foo = hoge() && $str_bar = huga() && $str_baz = piyo())
と条件式の中で代入してみたら$baz以外が全て空文字列になってしまいました。
あれれ、と思って優先順位を調べてみると、代入より&&のほうが優先順位が高いのでした。
http://php.net/manual/ja/language.operators.precedence.php
なので、
かっこでくくっちゃうか、
if( ($str_foo = hoge()) && ($str_bar = huga()) && ($str_baz = piyo()) )
代入より優先順位の低いandを使って
if($str_foo = hoge() and $str_bar = huga() and $str_baz = piyo())
と書くと大丈夫です。
最初の結果は変数の$str_○○が全部未定義だったので、
hoge() && $str_bar //FALSE
が先に評価されて$str_fooに代入される。次に、
huga() && $str_baz //FALSE
が評価されて$str_barに代入される。
最後に、$str_bazにpiyo()が代入される。
というからくりだったようです。
hoge() && $str_bar
を評価した後に
$str_bar = (huga() && $str_baz)
が評価されるなんて、四則計算に慣れてると$str_barが2回計算されてるみたいでちょっと奇妙ですけどね。
余談ですが、この記事書くために調べ物してたどり着いたものが面白かったので。
普段はあんまり意識しませんが、a✕bよりabが優先順位高いのです。
はじめました!
先日参加したPHPカンファレンスで結構プログラマーの方々はブログ書いてるんだなーという事を知り、初めてみました。
SNSが流行っても、プログラミングで困ったときに参考にするのはブログなのでまだまだ需要はありますよね。
ブログ自体も5年ぶりくらいなので文章を書く手がおぼつきません・・・
とりあえず、とりあえず。デザインとかもそのうち変えよう