ラベル PHP の投稿を表示しています。 すべての投稿を表示
ラベル PHP の投稿を表示しています。 すべての投稿を表示

2024年6月21日金曜日

PHP 月数の取得とタイムゾーン

PHP Get month number and timezone

少しはまりました。

php で任意の指定期間の月数を求める、です。ざっくりこんな感じです。

$d1 = new DateTime('2021-07-01');
$d2 = new DateTime('2022-05-31');
$interval = $d2->diff($d1);
return $interval->m;

期待値は 10 ですが 11 となります。

ちなみにExcelで以下のようにすると 10 となります。

DATEDIF("2021-07-01","2022-05-31","m") 

ググってみるとありました。タイムゾーンのようです。

$timezone = new DateTimeZone('UTC');

を追加して、

$d1 = new DateTime('2021-07-01', $timezone);

としますと期待値 10 が取得できました。
今回は月数のみなのでタイムゾーン指定でOKとします。
ケースによっては考慮しなくちゃいけないことがあるようです。



(参考)https://qiita.com/Hiraku/items/b008982c5819e296e3fd

2017年12月13日水曜日

CakePHPでコントローラーから呼び出したコントローラーのコンポーネント呼び出し

How to call the controller's component called from the controller with CakePHP


ControllerAから呼び出したControllerBに $components で宣言されているコンポーネントFooのメソッドbarを呼び出すときは手動でloadする必要があります。
ざっくりと。。。

ControllerAはこんな感じ
$B = new BController;
$B->hoge();
ControllerBはこんな感じ
$componets = ['Foo']; // コンポーネントを使うよ
function hoge() {
  // newされたときはコンポーネントを手動で読み込むよ
  if (newされたとき) {
    $this->Foo = $this->Componet->load('Foo');
    $this->Foo->startup($this); // startup()を使うときはこれも手動で
    return $this->Foo->bar();
  }
}
https://book.cakephp.org/2.0/ja/controllers/components.html

#PHP #cakephp

2016年9月8日木曜日

allow_call_time_pass_reference

allow_call_time_pass_reference

以下のWarningのとき
Call-time pass-by-reference has been deprecated in 〜
php.ini の allow_call_time_pass_reference を on にするか、
参照渡しを修正するか、という対応になるようです。

プログラムを修正するほうがよいみたいですね。

http://www.php.net/manual/ja/ini.core.php#ini.allow-call-time-pass-reference

2016年8月6日土曜日

phpMyAdmin のタイムアウト設定

Timeout setting of phpMyAdmin

phpMyAdminのデフォルトタイムアウトは1440秒。

phpMyAdmin の config.inc.php に以下の一行を追加します。

$cfg['LoginCookieValidity'] = 14400;

これで4時間

以上!

php.ini もね。

2015年2月7日土曜日

CodeIgniterのActiveRecordのWHERE句の確認(補足)

先のエントリー
http://blog.wakisaka-tsuyoshi.com/2015/01/codeigniteractiverecordwhere.html
where句の中身”すべて”が取得できると思っていたのですが違っていました。

$this->db->like() でセットした条件は、

$this->db->ar_like
に格納されていました。

2015年1月31日土曜日

CodeIgniterのActiveRecordのWHERE句の確認

Confirmation of the WHERE clause of ActiveRecord of CodeIgniter

$this->db->where(); で指定した中身は、
$where = $this->db->ar_where;
で取り出せます。

CodeIgniter でサブクエリ

Subquery in CodeIgniter
ActiveRecord で EXISTS を使用するとき、

$this->db->where("EXISTS (SELECT * FROM hoge WHERE name = '"
. $this->db->escape($name)
. "' AND fuga.hoge_id = hoge.id)",
NULL,
FALSE);

第3引数にFALSE を指定するのがポイント!
そうしないと、EXISTS という文字列自体がエスケープされてしまいます。

2014年5月1日木曜日

PHP:配列の空要素を削除する

remove the empty element of the array.

PHPです。

一般的にはこちら
$dst = array_filter($ref, 'strlen');
CakePHPならこちら
$dst = Hash::filter($ref);

2013年7月28日日曜日

PHP、継承されたメソッドが呼ばれる子クラス

Child class to which the method of PHP, inherited is called.

デバッグするとき、継承されたメソッドがどの子から呼ばれているか調べたいときがあります。
タイミングとかいろいろと。
子クラスの継承メソッド呼んでるところをチェックするよりも、
親クラスのメソッドで、

get_class($this)

とすると子クラス名がわかるよ。

継承したメソッドを読んでいる小クラスのメソッド名がわかればもっといいですね。

2013年7月25日木曜日

cakephp と MySQL の tinyint(1)

MySQL の tinyint(1) にデータを登録するとき、
$model->save() すると、0 以外は 1 で登録される。

データ読み込みのテストで、直接 2 をセットし、findすると当該フィールド値が 1 となっている。

CakePHPの仕様とのこと。
以前にもハマって思い出したので備忘録として。

2013年2月2日土曜日

jQueryでボタンの2度押し防止

ボタンの2通しを防止する方法はいろいろあると想います。
今使っているのはこんな感じです。

$("button").prop("disabled", true);

$("input[type='submit'].prop("disabled", true);



↓こちらと合わせて使ってます。

イベントの処理


http://blog.wakisaka-tsuyoshi.com/2013/01/blog-post_27.html


2013年1月29日火曜日

user agent のチェック

アクセスしてくるブラウザによって処理を分けたいときがあります。
スマホやら、システム要件やら、

例えば、InternetExploere 7以降が対象という場合です。
ユーザエージェント文字列を取得し、バージョントークンを判定します。

$userAgent = env("HTTP_USER_AGENT");
if (mb_ereg('MSIE', $userAgent)) {
  preg_match("/(MSIE)(\s([\d]+))/is", $userAgenet, $versionToken);
  if ((int)$versionToken[3] >= 7) {
    // IE7以上のときの処理
  }
}

(参考)マイクロソフト社のユーザーエージェント
http://msdn.microsoft.com/ja-jp/library/ms537503(v=vs.85).aspx


2013年1月13日日曜日

xajaxでこっそりエラーが・・・

何かおかしい、いつもじゃないけど。
で、ログを見てみます。

どうやらこれかな。xajaxのエラーがこっそり?でてまして、これがそのログ
Severity: Notice  --> Undefined index:  query /var/www/html/foo/application/libraries/xajax/xajax.php 930
そして↓これが該当する箇所
$sURL.= $aURL['path'].@$aURL['query'];
なんじゃこりゃ?@_@

このアットマーク””エラー制御演算子という名称らしいです。画面にエラーを吐かない。なるほど。なにかいいことがあるのでしょうか。

さていろいろとググって見ますと、こちらに書かれています。
xajax Forums

なるほどなるほど。
ここを参考に修正してしばらく様子をみてみることにします。

ところで、

afaik

なる表現がでてきてまたまた、なんじゃこりゃ?あ、あふぇいく??

またまたGoogle先生にお願い。
As Far As I Know 「私が知っている限りでは」
という英語の省略記法らしいです。

2013年1月12日土曜日

日付処理でうっかり

日付処理でうっかりしてしまったこと。

「指定した日の○○ヶ月前の月始めの日」

を取得したい。こんなかんじに翻訳してみました。
PHP DateTimeクラスは便利ですね。
$foo = (指定した日)
$bar = (○○ヶ月前)
$dt = new DateTime($foo);
// 指定した日の$barヶ月前
$dt->modify(-($bar) - 1) . 'month');  ……(a)
// その月の月始の日
$dt->modify('first day of this month');  ……(b)
$dst = $dt->format('Y-m-d');

すると、
$foo に 1/31 などを指定したときは思ったように動作しないことがあります。

(a)の前に一旦(b)をはさんでおくとOKですね。

マニュアルにもありました。
http://php.net/manual/ja/datetime.modify.php


月始の日は常に”1”というのはさておき・・・(^^;

2013年1月6日日曜日

CakePHP2 同じフィールドをDB検索条件に指定するとき

DBを検索するとき検索条件で、以下のような指定(SQLを生成)をしたいときがあります。
WHERE foo <> 1 AND foo <> 2 …(a)
CakePHP2のfind()メソッドを使用するとき、こんな感じで条件を書いて
$conditions = array('foo <> ' => 1, 'foo <> ' => 2);
どうも思った結果が取れない???
生成されたSQLを確認すると、
WHERE foo <> 2
となっています。

どうやら同じフィールドを指定するのはうまくいかないみたいです。
で、以下のようにしてみました。
$conditions = array('foo NOT ' => (1, 2));
こうすると IN句を生成します。こんなふうに、
WHERE NOT IN (1, 2) …(b)
これで思った結果が取得できました。

先に(a)を思い浮かべてしまうのがダメだったみたいですね(^^;


2012年12月27日木曜日

TCPDF はみ出さないように!

データを出力するには、cell() や MultiCell() を使用します。
cell()で文字列を枠内におさめるように印刷するには、第9引数に1をセットします。
横幅におさまるよう縮めて出力してくれます。

あまりに長いときは、MultiCell()で複数段にしたりもします。

Webアプリでも”紙”というメディアを無視することはできませんね。

2012年12月8日土曜日

setFlash()されたかどうだか

いろいろとメッセージを表示したいものです。
そんなとき setFlash() って便利!
$this->Session->flash() する前に中身を確認したいときってあると思います。

$this->Session->setFlash('ホニャララ');
$hoge = $this->Session->read('Message.flash');

とすると、

$hoge['message'];

で確認できます。
他にもパラメータを渡せるようです。

http://book.cakephp.org/2.0/en/core-libraries/components/sessions.html
SessionComponent::setFlash(string $messagestring $element = 'default'array $params = array()string $key = 'flash')


2012年11月23日金曜日

PHP連想配列の先頭にアイテムを追加

連想配列の先頭にアイテムを追加したい。

$ary = array('001' => 'item1', '002' => 'item2', '003' => 'item3');

array_reverse($ary);
$ary['addkey'] = 'addvalue';
array_reverse($ary);

ひっくり返した配列にアイテムを追加してまたひっくり返す。

セレクトボックスのソース使用している連想配列の先頭にアイテムを追加したいときなど。

2012年11月8日木曜日

cakePHP2 「設定より規約」

CakePHP2です。

「設定より規約」

"convention over configuration"

なるほど、わかります。
これにピッタリハマる案件は幸せです。保守も楽チン???

さて、既存システムのリプレース、やり方はいろいろとあると思います。

予算などなどいろいろな制約の都合上、既存システムからの移行でDBはそのままでいくぜ。
ということもあると思います。結構あると思います。

こんなとき、この「規約」がフレームワークを使用する上でのメリットと、まさにトレードオフになったりならなかったり。

親子関係を持つレコードセットを取得するとき、規約に則っていれば、

find('threaded',…)

などで簡単に取得できます。(これスゴイ!)
がしかし、既存DBレイアウトのままのときはそうもいきません。

join して、find('all', …) で取得したレコードセットを親子関係になるように整形する必要があります。
 ここのコストが結構なものだったりします。
どうせビューでforeachするからそこでやっちゃえよ。というのもわかります。
でもモデルで親子関係の配列を返してやればメンテナンスも楽チンなのです。

実装するとき、SQLがスッと頭に浮かぶのだけれども、せっかくのフレームワーク、ここは「規約」にのっとって、fields/conditions/join/order などを find()メソッドに渡すように書こうとすると結構時間がかかります。(慣れですかね。)

求めるSQL文は頭にあって、それを生成するような、「規約」にのっとった書き方をするのは、ううむ、と思うこともあります。
生成されるのは、結局SQL文です。なので素のSQLをイメージできなきゃ、「規約」も絵に書いた餅ということですね。


2012年7月22日日曜日

TCPDF エラー6606

TCPDF で、変数$hoge の値を出力するとき、

MultiCell($w, $h, $hoge);

とか

Cell($w, $h, $hoge);

とかします。

$hogeがNULLのとき、
Cell()は空白を出力しますが、
MultiCell() はエラー6606 となります。