- 投稿日:2019-09-15T20:56:34+09:00
Laravel6.0でログイン機能の実装メモ
- 投稿日:2019-09-15T20:50:02+09:00
送信フォームで二重送信が起きる場合に疑う場所
比較的レアな状況だと思うが2度ほど同じ過ちに出会ったので記録。
フォームを送信する場合になぜかバリデーションが誤作動した。
原因を辿ると以下のようなコードが。<body> <form action="testresult.php" method="POST" name="testform"> <input type="text" name="test1"> <input type="submit" onclick="submit_form()"> </body> <script> function submit_form(){ document.testform.submit(); } </script>
testresult.php
にフォームを送信したくて、そのためにinput type="submit"
としている。
その時点でフォームは送信できているが、更にJavaScriptでもsubmitする関数をonClickで呼び出してしまっている。結果的にこのフォームは二重で送信されてしまう。
これを防ぐには、input type="submit"
をinput type="button"
に変えてしまうか、JavaScriptの関数を削除する。後者の方がすっきりする。
- 投稿日:2019-09-15T20:50:02+09:00
送信フォームで二重送信が起きる場合には
比較的レアな状況だと思うが2度ほど同じ過ちに出会ったので記録。
フォームを送信する場合になぜかバリデーションが誤作動した。
原因を辿ると以下のようなコードが。<body> <form action="testresult.php" method="POST" name="testform"> <input type="text" name="test1"> <input type="submit" onclick="submit_form()"> </body> <script> function submit_form(){ document.testform.submit(); } </script>
testresult.php
にフォームを送信したくて、そのためにinput type="submit"
としている。
その時点でフォームは送信できているが、更にJavaScriptでもsubmitする関数をonClickで呼び出してしまっている。結果的にこのフォームは二重で送信されてしまう。
これを防ぐには、input type="submit"
をinput type="button"
に変えてしまうか、JavaScriptの関数を削除する。後者の方がすっきりする。
- 投稿日:2019-09-15T15:22:49+09:00
クソコードのご紹介 #1
1. 目的
私が実務で拝読した、または、コーディングして主観的に「これはクソ」と感じたソースコードのご紹介と、独断と偏見による修正案をご笑覧ください。
2. ご紹介内容
2 - 1. 言語
PHP Version 7.2.5
2 - 2. 機能
API から取得した商品データを変数に格納する。
2 - 3. ソースコード
$url3='https://xxx.jp/xxx??api_key=xxx...'; $xml3=simplexml_load_file($url3); $json=json_encode($xml3); $array3=json_decode($json,TRUE); // var_dump($array3['Items']); /* 商品データ */ $items=array(); for($i=0;$i<count($array3['Items']);++$i) { $items[$i] =array('id' => $array3['Items'][$i]['Id']); $items[$i]=array('name' => $array3['Items'][$i]['Name']); $items[$i]=array('price' => $array3['Items'][$i]['Price']); if (isset($array3['Items'][$i]['Producer'])){ $items[$i]=array('pro_image' => $array3['Items'][$i]['Producer']); }else{ $items[$i]=array('pro_image' =>'99999'); } }2 - 4. 実行結果
array (size=1000) 0 => array (size=4) 'id' => string '673' (length=3) 'name' => null 'price' => string '0' (length=1) 'pro_image' => string '153' (length=3) 1 => array (size=4) 'id' => string '76' (length=2) 'name' => null 'price' => string '0' (length=1) 'pro_image' => string '99999' (length=5) more elements...2 - 5. 懸念点
- 変数名が抽象的で何のデータが格納されているのか伝わらない。
- 半角スペースの記述に統一感がない。
- 不要なコメントの記述がある。
- マジックナンバーの記述がある。
- simplexml_load_file() の返り値を XMLファイル と勘違いしている。
- 条件分岐は null 合体演算子 で一行記述できる。
- for の条件式に count() が記述されており、繰り返す度に count() が実行される。
3. 修正案
3 - 1. ソースコード
const NO_PRODUCER_CODE = '99999'; $xml_file_path = 'https://xxx.jp/xxx??api_key=xxx...'; $api_items = json_decode(json_encode(simplexml_load_file($xml_file_path)), TRUE); foreach ($api_items['Items'] as $item) { $items[] = [ 'id' => $item['Id'], 'name' => $item['Name'], 'price' => $item['Price'], 'pro_image' => $item['Producer'] ?? NO_PRODUCER_CODE, ]; }3 - 2. 修正点
懸念点の修正と、foreach で繰り返し処理をさせることで少し読みやすくしました。
3 - 3. 備考
今回、400 Bad Request 発生時の対策、変数名の変更による他プログラムへの影響は考慮しておりません。また、定数の定義は、定数を纏めたファイルに記述します。
4. 感想
クソコードの基準は、開発者の技術力や価値観、現場の状況によって変動します。例えば、今回の修正案、開発者によっては、 「SimpleXMLElement クラスのオブジェクトを変数に格納して、 foreach で リファレンス渡し をすればもっと簡単ですよ。」と、仰る方もいれば、「いやいや、foreach で リファレンス渡し をすると無駄にメモリを消費してしまいますよ。」と、仰る方もいるでしょう。我儘と拘りは紙一重ですね。
- 投稿日:2019-09-15T14:37:25+09:00
Yii1.1でSelect句で指定するカラムにSQL関数やCASE文を使用する方法
Yii1.1を使用する案件を対応しているのですが、ナレッジがあまりないので、まとめてみました。
はじめに
YiiではCActiveRecordやCDbCriteriaでSelect句を指定しますが、
COUNT
関数やSUM
関数を指定して取得する事は出来ましたが、
CASE
文やDATE_FORMAT
関数を指定した場合にエラーになったので、
対処方法をまとめてみました。対応方法
CDbExpressionを使用して対応します。
$criteria = new CDbCriteria(); $criteria->select = [ new CDbExpression("DATE_FORMAT('%Y-%m', t.create_date) AS create_date"), new CDbExpression("CASE create_id WHEN create_id = 9999999 THEN 管理者 ELSE ... END AS create_user_name"), ... ]; ... $result = Post::model()->find($criteria);CDbExpressionは、公式サイトで
NOW
関数を使うパターンが紹介されています。
今回の実装方法はこの応用になるのかなと思います。
- 投稿日:2019-09-15T13:27:15+09:00
ドットインストールで構築したLAMP環境のPHPを最新バージョンにアップデートする手順
概要
ドットインストールを参考にローカル開発環境を構築すると初めての人でも簡単にできますよね?私もお世話になった一人だったのですが、バージョンが古いのでいろいろと不都合があることもしばしば。
自分でアップデートしようにも、構築段階でブラックボックスな部分があって結局どうやってバージョンアップしたらいいのかわからない。という悩みを抱えている人は割と多いのかなって思います。
という事でこの記事では手っ取り早くドットインストールで構築したローカル開発環境のPHPバージョンを7.3にアップデートする手順を記載してます。
手順
必要なリポジトリの追加
$ sudo yum install epel-release $ sudo rpm -Uvh http://rpms.famillecollet.com/enterprise/remi-release-6.rpm※REMIリポジトリのURLはCentOS 6.x用のためCentOS 7.xの場合は正しく追加されません(たぶん
既存PHP環境の削除
$ sudo cp /etc/php.ini /etc/php-old.ini $ sudo yum remove php-*PHP最新環境構築
$ sudo yum install libxml2-devel libxslt-devel libedit-devel $ sudo yum install --disablerepo=* --enablerepo=epel,remi,remi-safe,remi-php73 php php-mbstring php-mysqlnd php-intl php-gd php-xml php-pecl-zip php-devel参考文献
この記事は下記記事を参考に執筆しています。
既存PHP環境の削除、PHP最新環境構築
CentOS7のPHPを5.6/7.0/7.1/7.2/7.3系にバージョンアップする
https://qiita.com/heimaru1231/items/84d0beca81ca5fdcffd0開発版のインストール
CentOSにlxmlをインストールするときにlibxml/xmlversion.hがないと怒られる場合の対処法
https://qiita.com/zabeth129/items/da3e053e303f783af9a4追加しているリポジトリの詳細
CentOSのyumレポジトリ: EPEL, Remi, Software Collectionsの違いとまとめ
https://qiita.com/takeshi_nozawa/items/ee01981b4fc338209437
- 投稿日:2019-09-15T08:28:00+09:00
PHP は組み込み関数と同名の関数・メソッドを定義できるのか
結論から言うと、関数の場合はエラーで定義できず、メソッドの場合は定義できます。
組み込み関数の
htmlspecialchars
を再定義して確かめます。関数
<?php function htmlspecialchars($args) { return $args; } $a = '<a href="https://www.yahoo.co.jp/">zozo</a>'; echo htmlspecialchars($a);結果Fatal error: Cannot redeclare htmlspecialchars() in /in/r0jYu on line 3 Process exited with code 255.再宣言できないとエラーが表示されます。
実行結果:Online PHP editor
インスタンスメソッド
<?php class A { public function htmlspecialchars($args) { return 'instance method :' . $args; } } $a = '<a href="https://www.yahoo.co.jp/">zozo</a>'; $b = new A; echo $b->htmlspecialchars($a);結果instance method :<a href="https://www.yahoo.co.jp/">zozo</a>エラーは表示されません。
実行結果:Online PHP editor
静的メソッド
<?php class A { public static function htmlspecialchars($args) { return 'static method :' . $args; } } $a = '<a href="https://www.yahoo.co.jp/">zozo</a>'; $b = new A; echo $b->htmlspecialchars($a);結果static method :<a href="https://www.yahoo.co.jp/">zozo</a>エラーは表示されません。
実行結果:Online PHP editor
インスタンスメソッド・静的メソッドの再定義
<?php class A { public function htmlspecialchars($args) { return 'instance method :' . $args; } public static function htmlspecialchars($args) { return 'static method :' . $args; } } $a = '<a href="https://www.yahoo.co.jp/">zozo</a>'; $b = new A; echo $b->htmlspecialchars($a); echo $b::htmlspecialchars($a);結果Fatal error: Cannot redeclare A::htmlspecialchars() in /in/QGdT4 on line 9 Process exited with code 255.インスタンスメソッド・静的メソッド関係なく、一度定義したインスタンスメソッド・静的メソッドと同名のメソッドを再定義するとエラーが表示されます。
実行結果:Online PHP editor