20200603のPHPに関する記事は12件です。

【プログラミング】吾輩は関数である名前はまだない

はじめに

この記事ではチョットキニナル
プログラミングワードについて書いています。


ラムダ式

初めてラムダ式と聞いて
ピンと来ませんでしたが
ラムダ式とは要するに

「無名関数」を表現する為の
書き方のことである。


無名関数

英語だといろんな呼び名があるみたいです。

nameless function
anonymous function


無名関数とは

その名の通り
名前を持たない状態で定義される関数のこと

通常の関数の場合は以下のような定義方法を使うと思う。
PHPで例を出すと

<?php
  function add($args1, $args2) {
    return $args1 + $args2
  }
  $result = add(1,2);
  echo $result;
  //3
?>

無名関数で定義すると

名前がない状態で定義されるが
変数に代入したときに関数オブジェクトに化ける。

この時初めて関数名を持つことができる。

<?php
  $add = function ($args1,$args2){
      return $args1 + $args2;
  };

  $result = $add(1,2);
  echo $result;
  //3
?>

どんなときにつかう

周りを見渡す限りでは
主にイベントプロシージャに使われている。
ような気がする。

というのも
イベントプロシージャは別で定義するより
すぐその場で書いてしまったほうが
よかったりする。

C#では
コマンドボタンオブジェクトに
イベント登録を行うとき使う。


使うことのメリット

・関数を定義しないのでコンパクトであること
・定義済の関数名に依存しないこと
・コールバック関数として利用しやすいこと


まとめ

今回はラムダ式について書きました。
うまく扱えれば
ベーシックな関数定義を増やすことなく
関数を定義できます。
ただ、増やしすぎても
保守上の観点からはとても良くないので
適切に扱いましょう。

訂正

【無名関数で定義すると】の
関数閉包の例として取り上げたコードについて

「こういった処理をクロージャ(関数閉包)という。変数に関数を包み込むという感じかな。」

と記載させていただきましたが
関数閉包の場合は関数オブジェクトを返して
変数に代入する場合でした。

ご指摘くださった方
誠にありがとうございました。


参考資料

ラムダ式 (C# プログラミング ガイド)


おわり


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

FileSystemでファイルクリアをすると結果が取得できなくて困ったこと

背景

特定のファイルをcleanするコードを書きたくて

$result = app('files')->put($this->pathFromInput('clean'), '');
$result_str = $result ? "success" : "failure";
\Log::info("{$this->pathFromInput('clean')} cleaned: {$result_str}.");

みたいなコードを書いていたんですけど、ファイルの中身が消されてるのに結果がFalseで返ってきてておかしいなって思いました。

調査

なのでLaravelのコードをのぞいてみました。
https://github.com/laravel/framework/blob/7.x/src/Illuminate/Filesystem/Filesystem.php#L133-L136

public function put($path, $contents, $lock = false)
{
    return file_put_contents($path, $contents, $lock ? LOCK_EX : 0);
}

なんだ単にfile_put_contentsコールしてるだけなのね。PHPの方を調べてみよう。
https://www.php.net/manual/ja/function.file-put-contents.php#refsect1-function.file-put-contents-returnvalues

この関数はファイルに書き込まれたバイト数を返します。 あるいは失敗した場合には FALSE を返します。

警告
この関数は論理値 FALSE を返す可能性がありますが、FALSE として評価される値を返す可能性もあります。 詳細については 論理値の セクションを参照してください。この関数の返り値を調べるには ===演算子 を 使用してください。

...
0バイト書き込めば0が返ってくるから実質FALSEになるので$result===0$result===''で使い分けるということのようです。

まとめ

建前

PHPはこういった想定外の落とし穴があるので注意しましょう。他の言語だとこういうのあんまりないと思います…。

本心

は??????マジで?????なにこのPHPの仕様クソすぎない????なんのためにboolがあるの????言語として破綻してない????酒飲みながら考えたみたいな仕様だな????

Java, C#, Objective C, Swift, Kotlin, JavaScript, Ruby, Python, Golang と触れてきたけどここまで書きにくい言語は初めてなので正直叫びたい。

PHP大っ嫌いだー!

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

【Laravel】ミドルウェア(Middleware)で任意のパラメータを渡す。

メモとして残します。

■やり方

ミドルウェア呼び出し側

下記の例ではルーティングでミドルウェアを呼び出しているが、基本的には変わらない(はず)

//複数の場合、第二パラメータ以降はカンマで区切る
Route::middleware('my_middleware:引数1,引数2')->group(function () {

});

ミドルウェア(my_middleware)側

ミドルウェアの第二引数$nextの次に任意のパラメータを入れる引数を定義する。

namespace App\Http\Middleware;
use Closure;
class MyMiddleware
{
    public function handle($request, Closure $next, $arg1="", $arg2="")
    {
        //$arg1=引数1
        //$arg2=引数2
        return $next($request);
    }
}

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

UNIX時間(UNIX TIMESTAMP / タイムスタンプ)を普通の日付と時間に変換しながらランダムな日時を自動生成する

ランダムな日付だけでなくランダムな時刻も同時に生成

こんにちは。2038年問題まであと18年ですね。
今回は適当な日付と時間をランダムに作るPHPのコードサンプルです。
一応2038年問題も考慮して、date関数などは使わずにやりたいと思います。

2038年問題の詳しい解説はこちら

DateTimeクラスを使えばいいじゃない...という意見もありますが、フレームワークやライブラリが使えるなら「むしろCarbonでいいじゃない」ということでCarbonを使っております。

Laravelとかではお馴染みですね。CarbonはDateTimeクラスをオーバーラップした日付操作ライブラリなので、DateTimeクラスの上位互換と言えそうです。

仮に、何かしらのテスト用データを大量に挿入しつつ、更新日時をランダムに生成したいとします。Laravelのseedsにそういったコードを書いてみます。

ProductsTableSeeder.php
<?php

use Illuminate\Database\Seeder;
// Carbonを使うための宣言
use Carbon\Carbon;

// Products(商品)テーブルというものがあるとする
class ProductsTableSeeder extends Seeder
{
    /**
     * Run the database seeds.
     *
     * @return void
     */
    public function run()
    {
        // ランダムに生成したい日時の期間を決める
        // 仮に 2001-01-01 00:00:00 から 2020-05-01 23:59:59 とする
        // 日付と時刻を format('U') でUNIXタイムスタンプへ変換しておく
        $start = new Carbon('2001-01-01 00:00:00');
        $startUnix = $start->format('U'); // 978274800 に変換される
        $end = new Carbon('2020-05-01 23:59:59');
        $endUnix = $end->format('U'); // 1588345199 に変換される

        // ループで id=1 から id=1000 までの商品を自動で登録
        for($i=1;$i<=1000;$i++){
            // 用意しておいた開始・終了日時のUNIXタイムスタンプを使用してランダムな数値を生成
            $randDate = mt_rand($startUnix, $endUnix);
            // ランダムなUNIXタイムスタンプを引数にしてインスタンスを作成
            $date = new Carbon($randDate);
            DB::table('products')->insert([
                'id' => $i,
                'name' => '商品名_'.$i,
                'created_at' => '2001-01-01 00:00:00',
                // 日付&時刻は必要に応じてフォーマットを変更可
                'updated_at' => $date->format('Y-m-d H:i:s'),
            ]);
        }
    }
}

日付や時間のフォーマットは基本的に date() の関数と同じパラメータが使えます。
date() -> パラメータ format

なお乱数を発生させるときは rand() ではなく mt_rand() を使う方が実行速度も速くて良いそうです。(randの4倍以上)
暗号化に使うのはいずれも推奨されませんが、文字通りランダムな値を得るためだけであれば問題ありません。

参考URL:

rand — 乱数を生成する
mt_rand — メルセンヌ・ツイスター乱数生成器を介して乱数値を生成する
【PHP入門】ランダムな数値・文字列を生成する(rand、mt_rand)
date — ローカルの日付/時刻を書式化する
DateTime クラス
テストデータ用にランダムな日付文字列をn個生成する
特定の2つの日付の間から、ランダムに1日を取得
【PHP】DateTimeでの日時取得とフォーマット方法まとめ
PHPで2038年問題を回避するには?すぐできる対策とコード例
「2038年問題」を華麗に解決!~エンジニアの仕事~
DateTimeクラスで日付文字列とUNIX時間(タイムスタンプ)を相互変換するときのまとめ
DateTime クラスのまとめメモ
PHPで日付時刻処理を書くならCarbonを使うべき

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

MySQL5.7でアプリが動かなくなる原因の1つ

MySQLのバージョンを5.7にあげたら動かなくなった

MySQL8がリリースされているものの、まだまだMySQL5系をご利用されている場合は多いかと思います。今回はphpのアプリで利用しているMySQLのバージョンを5.6→5.7に入れ替えたときに急にアプリが動かなくなりました。

原因:sql_modeの設定

原因はMySQLの設定項目であるsql_modeでした。旧環境(5.6)と新環境(5.7)で
この設定が異なっていたため、SQLエラーが頻発していました。
(sql_modeの解説は他に詳しく書いている方が多くいると思うので省略します。)

コマンド実行で変更可能ですが運用的には/etc/my.cnf

[mysqld]
...
sql_mode=NO_AUTO_VALUE_ON_ZERO,STRICT_ALL_TABLES

みたいに明示的に指定して固定しておいたほうが間違いないかと。

sql_modeのデフォルト設定は5.7以降よく変わっているようです。(参考

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

phpMyAdminでエクスポートしておいたバックアップデータがインポートできない!?

インポートできない…

削除機能を改修している途中、誤ってデータベースのとあるテーブルのデータががっつり半分以上消えてしまったのでエクスポートしておいたテーブルのデータをインポートして元に戻そうとしました。



できない…
なぜだ…

sample.sql
1054: Unknown column 'カラム名' in 'field list'

とか

sample.sql
#1062 - Duplicate entry '1' for key 'PRIMARY'

とかエラーが出て、何をしてもどっちかのエラーが出て一向にインポートできる気がしない。

そもそもエクスポートの時点で必要な設定がされていないから!

はい。この問題が発覚してから調べて知りましたが、
エクスポートのオプションで
『DROP TABLE / VIEW / PROCEDURE / FUNCTION / EVENT コマンドを追加する』
にチェックを入れておかないとエラーが出る場合があるみたいですね。
しかもデフォルトではチェックが入っていないときた。
エラー出るならなんでデフォルトでチェック入れといてくれないんだ…なにか理由があるんだろうけど。
結構なサイトでエクスポートの方法見たときこんなこと書いてなかったから要注意ですね。
しかも今までこんな設定知らずにサーバの引越しなんかもしてたのにエラー出たことなかったから忘れそう…

エクスポート の手順

1.『エクスポート方法』で詳細を選択して、エクスポートするテーブルを選択

Macの人はcommandを押しながら複数選択できますよ。
私の場合は管理がややこしくなりそうだからテーブルごとにエクスポートしてます。

スクリーンショット 2020-06-03 11.43.42.png

2.『生成オプション』の『DROP TABLE / VIEW / PROCEDURE / FUNCTION / EVENT コマンドを追加する』にチェック

『フォーマット特有のオプション』は『構造とデータ』にチェックですね。
スクリーンショット 2020-06-03 11.49.19.png

※別のテーブルにインポートしようとしても、同名のテーブルにインポートされます。
 →テスト用に複製して名前を変えてそこにインポートしようとしたら複製元のテーブルにインポートされてあせった。(テスト用に作ってあった別のDBでやったから問題なかったけど)

SQLでインサート

しかし今回はバックアップとしてエクスポートしていたデータ。
当然元のデータはもうミスって消してしまった状態のものしかないのでエクスポートし直すなんてことができない。
なんとかこのバックアップデータをインポートする方法はないかと思ったが、結局ググってもわからなかったのでSQLでインサートすることにしました。

1.SQLの画面で『INSERT』をクリックしてINSERT文をセットする

スクリーンショット 2020-06-03 12.51.37.png

2.先ほど「VALUES」の後にある(…)に、エクスポートしていたデータをコピペして実行

エクスポートしたsqlのデータをテキストエディタで開くとサーバの情報だとかテーブルの構造だとかが入っているが、この部分より下からINSERT文が始まっている。
このINSERT文の「VALUES」以下の(…)をコピペして、1.の同じ箇所にコピペして実行すればOK!(1.で選択されている部分)

sample.sql
INSERT INTO `sample_table`(`id`, `name`, `color`, `illust`, `position`) VALUES (…)

/*1行分なら最後の「;」は不要っぽい*/

複数行インサートする場合は

sample.sql
INSERT INTO `sample_table`(`id`, `name`, `color`, `illust`, `position`) VALUES (…),(…),(…),(…),(…),(…),(…),(…);

/*複数行の場合は行ごとにカンマ「,」区切って、最後に「;」をつける*/

行数が多いとINSERT文が何回かに分けて書かれていると思うので、INSERT文の数だけ上記の手順を繰り返して入れるといいと思います。
INSERT INTOから全部コピペして入れたらいいじゃんと思うかもしれませんが、やってみたら最初のエラー1054が出てできませんでした…。

SQLもphpMyAdminもまだまだよくわかっていないので忘備録的な感じで書きましたが、もっとよく理解できるようになったらわかりやすい記事にしたいと思います。

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

DockerでつまづくLaravel Dusk何なのお前

色々事情があってブラウザテストすることになったんですよ。
そう言えばLaravelには「Dusk」っていうイカしたブラウザテストユニットがあったなとか思い出して、試しに使ってみました。
https://readouble.com/laravel/5.5/ja/dusk.html

↑のドキュメント通り、duskをインストールし、動かしてみたら

# php artisan dusk
Cannot load Xdebug - it was already loaded
Cannot load Xdebug - it was already loaded
PHPUnit 6.5.14 by Sebastian Bergmann and contributors.

E                                                                   1 / 1 (100%)

Time: 1.29 seconds, Memory: 16.00MB

There was 1 error:


1) Tests\Browser\ExampleTest::testBasicExample
Facebook\WebDriver\Exception\UnknownServerException: unknown error: cannot find Chrome binary
  (Driver info: chromedriver=2.35.528139 (47ead77cb35ad2a9a83248b292151462a66cd881),platform=Linux 4.19.76-linuxkit x86_64)

は? chromeのバイナリがないだと?

いい忘れてたけど、環境

OS/ミドルウェア/FW バージョン
CentOS 7.5
Apache 2.4.6
php 7.2.28
Laravel 5.5.46

これをDockerで組んでます。

chromeを入れてみる

んじゃ、素直に入れてみますかね。
CentOSはepel入れるとchromiumを入れることができるようになります。

$ yum install -y epel-release
$ yum install -y chromium 

よしよし、うごかしてみっかー。んー、なかなか応答が返ってこないなー、、、お、今度は /session がダメとか言ってくるなー。

1) Tests\Browser\AdminTest::testTop
Facebook\WebDriver\Exception\WebDriverCurlException: Curl error thrown for http POST to /session with params: {"desiredCapabilities":{"browserName":"chrome","platform":"ANY","chromeOptions":{"binary":"","args":["--disable-gpu","--headless"]}}}

--no-sandbox を入れてみる

なんか調べども調べども seleniumコンテナ入れろ みたいなのばっかなんですよね。なんか負けたような気がするじゃないですか。気の所為でしょうけど。

んで、たどり着いたのはこちら。
Laravel DuskをDockerコンテナ内で起動するまで

なんと、 --no-sandbox フラグを付けるだけだと……!?

DuskTestCase.phpに追記しましょ。

DuskTestCase.php
    protected function driver()
    {
        $options = (new ChromeOptions)->addArguments([
            '--disable-gpu',
            '--headless',
            '--no-sandbox', //追記
        ]);

        return RemoteWebDriver::create(
            'http://localhost:9515', DesiredCapabilities::chrome()->setCapability(
                ChromeOptions::CAPABILITY, $options
            )
        );
    }

よし、これで動いた!

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

Laravel フォームリクエストを使用してバリデーションを指定したら403エラーが出た

目的

  • フォームリクエスト(FormRequest)を使用してバリデーションを実装してブラウザから動作を確認したところルールにクリアしていても403エラーがでてしまい、当事象を解決した話をまとめる。

実施環境

  • ハードウェア環境
項目 情報
OS macOS Catalina(10.15.3)
ハードウェア MacBook Pro (16-inch ,2019)
プロセッサ 2.6 GHz 6コアIntel Core i7
メモリ 16 GB 2667 MHz DDR4
グラフィックス AMD Radeon Pro 5300M 4 GB Intel UHD Graphics 630 1536 MB
  • ソフトウェア環境
項目 情報 備考
PHP バージョン 7.4.3 Homwbrewを用いて導入
Laravel バージョン 7.0.8 commposerを用いて導入
MySQLバージョン 8.0.19 for osx10.13 on x86_64 Homwbrewを用いて導入

エラー内容

  • フォームリクエストを用いてバリデーションを実装し、定義したルールに違反していない状態でも下記のエラーが発生した。

    • 「403 This action is unauthorized.」

      スクリーンショット 2020-05-25 19.09.28.png

原因

  • このフォームリクエストを送信するための認証情報が存在しないためエラーが発生していた。
  • 本エラーをとにかく解決したい場合は当該のバリデーションルールが記載されているフォームリクエストクラスファイルを開きauthorizeメソッド内を修正する。

    • エラーの発生したフォームリクエストクラスファイルを下記に記載する。

      アプリ名ディレクトリ/app/Http/Requests/StoreContentPost.php
          <?php
      
          namespace App\Http\Requests;
      
          use Illuminate\Foundation\Http\FormRequest;
      
          class StoreContentPost extends FormRequest
          {
              /**
               * Determine if the user is authorized to make this request.
               *
               * @return bool
               */
              public function authorize()
              {
                  return false;
              }
      
              /**
               * Get the validation rules that apply to the request.
               *
               * @return array
               */
              public function rules()
              {
                  return [
                      //バリデーションルールを記載する
                      //'チェックするデータ名' => 'ルール1|ルール2'の様にルールを定義する
                      'title' => 'required',
                      'detail' => 'required',
                  ];
              }
          }
      
    • エラーを解決したしたフォームリクエストクラスファイルを下記に記載する。

      アプリ名ディレクトリ/app/Http/Requests/StoreContentPost.php
          <?php
      
          namespace App\Http\Requests;
      
          use Illuminate\Foundation\Http\FormRequest;
      
          class StoreContentPost extends FormRequest
          {
              /**
               * Determine if the user is authorized to make this request.
               *
               * @return bool
               */
              public function authorize()
              {
                  return true;
              }
      
              /**
               * Get the validation rules that apply to the request.
               *
               * @return array
               */
              public function rules()
              {
                  return [
                      //バリデーションルールを記載する
                      //'チェックするデータ名' => 'ルール1|ルール2'の様にルールを定義する
                      'title' => 'required',
                      'detail' => 'required',
                  ];
              }
          }
      
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

wordpressの立ち上げ

概要

wordpressのプロジェクトをクローンして立ち上げるまでの備忘録

やり方

①データベースを作成する
②wordpressのプロジェクトのリポジトリをgithubからクローンする
③このURLからhttps://ja.wordpress.org/download/ wordpressインストールする
④クローンしたディレクトリをwordpressのテーマの配下に移動させる
⑤データベースの情報を登録する

1. データベースを作成する

localにデータベースを作成する
https://qiita.com/ibarakishiminn/items/ddfc8018b69246cbcbb8

2. wordpressのプロジェクトのリポジトリをgithubからクローンする

プロジェクトをwordpressのテーマとして設定することで、開発していきたいので、まずはgithubからクローンする。
クローンしたら、そのディレクトリを、後ほどインストールしたwordpressのテーマに持っていく。
作業後wordpressで外観を確認してOKなら、gitで上書きして管理するイメージ。

3. wordpressのインストール

以下のURLからインストール。wordpressは更新が頻繁に行われるので、プロジェクトごとにインストールし直す必要がある。
https://ja.wordpress.org/download/

4. クローンしたディレクトリをwordpressのテーマの配下に移動させる

wordpressのテーマの配下にディレクトリを移動させることで、wordpressでテーマとして選ぶことができるようになる
配置先は/wordpress/wp-content/themes/の下

スクリーンショット 2020-06-03 9.35.10.png

5. wordpressにデータベース情報を登録していく

ターミナルでインストールしたwordpressのディレクトリに移動する。
ここで以下のコマンドを走らせる。

php -S 0.0.0.0:80

起動したらリンクが表示されるのでそれを踏んで以下のような画面に移る。さぁ、始めましょう!をクリック

スクリーンショット 2020-06-02 15.52.32.png

ローカルで作成したデータベースの情報を登録していく。
データベース名・ユーザー名・パスワード・データベースのホスト名を入力する
テーブル接頭辞はデフォルトでOK
送信をクリック

スクリーンショット 2020-06-02 16.09.26.png

データベースの情報が間違っていると以下のようなエラーが返ってくる。

スクリーンショット 2020-06-02 16.09.43.png

データベースの登録が上手くいくと必要な情報を入力する画面に移動する。
サブタイトルからメールアドレスまでを入力する。
この時のユーザー名やパスワードはどこかで保管しておく。
WordPressをインストールをクリック

スクリーンショット 2020-06-02 16.28.53.png

インストールが終わると以下の画面が表示されてインストールに成功する
スクリーンショット 2020-06-02 16.29.27.png

※参考(丁寧な解説あり)
https://www.alpha-mail.jp/support/tool/wp/step_04.htm

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

CakePHP 2.x 画像バリデーション

 今回はCakephp 2.xでの画像のバリデーションについてまとめようと
思います。尚、今回が初の投稿なので適宜アップデートさせていただく事がありますので
ご了承下さい。

やりたい事

1.画像のバリデーション(フォーム、画像アップロード処理の際可能)
2.画像のユニーク化(ファイル名を一意のものにする)

画像バリデーションで出来る事

•フォームでファイル形式を指定する事で意図しないファイル形式を
選択時点で除外する事が出来る。

•ファイルサイズを指定したサイズにする(最大値、最小値の指定)

•画像の拡張子の偽装チェックが出来る(悪意のあるユーザーからのアップロードを防ぐ、
セキュリティ性を高める)

1.画像のバリデーション

まずユーザー情報ページを作るという前提でテーブル構成は以下のようになります。

table
CREATE TABLE `users` (
  `id` int(10) UNSIGNED NOT NULL,
  `username` varchar(50) DEFAULT NULL,
  `image` varchar(50) DEFAULT NULL,
  `comment` varchar(30) DEFAULT NULL,
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

次はモデルに書き加えるバリデーション

User.php
class User extends AppModel {
    public $validate = array(
        //拡張子のチェック
        'image' => array(
            'rule1' => array(
                'rule' => array(
                    'extension', array(
                        'jpg',
                        'jpeg',
                        'gif',
                        'png'
                    )
                ),
                'message' => '画像ではありません',
                //ファイルが空でも可
                'allowEmpty' => true
            ),
            //ファイルサイズの指定
            'rule2' => array(
                'rule' => array(
                    'filesize', '<=', '5000000'
                ),
                'message' => '画像サイズは5MBが上限です',
            )
        ),
    );
}

モデルでMIMEtypeを使ったバリデーションをしてもいいですが、
自分は今回編集フォームとコントローラーでチェックを行う処理
にしました。

編集フォーム

edit.ctp
<?php
echo $this->Form->create('User', array('enctype' => 'multipart/form-data'));
//acceptでMIMEtype指定してあげる事により選択時点で指定外のファイルは選べなくなる、拡張子でも可能(ユーザーに優しい!)
echo $this->Form->input('User.image', array('label' => '画像アップロード', 'accept' => 'image/png, image/jpeg', 'type' => 'file'));
echo $this->Form->input('id', array('type' => 'hidden'));
echo $this->Form->end('編集する');
?>

コントローラー

UsersController.php
public function edit($id = null) {
        if ($user['User']['id'] === $this->Auth->user('id')) {
            if ($this->request->is('submit') || $this->request->is('put')) {
                //uniqid関数でファイル名を一意なものにする
                $uniqid = uniqid(mt_rand(), true);
                $tmp_name = $this->request->data['User']['image']['tmp_name'];
                $image_name = $this->request->data['User']['image']['name'];

                if ($image_name) {
                    $this->request->data['User']['image'] = $image_name;
                   //getimagesize関数で拡張子が変更されていないか判別、サイズも見れる
                    if (!getimagesize($tmp_name)) {
                        $this->Flash->error(__('編集されたファイルです'));
                        return $this->redirect(array('action' => 'view', $id));
                    }
                    //ディレクトリにファイル保存
                    move_uploaded_file($tmp_name, '../webroot/img/' . $uniqid);
                } else {
                    $this->User->save($this->request->data, false, array('comment', 'id'));
                    $this->Flash->success(__('ユーザー情報を編集しました'));
                    return $this->redirect(array('action' => 'view', $id));
                }
                //DBにも同様に保存したいので同様の文字列付与
                $this->request->data['User']['image'] = $uniqid;
                //DB保存
                if ($this->User->save($this->request->data, array('validate' => false))) {
                    $this->Flash->success(__('ユーザー情報を編集しました'));
                    return $this->redirect(array('action' => 'view', $id));
                }

                $this->Flash->error(__('ユーザー情報編集に失敗しました'));
                return $this->redirect(array('action' => 'view', $id));
            } else {
                $this->request->data = $this->User->findById($id);
                unset($this->request->data['User']['password']);
            }
        } else {
            $this->Flash->error(__('投稿者本人のみ編集可能です'));
            return $this->redirect(array('controller' => 'submits', 'action' => 'index', $id));
        }
    }

以上になります!PHPでも画像アップロードでバリデーション行いましたが、CakePHPはMVCの概念があるので勝手が違いますね!この記事ですんなりと理解出来てくれる人が一人でもいてくれたら嬉しいです! It’s a piece of cake!!

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

[TCPDF requires the Imagick or GD extension to handle PNG images with alpha channel. ] が出たとき

  • phpでPDFを生成する機能を動かした際、白画面に表題のエラーが返ってきた。
  • phpinfo() で確認したらGDライブラリが入ってなかったので入れた。
sudo apt-get install php7.3-gd
  • インストール時、選択肢を聞かれたところはデフォルト、紫の画面は current keep 的なものを選択。

  • おまけ
  • phpのバージョン毎にgdがあったので検索してどれを使うか判断する
apt-cache search gd | grep php
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

PHP環境設定

環境の準備

下記サイトから、ウェブサーバーをダウンロードする。
https://bitnami.com/stacks
Mac -> MAMP
Windows -> WAMP

インストール時にMySQLのパスワードを聞かれるが、一旦適当に入力でOK。
インストール完了画面の[Open Application Folder]をクリックする。
[Application Folder] > apache2 > htdocs > ココにindex.phpを配置することで、このファイルを動作させることができる。

PHP設定

これを設定することで、ウェブサーバーに設置した、phpファイルを変更した際に、
即時に変更が反映されることができる。

キャッシュを無効にするには、下記iniファイルを開いて、opcache.enable=0に変更する。
[Application Folder] > php > etc > ini.php

PHP基本

変数とは

  • あらゆるデータを格納できる箱のようなもの
  • データを何度も入れ替えできる
  • 必ず利用前に宣言する必要はない
  • 変数名の大文字小文字は区別される
  • 変数にアクセスできる範囲が決まっている

変数宣言のルール

先頭は$を付ける。
変数名の先頭は、_(アンダースコア)または文字
セミコロンで終了する。
(例)
$hoge;

初期値を入れる場合
$hoge = 'abc';

定数とは

  • 型や配列を格納できる箱のようなもの
  • 中に格納したデータは固定化(入れ替えできない)
  • 利用する前に宣言が必要
  • 定数名はすべて大文字で書く
  • PHPのどこからでもアクセスできる
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む