[CakePHP]バリデーションではまった話

CakePHP4のバリデーションではまった話

バリデーションのalphaNumericが日本語をはじかないというので
preg_matchで実装しようとしたら動作しなくて困った

最初は下記のように書いたら「The provided value is invalid」のエラーが発生

色々調べてみると・・・
https://www.php.net/manual/ja/function.preg-match.php

preg_matchの戻り値
マッチした場合は1
マッチしなかった場合は0
失敗した場合はfalse

そう。マッチしない場合はfalseではない。
なので上記に書いたコードだと動作しない。

下記のように書き換えて動作確認できた!

戻り値をifで判定してreturnでちゃんと戻す。

これで1日悩んでました。

Gitの認証をアクセストークンへ変更【Sourcetree】

2021年8月13日から変更になった仕様
アカウント、パスワードの廃止問題の解決方法

私はSourcetreeしか使ってませんが・・・

プッシュしようとすると下記のようなエラーが発生。
remote: Support for password authentication was removed on August 13, 2021. Please use a personal access token instead.

まずはGitHubでアクセストークンをゲットします。
https://github.com/

ログイン後、右上のアイコンから「Settings」へ

「Developer settings」へ移動

「Personal access tokens」へ移動

「Generate new token」へ移動

「Note」に分かりやすいようにメモを入力
「Select scopes」は「repo」を選択

「Generate token」をクリック

アクセストークンが表示されるので、それをコピーしてなくさないように別ファイルで保存します。

次はSourcetreeでの作業です。

一部サイトでURLにトークンを入れる方法を書いているところもありますが、
それは危険なのでマネしないでください。
海外のフォーラムでも「それは危険」と指摘されているようです。

以下が解決方法です。

下記ディレクトリに移動します。
C:\Users\****\AppData\Local\Atlassian\SourceTree

passwdファイルを編集します。

アカウントと暗号化されたパスワードの2行があるので、その2行を削除します。

Sourcetreeを起動します。
再度プッシュします。
アカウントとパスワードを聞いてくるので、パスワードの欄にトークンを入力します。

これでプッシュができるようになります。

[CakePHP]ダウンロード後にページをリロードしたい

データをダウンロード処理したときにフラグを立てるなど色々処理をしている。
ダウンロード後にリダイレクトかリロードをしたいと思った。

ダウンロードの処理でheaderを使っているのでリダイレクトのLocationが使えない。

そこでJSで別ウインドを開いて、そこにダウンロード処理を渡す。
その処理の後にページをリロードする処理をしてあげるとOK。

リダイレクトしたい場合はreloadのところをhrefにするとOK

郵便番号入力で住所を抽出してくれるJS

AjaxZip3の処理を変更した話
大変便利なライブラリ
https://github.com/ajaxzip3/ajaxzip3.github.io

下記のようにinputのonKeyUpを使った場合
意図しない動きをすることがあった。

郵便番号を前半、後半の二つに分けている。
前半3桁。後半4桁です。

前半3桁、後半4桁入力すると住所欄に住所が入力される。
というのは正常な動き。

これを下記の条件にすると動きが変わる

「全角入力モードにした状態で前半3桁に7桁の郵便番号を入力するとonkeyupが作動し住所が入力される。」

入力確定前にonkeyupが動作しています。
inputはmaxlengthで3にしているので3桁しか入力されない。

onKeyUpはやめてjQueryで制御することにする。

これで確定後の値で動作になるので意図した動きになりました。

【未解決】CakePHP4のログアウト時のセッション削除

CakePHP4でログイン機能Authのログアウト時にセッションが削除できない問題

未解決ですが情報記載します。

ログアウト処理時にセッションのdestroyを行うとログイン情報が削除できないのです。


$this->Auth->logout();
$this->session->destroy();

Auth->logoutのみ
 同列のセッション情報が生きている
session->destroyを追加
 Authのログイン情報が生きている

Auth->logoutはAuth配下のセッション情報は削除できるが、Authと同列のものは削除できていない。
そこで直接Session->destroyを行うと、同列のものは削除できたがAuthの情報は削除できずに残っていた。

調べてみても情報なし。
しょうがないのでdeleteで個別に削除


$this->Auth->logout();
$this->session->delete("Data");
$this->session->delete("HogeHoge");

ちなみにPHP関数でsession_destroyだとエラーでした。

CakePHP4のFormヘルパーでDivタグの削除

CakePHP4のフォームヘルパーでDIVが削除できなくて困った。
DIVのオプションがなくなったようです。

CakePHP3からなくなったのかな?
CakePHP3のやりかただと削除できなかったので、CakePHP4のマニュアルに載っているやり方で削除します。

フォームヘルパーのテンプレートで対応

マニュアル
https://book.cakephp.org/4/ja/views/helpers/form.html#formhelper

個別にできないのは結構不便。
他にやり方があるのだろうか・・・

プラグインJetpackのエラー

WordPressのプラグイン更新などしているとJetpackのエラーがでることが度々あった。

動作には問題なさそうだけど気になるので調べて見ました。

エラー内容は↓


Fatal error: Uncaught Error: Class 'Automattic\Jetpack\Connection\Tokens' not found in ****/wp-content/plugins/jetpack/vendor/automattic/jetpack-connection/src/class-client.php:75
Stack trace:
#0 ****/wp-content/plugins/jetpack/vendor/automattic/jetpack-connection/src/class-client.php(26): Automattic\Jetpack\Connection\Client::build_signed_request(Array, 'query('jetpack.syncAct...', Array)
#3 ****/wp-includes/class-wp-hook.php(287): Automattic\Jetpack\Sync\Actions::send_data(Array, 'deflate-json-ar...', 1614820658.9668, 'sync', 0.0076038837432861, 0.013982057571411, 5, '60403532e7074')
#4 **** in ****/wp-content/plugins/jetpack/vendor/automattic/jetpack-connection/src/class-client.php on line 75

更新していくとゴミコード?などがそのままになっていてエラーになるらしいです。
Jetpackを一旦削除して新規インストールを行うと上記エラーが解消されます。

contact form 7の警告を修正

メールフォームプラグインのcontact form 7 で送信ボタンを押すと下記の警告が発生

「Deprecated: get_option がバージョン 5.5.0 から非推奨になった引数付きで呼び出されました。オプションキー「blacklist_keys」は「disallowed_keys」に名前が変更されました。 in ****\wp-includes\functions.php on line 5061」

警告なので無視はできるけど、表示されたら気になってしまう!

ってことで修正。

「blacklist_keys」を使っちゃいけないよという警告だと思うので「blacklist_keys」を探してみる。

下記ファイルに発見!
\wp-content\plugins\contact-form-7\modules\disallowed-list.php

52行目

修正前
$mod_keys = trim( get_option( ‘blacklist_keys’ ) );

修正後
$mod_keys = trim( get_option( ‘disallowed_keys’ ) );

これで警告が消えました。
やったね!

PostgreSQLのエスケープ事情

備忘録的にアップします。

かなり昔に作られたシステムのメンテで学んだこと
pg_queryを使用してSQLを処理していましたが、自前のエスケープが効いてなくてエラーが発生していました。

addslashesで処理をしていましたが・・・

Googleティーチャーに聞いてみると記事を発見

standard_conforming_strings がOnの場合はエスケープが文字として認識される。
\nと改行コードがバックスラッシュとnの2文字と認識されるようです。

PostgreSQL9.1以降はこの値のデフォルトがOnということ
それで自前でエスケープしてもエラーになったと。

standard_conforming_stringsの説明

pg_queryを使っていたのをpg_query_paramsに変更することで関数でエスケープしてくれるので、これで回避!

pg_query_params

エスケープがバックスラッシュではなくなったってことですね。

参考:徳丸浩の日記

PHPのエラーを表示する

PHPでエラーが表示されずに困っていてその調整で初めて知ったこと。

PHPのエラー表示には「display_errors」を使います。
これがOffになっているとエラーが表示されません。

今回これがOnになっているのにエラーが表示されないのです。
PHPのバージョンは5.6.x

htaccessを見てみると下記の通り

お判りいただけただろうか…

正解は下記です。

なんと!htaccessで記述する場合はE_ALLのような定数を使ってはいけないのです。
数値で記述するとちゃんと認識されます!

各定数の数値はこちらで調べてください。

あー 知らなかった~
勉強なりました。