ど素人から毛を生やす。<延>

PHP

array_search()やin_array()する前には、ちゃんとarray_map('trim', $array)するんだぞ!ってメモ。

Web > PHP 2019年4月23日(最終更新:3月前)

どもです。
しょーもないことでハマったので備忘。

外部から貰ったCSVを取り込むのに、その項目が何列目にあるかをarray_search()で照合しようとしたら、特定の項目でfalse食らってしまったわけですね。

array_search()でやらかし易いミスといえば、

・第三引数にtrueを設定しないことで、文字列型と数値型の比較になってしまう。
・返り値0を考慮せず、if文にて「===false」を省略する

の2種類と思われます。
これはarray_search()の関数としての特性に由来することなので、探したらすぐに事例が出ます。

が、本件はもっと下らない話。

外部業者がCSVの出力でミスって、

"項目名1","項目名2","項目名3"

なんてCSVをくれやがったことで、項目名1が「項目名1... 続きを読む »

file_get_contents()はhttpでないと持ち帰るものが変わってしまう?

Web > PHP 2019年4月11日(最終更新:3月前)

どもです。
file_get_contents()に関する備忘録。

PDFを生成し、添付したメールを送信。そのためには作成したPDFをいちど取得しなければなりません。
しかし使用しているPDF作成ライブラリの仕様として、header()を変更してechoしてしまいます。
このため、include()でなくfile_get_contents()を使って生成データを「取得」することが求められます。

PDFを作成するソース自体は同ディレクトリにあるので、

$pdf = file_get_contents('./sauce.php')

としてみたところ、$pdfの中身はsauce.phpがそのまま入ってしまいました。
また、クエリストリングをつけるとNo such file or directoryです(これは当然か)。... 続きを読む »

PHPでファイルをダウンロードさせようとしたら空の実行ファイルがダウンロードされた事案のたぶんレアケース。

Web > PHP 2019年3月26日(最終更新:4月前)

どもです。

DBからcsvをダウンロードするphpを移植したら、空の(実行ファイル名).phpがダウンロードされてしまう事象が起きました。
開発や検証中にはそのような事例は一度も無かったのですが、はて。

この原因ですが、端的に言えば何も出力できないのに出力しようとしたことによるものでした。

解説しますと、最終的に出力するための記載がこれです。

header("Pragma: public");
header("Expires: 0");
header("Cache-Control: must-revalidate, post-check=0, pre-check=0");
... 続きを読む »

MySQLから取り出した「日付データがあるとき」の条件分岐を、できるだけ最短の記述で行いたい。

Web > PHP 2018年12月28日(最終更新:7月前)

どもです。

PHPで日付データがあるとき、の条件分岐をしたい。

このとき、厳密な日付フォーマットチェックを行いたいのであれば、DateTimeクラスを用いるのが妥当です。
参考サイト:
[Qitta]【PHP】DateTimeクラスでcheckdate()より汎用性のある日付チェックを行う
[SOFTELメモ]【php】DateTimeクラスで日付の表示の補正をおこなう

しかし、今回はMySQLからデータを取り出して使いたい場合です。
厳密なフォーマットチェックは入力時に行うべきことであって、この場合はもっとシンプルにできるはず。

そして問題となるのはMySQLにて、DATETIMEカラムをNOT NULLにすると、
デフォルト値が「0000-00-00 00:00:00」になるということです。

さて、どうすれば最短かつ明瞭な条件分岐になるか。

strtotime()を利用

if(strtotime($date)
... 続きを読む »

MySQLをPHPでSELECTしたとき、resource型で保持して使用するときにwhileするのと一度配列にぶち込んでforeachするのとで、どれくらい負荷と速度に差があるのか調べてみた。

Web > PHP 2018年12月7日(最終更新:8月前)

どもです。

つい昨日、こんなことを呟きました。

膨大な行のMySQLをPHPでSELECTしたとき、resource型で保持して使用するときにwhileするのと一度配列にぶち込んでforeachするのとで、どれくらい負荷と速度に差があるのか知りたい。
いや前者の方が良いのはわかるんだけど!可能なら後者でいきたいんだ!

ということで、調べます。
PHPバージョンは5.4.15、Linuxサーバーです。

材料:
1万行×11カラムのテスト用テーブル

結果
1. Max Memory Usage : 5.978 ... 続きを読む »

FTPS中のファイルを更新日時順で取得したかった話。

Web > PHP 2018年10月31日(最終更新:9月前)

どもです。

FTPS上にアップされたCSVをDBに落とすプログラムを作成していたのですが、このときにファイル名は問わないという縛りがあり、では何を基準に複数ファイルがあったときの処理順を定めるべきか。

普通に考えたらファイルの更新日時かアップロード日時ですな。
ファイル更新日時の昇順といたしましょう。

さて、どうすればそれが適うのか。

ローカルのファイルの日時を取得するなら…

filemtimeですな。

使い方はこちらのサイト様がとてもわかりやすい。

しかし、今回はFTPなので、絶対パスで指定するfilemtimeではない。さて。

ftp_nlistって引数lsコマンド使えるのか→できないな…、何故だ。

ftp_nlistって... 続きを読む »

PHP4サーバーにXML/ParserをインストールしたらFatal errorになった話

Web > PHP 2018年10月5日(最終更新:10月前)

どもです。

PHP4のサーバーでXMLの読み取りを行いたく、【Pear】Package Information: XML_Serializerを導入。

本番サーバーへリリースしたところ、「XML/Parser.phpがねーぞ!」とお断りされたので慌ててサーバーのライブラリを追加導入。したところ、今度は

Fatal error: Undefined class name 'self' in ...
... 続きを読む »

一定文字数、一定バイト数で文字列を分割する的なアレ。

Web > PHP 2018年8月17日(最終更新:9月前)

どもです。
一続きの文字列を、一定の文字数またはバイト数で分割する備忘録。

両方とも$arrayに分割された文字列が入ります。

原理としては、まぁ見りゃわかるやつですが、

[i] = 切取(加工前の[i], 0, $byte);
[i+1] = 切取(加工前の[i], 文字カウント([i]), 文字カウント(加工前の[i]));

mb_substr... 続きを読む »

str_replace()にNULLを突っ込むと…

Web > PHP 2018年6月21日(最終更新:1年前)

どもです。

仕事でちょっとヘマやらかしまして、ちょっと凹んでます。
まぁ失敗談は置いておいて、その過程で見つけてちょっと驚いたstr_replace()の話。

str_replace()にNULLを入れるとどうなるか、です。

なんと、ひとつもエラーにならない。文字列型を返してくれる。

str_replace()を通したNULLは、すべて空の文字列に変換されてしまうようです。

ちなみにPHP4と5で事象確認済み。7の簡易テスト環境が欲しい今日この頃。

この記事は役に立ちましたか?
  • _(:3」∠)_ 面白かった (0)
  • (・∀・)
... 続きを読む »

wkhtmltopdfで明朝体フォントを指定したら、全く違うフォントで出力された話。

Web > PHP 2018年5月10日(最終更新:1年前)

どもです。

ウェブサイト上でPDFファイルを作成する手段はいくつかありますが、今回は「wkhtmltopdf」について。

こいつが既に導入されているサイトで、新たなPDF生成システムを作ることに。
サンプルが明朝体だったので、いつものノリで明朝のfont-familyを指定

HTML上での正常な反映を確認。さあPDF出力、ポン。

待て待ておい待て待て待て!!!

明朝体どころか、やたらファンシーでポップなフォント(vl-gothic-regular)にされてんじゃねーか!?

サーバーに游明朝が入ってなかったから、にしてはフォント無指定やserifのみのときと異なっているのが妙だ。
ちなみにserifのみのときは、こう。... 続きを読む »