[PHP]大量の配列をPOST/GETで渡す時に、要素が途中で切れて、すべて渡せない件。

分かった今はなんてことないのですが……(・ω・`)

PHPで大量のパラメータをPOSTで送ろうとする(自分の場合は1160個程度)と、こんなエラーが出てきました。

Warning: Maximum number of allowable file uploads has been exceeded in Unknown on line 0

とりあえず調べると、php.ini内にある「max_input_vars」プロパティをいじくれよ!と公式ドキュメントに書いてありました。
http://php.net/manual/ja/info.configuration.php

自分のphp.iniを見てみると、どこにも書いていないのでとりあえず追加。

max_input_vars = 2000

ちなみにデフォルトの値は1000みたいです。普通ならこの数で十分足りるはずなんですけどね……。

ほんと、なんてことない話なんですけど、俺がこの問題にぶつかったときにいじくっていたのがECCUBEで、こいつは画面上にPHPのエラーをそのまま吐き出してくれないんですよね。
仕方ないのでapacheのエラーログを見てみると、明らかに怪しいエラーがわんさかあったので、それを手掛かりに解決できました。

……あれ、この記事を書いていて思ったんだけど、よく考えたら、ECCUBEほどのものなら、デバッグモードぐらい用意されてるんじゃないだろうか?

探してみたらありました。これで出てくるんじゃないかしらorz
http://web-karakuri.com/archives/2510

複数行にまたがってパターン検索したい時は、「マルチラインモード」じゃなくて「シングルラインモード」で検索するもんだと今頃気がついた水曜日の夜。

どうもご無沙汰してます。にしふなです。

正規表現で、デリミタ(/)の後にiだかgだとか入れて、いろんなことができて幸せになれる機能があるじゃないですか。
その機能の中に、複数行にまたがってパターンをマッチさせるか否か、と言う機能があるじゃないですか。ありますよね。
俺はそれを、単一行マッチを「シングルラインモード」、複数行マッチを「マルチラインモード」だと思ってたんですね。
でも実際は、複数行マッチさせたい場合はシングルラインモードを使うみたいなんですね。

なぜなら、「マルチ」、「シングル」は、「検索される側の文字列」(php風にいえば$subject)を、一行として扱うか、それとも複数行として扱うか、と言う違いを切り替える言葉なんですね。

例えば、下記のように人が見やすいように改行・インデントが加えられたソースコードがあったとします。

このようなソースコードに「シングルラインモード」を適用すると、以下のように扱われるみたいです。

つまり、改行・インデントといった、整形に関わる記号をすべて「通常の文字」として扱い、「検索される側の文字列」を1行としてみなすモードが「シングルラインモード」と言うことみたいなんですね。
と言うことは、正規表現の挙動はどちらのモードでも変わってないということになりますね。シングルでもマルチでも、1行分しかパターンを適用していないです。

とりあえず結論は、複数行にまたがって検索したい時は「シングルラインモード」で検索しろ!ってことですね。
ちなみに俺は、このことに気づくまで1時間ぐらいウンウン唸ってました。なんというかお恥ずかしい……(;ω;`)

でもですね、言い訳じみた感じになってしまって恐縮ですが、Web上で正規表現のチェックが出来る「PHP正規表現チェッカー」さんでは、複数行にまたがってパターン検索するときには「マルチラインモード(m)」にチェックを入れるんですよ!! これはかなり混乱してしまいました……まじどっちなんだよとorz
でも、このツール自体はかなり便利なので、気にせず使っていくと思いますけどね。
http://www.rider-n.sakura.ne.jp/regexp/regexp.php

Zend FrameworkからGoogle CalendarのAPIを利用してイベントの追加をするとき、Author属性は書き込める?

タイトルの通り、Google Calendar にAPI経由でイベントの追加をする際に、Author属性(カレンダーのイベントの作成者)をどうやって書きこんだらいいか?という件です。

自分が使っているZend Frameworkのバージョンは1.9.6です。最新バージョン(1.11.11)でも変わらないと思います。

結論から言うと、書き込めないみたいですね(´;ω;)

まず自分が参照したZendFrameworkのマニュアルの中の1ページ「Google Calendarの使用法」(http://framework.zend.com/manual/1.9/ja/zend.gdata.calendar.html)には、Author属性についてはこう書いてあります。

その他、オプションで設定できる属性は次のようになります。

  • Author は、そのイベントを作成したユーザについての情報です。

この文面を読む限り、Authorは設定できるものだと思いますよね??でもサンプルコードにはAuthorの書き方は書いてないし、マニュアル以外の記事にもそれらしいものは載ってませんでした。

仕方ないので、Google本家の「Data API Developer’s Guide: PHP」(http://code.google.com/intl/ja/apis/calendar/data/1.0/developers_guide_php.html#CreatingEvents )をのぞいてみたら、こんなことが書いてありました。

Other useful functions include but are not limited to:

  • author, retrieved using getAuthor, can be used to access the user who created the event. Note that the calendar API will not accept user-submitted updates to this attribute.

多分、「APIじゃこの属性はいじれないよ!」みたいなことでも書いてあるんですかね?英語よくわかんない(つД`)

とりあえず、この文面を見る限りはAuthor属性は変更できないみたいです。この問題でかなりの時間ハマってしまいました。トホホorz

Zen-CodingをEclipse IDE(またはAptanaなど)にインストールする

どうもこんばんわ。

今回はZen-Codingのインストールについてのメモです。Zen-Codingについては各所で色々書いている方がおられますので、そちらの記事をお読み頂くとして、とりあえず本題へ。

自分がいつも使っているのはAptana Studioなんですが、↓の記事を読んで、Aptanaにも簡単にインストールできることを知りました。

知らない人は損してる?コーディングが3倍速くなるZen-Codingを導入してみた – EC studio デザインブログ
http://designblog.ecstudio.jp/htmlcss/zen-coding-aptana.html

でも、公式ページを見ても、DownloadページにはAptana用のファイルがどこにもなかったんですね。

しかし、ページ内をよくよく見てみると、こんなことが書いてありました。

Officially supported editors

These plugins are developed by Zen Coding team and guarantee to have full support of all Zen Coding latest features.

EclipseベースのIDEに関しては、どうも公式サポートエディターになったらしいですね。ここにあるリンクをクリックして飛ぶと、インストール方法が書いてありました。

Eclipse(Aptanaなど)へのZen-Codingインストール方法

  1. Eclipse本体画面上部にあるメニューバー内の「ヘルプ(Help)」を押し、
  2. 出てきたメニュー内の「新規ソフトウェアのインストール(Install New Software)」を押す。
  3. 出てきた画面の右上「追加(Add)」ボタンを押して、出てきたダイアログ内の「ロケーション」ボックスに、 http://zen-coding.ru/eclipse/updates/  もしくは http://media.chikuyonok.ru/eclipse/updates/  を入力。
  4. 画面の指示通りに進んでインストール完了。

なんだかとても簡単なインストールになっています。おぢちゃんびっくりだよぉ(・Д・`;)

しかも、公式対応になったことで、Eclipse上で編集しているファイルならどんな状態でもZen-Codingが使えるようになっています。(これ以前は、Zen-Codingのファイルが入っているプロジェクトを同時に開いていないと有効になりませんでした。)

まぁ波にかなり乗り遅れ、今や引潮に流されている感のあるタイミングですが、とりあえずインストールしてみたんですよ。使ってみると本当に便利ですねこれ。リストとかテーブルとかドロップダウンボックスとか、やたら大量にタグを使う構造を組む時にはかなり重宝します。

とりあえずこんな感じで……今日はこの辺で~(´・ω・)ノ

[PHP] foreach内で参照渡しをしたときに、参照が死なずに残ってしまうのはなぜか

どうもこんにちは。

PHPをいじっていて少し引っかかったことがあったのでメモメモ……

foreach文の中で、 引数として渡している配列の中身を変更するために、参照渡し(&$hogeみたいな感じで書く)を利用してみました。
↓例えばこんな感じで

こうすると、配列$aryHogeの中身がちゃんと変更されます。
でも、下記のように書くと、なんだかおかしなことになります。

上記のように書くと、最初の配列$aryHogeの値が書き変わってしまいます。
どうやら、 foreachで作成した変数$itemに、$aryHogeの参照が残ったままになっているみたいです。

仕方ないので、とりあえず場当たり的に、2つ目のforeachの変数を$valのような別の名前に変えて対処しましたが、何でこうなるのか気になったので調べてみたら、すぐに引っかかりました。

foreachの参照 – CROOZ Tech Blog http://techblog.crooz.jp/?p=4738

最後に注意点として、PHPにはブロックスコープがないので
foreachで作成した$keyや$valueは、foreachを抜けても値が入ったままです。

なので参照渡しでつかった$valueにうっかり値をいれてしまうと…
参照先の値が書き換わってしまいます。
なので忘れずにunsetしましょう。

「ブロックスコープがない」。if文やらfor文やらの内部で宣言した変数が外でもそのまま使えるってことですわね。
これって、宣言も代入も同じ構文のPHPなんかじゃ、ミスの温床になるんじゃないかしら??

ここまで書いていて気がついたのですが、自分もよくif文の中で初めて宣言した変数なんかに平気でアクセスしてました。今になって考えると無意識にそんなことをしてたんですな……なんだか恐ろしい(;ω;`)