20190915のPHPに関する記事は7件です。

Laravel6.0でログイン機能の実装メモ

前提

laravel6.0へのアップデートにより

laravel5.8までで使用していたコマンド、

$ php artisan make:auth

が変わった。

新コマンド

$ composer require laravel/ui

の後に、

①Vueで実装

$ php artisan ui vue --auth

②Reactで実装

$ php artisan ui react --auth

vueかreactかはお好みで。

最後に

$ php artisan migrate

マイグレーションすればOK!

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

送信フォームで二重送信が起きる場合に疑う場所

比較的レアな状況だと思うが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の関数を削除する。後者の方がすっきりする。

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

送信フォームで二重送信が起きる場合には

比較的レアな状況だと思うが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の関数を削除する。後者の方がすっきりする。

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

クソコードのご紹介 #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. 懸念点

  1. 変数名が抽象的で何のデータが格納されているのか伝わらない。
  2. 半角スペースの記述に統一感がない。
  3. 不要なコメントの記述がある。
  4. マジックナンバーの記述がある。
  5. simplexml_load_file() の返り値を XMLファイル と勘違いしている。
  6. 条件分岐は null 合体演算子 で一行記述できる。
  7. 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リファレンス渡し をすると無駄にメモリを消費してしまいますよ。」と、仰る方もいるでしょう。我儘と拘りは紙一重ですね。

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

Yii1.1でSelect句で指定するカラムにSQL関数やCASE文を使用する方法

Yii1.1を使用する案件を対応しているのですが、ナレッジがあまりないので、まとめてみました。

はじめに

YiiではCActiveRecordCDbCriteriaで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関数を使うパターンが紹介されています。
今回の実装方法はこの応用になるのかなと思います。

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

ドットインストールで構築した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

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

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

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む