20220322のPHPに関する記事は9件です。

XserverにLaravelをデプロイできない場合に

はじめに 今回は環境の異なるXserverにLaravelを使ったアプリをデプロイしたいけどエラーが起きる場合に注意する点をまとめました。 gitからクローンしてpublic配下に移動し、シンボリックリンクの設定を済ませた前提で書いていきます。 PHPのバージョンを確認 まずはlaravelアプリのcomposer.jsonファイルを確認して環境を確認しましょう。 "require": { "php": "^8.0.2", "guzzlehttp/guzzle": "^7.2", "laravel/breeze": "^1.8", "laravel/framework": "^9.2", "laravel/sanctum": "^2.14.1", "laravel/tinker": "^2.7", "laravel/ui": "^3.4" } このrequireに記載されているものを満たす必要があります。今回は8.0.2であるので8.0.12を選びましょう。同じバージョンがなくてもそれ以上なら問題なりです。 SSHのPHPバージョンも変更 //まずはバージョンを確認しましょう php -v //結果: PHP5.4.16 (cli) (built: Nov 1 2019 16:04:20) ・・・ //現在利用可能なバージョンを確認しましょう find /opt/php-*/bin -type f -name 'php' //結果: ・・・ /opt/php-7.4.3/bin/php /opt/php-7.4.4/bin/php /opt/php-7.4/bin/php /opt/php-8.0.0/bin/php /opt/php-8.0.1/bin/php /opt/php-8.0.10/bin/php /opt/php-8.0.12/bin/php /opt/php-8.0.6/bin/php /opt/php-8.0.7/bin/php /opt/php-8.0/bin/php このような感じに結果がでるのでその中から先ほどの8.0.2以上を満たす好みのバージョンをメモしてください。 //初心者の方は何も考えずにこのコマンドを打ってください mkdir $HOME/bin //先ほどメモしたバージョンを[php-8.0.7]の部分に入れ込んでコマンドを打ちこんであげてください ln -s /opt/php-8.0.7/bin/php $HOME/bin/php 通常の状態だとこの作業を毎回しなくては好みのバージョンのphpを使用することはできません。 しかし毎回打つのはどう考えても無駄です。そこでbash_profleというものに同じことを毎回するように書き込んでやるのです。 //ファイルを作成 touch bash_profile //vimで編集 vi ~/.bashrc viコマンドを打つと見慣れない画面に飛ばされますが、落ち着いてください。 この画面でキーボードのiを押して編集モードに切り替え export PATH=$HOME/bin:$PATH こちらを入力したらエスケープキー(ESC)を押して、続いて[:w]を入力してエンター、そして[:q!]を入力してエンターを押してもとの画面に戻りましょう。 //終わったら次にこちらのコマンドを打って反映させましょう source ~/.bash_profile //こちらも完了したらこのコマンドで再度バージョンを確認してあげてください php -v //結果がまだ5.4.16なら最初からやり直してください。どこかでタイプミスなどをしているはずです・・・ composer update phpを更新できたらcomposer updateを試しましょう。 composer update ここでエラーがでるようならエラー内容でググってみましょう。基本的にはphpのバージョンエラーなので上記の部分をしっかりしていれば問題なく通ります。 .htaccessファイルを確認 public_html配下に.htaccessファイルとphp.initファイルが存在していると思いますが、デプロイ時にpublicファイル配下にも入ってしまうことがあります。 そちらを二つともpublic_htmlの配下に移動させてあげないとエラーが起きてしまいます。
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

XserverにLaravelをデプロイできない場合に注意する点

はじめに 今回は環境の異なるXserverにLaravelを使ったアプリをデプロイしたいけどエラーが起きる場合に注意する点をまとめました。 gitからクローンしてpublic配下に移動し、シンボリックリンクの設定を済ませた前提で書いていきます。 PHPのバージョンを確認 まずはlaravelアプリのcomposer.jsonファイルを確認して環境を確認しましょう。 "require": { "php": "^8.0.2", "guzzlehttp/guzzle": "^7.2", "laravel/breeze": "^1.8", "laravel/framework": "^9.2", "laravel/sanctum": "^2.14.1", "laravel/tinker": "^2.7", "laravel/ui": "^3.4" } このrequireに記載されているものを満たす必要があります。今回は8.0.2であるので8.0.12を選びましょう。同じバージョンがなくてもそれ以上なら問題なりです。 SSHのPHPバージョンも変更 //まずはバージョンを確認しましょう php -v //結果: PHP5.4.16 (cli) (built: Nov 1 2019 16:04:20) ・・・ //現在利用可能なバージョンを確認しましょう find /opt/php-*/bin -type f -name 'php' //結果: ・・・ /opt/php-7.4.3/bin/php /opt/php-7.4.4/bin/php /opt/php-7.4/bin/php /opt/php-8.0.0/bin/php /opt/php-8.0.1/bin/php /opt/php-8.0.10/bin/php /opt/php-8.0.12/bin/php /opt/php-8.0.6/bin/php /opt/php-8.0.7/bin/php /opt/php-8.0/bin/php このような感じに結果がでるのでその中から先ほどの8.0.2以上を満たす好みのバージョンをメモしてください。 //初心者の方は何も考えずにこのコマンドを打ってください mkdir $HOME/bin //先ほどメモしたバージョンを[php-8.0.7]の部分に入れ込んでコマンドを打ちこんであげてください ln -s /opt/php-8.0.7/bin/php $HOME/bin/php 通常の状態だとこの作業を毎回しなくては好みのバージョンのphpを使用することはできません。 しかし毎回打つのはどう考えても無駄です。そこでbash_profleというものに同じことを毎回するように書き込んでやるのです。 //ファイルを作成 touch bash_profile //vimで編集 vi ~/.bashrc viコマンドを打つと見慣れない画面に飛ばされますが、落ち着いてください。 この画面でキーボードのiを押して編集モードに切り替え export PATH=$HOME/bin:$PATH こちらを入力したらエスケープキー(ESC)を押して、続いて[:w]を入力してエンター、そして[:q!]を入力してエンターを押してもとの画面に戻りましょう。 //終わったら次にこちらのコマンドを打って反映させましょう source ~/.bash_profile //こちらも完了したらこのコマンドで再度バージョンを確認してあげてください php -v //結果がまだ5.4.16なら最初からやり直してください。どこかでタイプミスなどをしているはずです・・・ composer update phpを更新できたらcomposer updateを試しましょう。 composer update ここでエラーがでるようならエラー内容でググってみましょう。基本的にはphpのバージョンエラーなので上記の部分をしっかりしていれば問題なく通ります。 .htaccessファイルを確認 public_html配下に.htaccessファイルとphp.initファイルが存在していると思いますが、デプロイ時にpublicファイル配下にも入ってしまうことがあります。 そちらを二つともpublic_htmlの配下に移動させてあげないとエラーが起きてしまいます。
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

RubyとPHPの比較(文字列と変数)

この記事の概要 Rubyで学習を始めてPHPに言語チェンジをする人が一定数いるみたいなので そういった人達が参考にするための記事です。 簡単な出力 簡単な出力からそれぞれ見ていきます。 ⚫︎Ruby puts "プログラミング" ⚫︎PHP <?php // Your code here! echo "プログラミング"; ?> PHPだと最後に;がつくのが特徴です。 両方ともプログラミングと出力されます。 ⚫︎補足 ""だけでなく''で囲むことも可 コメントの書き方  コメントの書き方がそれぞれ違います。 ⚫︎Ruby #コメント puts "Ruby" Rubyでは#を使います。 ⚫︎PHP <?php // Your code here! //コメント echo "PHP"; //コメント ?> PHPでは//を使います。 文字列と数値の連結 ⚫︎Ruby puts "Ruby"+"の"+ "勉強するぞ" #Rubyの勉強するぞ と出力 puts "1" + "00" #100と出力 puts 100 + 50 #150と出力 ""で囲むと文字列になり+をつけると連結できます。 数値に""を付けない場合は通常通り数値のままで計算されます。 ⚫︎PHP <?php // Your code here! echo "PHP"."の"."勉強をするぞ"; //PHPの勉強をするぞ echo"1"."00"; //100の出力 echo 100 + 50; //150と出力 ?> 文字連結は.を使います。 変数 何かしらの値を入れておくための箱で、 変数があることで読めるプログラムが書けるようになります。 ⚫︎Ruby #数値の計算 a = 100 #イコールで変数に代入できる b = 50 puts a + b #150と出力 #文字の連結 a = "Ruby" b = "楽しい" puts a + b ⚫︎PHP PHPの場合、変数の前には$をつけます。 <?php //数値の計算 $a = 100; $b = 50; echo $a + $b; //150と出力 //文字の連結 $a = "PHP"; $b = "楽しい"; echo $a.$b; //PHP楽しいと出力 ?> 変数の上書き 変数は下のように上書きをすることができます。 変数が同じ場合は下の変数の中身が出力されます。 ⚫︎Ruby programming_study = "Ruby" programming_study = "Rubyを学習するぞ" puts programming_study Rubyを学習するぞが出力されます。 ⚫︎PHP <?php $programming_study = "PHP"; $programming_study = "PHPを学習するぞ"; echo $programming_study; ?> PHPを学習するぞが出力されます。 注意 PHPの場合は変数に$を忘れずに 変数の繰り返し 変数は繰り返し使うことができます。 programming_study = "Ruby" puts programming_study + "を習得するぞ!" puts programming_study + "は楽しい" 出力すると Rubyを習得するぞ! Rubyは楽しい と出力されます。 <?php $programming_study = "PHP"; echo $programming_study ."を学習するぞ"; echo $programming_study ."は楽しい"; ?> と出力すると PHPを学習するぞPHPは楽しい と出力されます。 変数の文字列展開 変数を使い文字列展開することができます。 ⚫︎Ruby 変数の文字列展開をする時には#{変数}を使います。 (変数は自分や他人がわかりやすいもので自由に決められます。) day = 5 program = "Ruby" puts "週に#{day}日#{program}を学習します" 週に5日Rubyを学習しますが出力されます。 ⚫︎PHP PHPの場合は{変数}で文字列展開ができます。 <?php $day = 5; $program = "PHP"; echo "週に{$day}日{$program}を学習します" ?> 週に5日PHPを学習しますが出力されます。 ⚫︎補足 変数は自分や他人がわかりやすいもので自由に決められます。 ⚫︎変数の参考資料 https://qiita.com/Hashimoto-Noriaki/items/d705a3fb92db14de4742 PHPのHTMLへの組み込み PHPのHTMLファイルの組み込み方です。 <p> <?php echo "PHP";?>の学習 </p> PHPの開始タグが<?phpで終了タグが?>です。 <p> PHPの学習 </p> が出力されます。 参考資料 ⚫︎Ruby ⚫︎PHP
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

CodeIgniterのバリデーションルールで他のPOST値を参照する

CodeIgniterのset_rulesは便利ですが、このような形 日付 <input type="number" name="year"> <input type="number" name="month"> <input type="number" name="day"> の入力項目があった場合、set_rulesは基本的に単一のPOST値に対してのバリデーションなので 例えば存在しない日付を入力していないかのチェックは難しいかと思います (配列のnameにすればいけないこともないですが、、) その場合はset_rulesで第二引数を利用して、他のPOST値のnameを橋渡しします。 やり方 第二引数を利用する場合は、ルール名の後に[]を記述し、そこに引数の中身をいれてください 第三引数は設定できませんので、今回はカンマ区切りで疑似的な配列指定をします callback_check_dateはコントローラー内に記述した独自ルール $this->form_validation->set_rules('year', '年', 'required|trim|numeric|callback_check_date[month,day]'); $this->form_validation->set_rules('month', '月', 'required|trim|numeric'); $this->form_validation->set_rules('day', '日', 'required|trim|numeric'); コールバック関数の中身はこちらになります。 set_rulesを記載したコントローラーと同じところに記述 // MNPの有効期限チェック function check_date ( $year, $params ) { // 月と日のnameが入っている @list($month_key, $day_key) = explode(',', $params); // 月の日のデータ @list($month, $day) = [$this->input->post($month_key) ?? '', $this->input->post($day_key) ?? '']; // 空白もしくは入力なしの場合、チェックをスルー if( count( array_filter([$year, $month, $day], function ($val) { return empty($val); }) ) != 0 ) { return true; } // 日付形式が間違っている if(!@checkdate($month, $day, $year)) { $this->set_message('check_date', '日付の形式が間違っています'); return false; } return true; } 第二引数でrurlesで指定したmonthとdayのname名を受け取り POSTの中身を確認。記載されていれば日付チェックを行う形になります。 今回はnameの名前でしたが、変数の値などを引数にいれてチェックなどもできますので callback内でDBを参照して、入力値の何かしらをチェックなども行えそうです。
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

【Laravel】Web開発初心者が1週間で入門チュートリアルを実施した記録(8)

以下の続き。 前回までで、タスクの編集機能をつくった。 入門Laravelチュートリアル (8) ToDoアプリの認証機能を作る 認証機能の実装。 ・会員登録機能 ・ログイン機能 ・ログインしたユーザーは自分のフォルダのタスクだけを閲覧できる機能 ユーザーとフォルダの紐付け。 単純にFoldersテーブルにユーザーIDカラムを追加するだけだと既存データのNot Null制約が邪魔してうまくいかないので、以下コマンドでテーブルを作り直す。 php artisan migrate:fresh このコマンドでは、テーブルを全て削除してマイグレーションを実行し直す。 すると問題なくマイグレーションできる。なお、Usersテーブルは、既存の以下ファイルにて作成済み。 ・2014_10_12_000000_create_users_table.php ユーザーとフォルダは1対多(フォルダとタスクも1対多)の関係なので、ユーザーモデルにhasManyを付与。 public function folders() { return $this->hasMany('App\Folder'); } シーダーを用いたデータの準備と、ホームページを作成後、いよいよ登録機能に入る。 登録機能 ・Laravel には認証機能が最初から搭載されている。 ・認証機能を受け持つコントローラーは app/Http/Controllers/Auth ディレクトリにすでに用意されている。  /app/Http/Controllers/Auth/ConfirmPasswordController.php  /app/Http/Controllers/Auth/ForgotPasswordController.php  /app/Http/Controllers/Auth/LoginController.php  /app/Http/Controllers/Auth/RegisterController.php  /app/Http/Controllers/Auth/ResetPasswordController.php  /app/Http/Controllers/Auth/VerificationController.php ・ルーティングについても認証用の設定を吐き出すメソッドが用意されているので、基本的にはテンプレートを作成するだけでアプリケーションに認証機能を追加することができる。 では、実際に実装していく。 ①ルーティング設定 Auth::routes(); ⑧テンプレートの作成(register) resources/views/auth/register.blade.php メールアドレスとユーザー名、PW、PW(確認用)があるだけのシンプルな画面だが、ポイントは2点。 まず1点目。 <form action="{{ route('register') }}" method="POST"> 上記route関数の向き先って・・・?以下コマンドのName列を参照。 php artisan route:list +--------+----------+------------------------------------+------------------+------------------------------------------------------------------------+--------------------------------------------------+ | Domain | Method | URI | Name | Action | Middleware | +--------+----------+------------------------------------+------------------+------------------------------------------------------------------------+--------------------------------------------------+ | | POST | register | | App\Http\Controllers\Auth\RegisterController@register | web | | | | | | | App\Http\Middleware\RedirectIfAuthenticated | | | GET|HEAD | register | register | App\Http\Controllers\Auth\RegisterController@showRegistrationForm | web | | | | | | | App\Http\Middleware\RedirectIfAuthenticated | +--------+----------+------------------------------------+------------------+------------------------------------------------------------------------+--------------------------------------------------+ 以下のメソッドを見にいく。 RegisterController@showRegistrationForm 続いて2点目。 パスワード一致確認の書き方について。 Laravel には confirmed ルールというバリデーションルールが実装されている。このルールはある項目(仮に abc とします)とその項目名 + _confirmation という名前の項目(abc_confirmation)の入力値が一致することを検証する。 <input type="password" class="form-control" id="password-confirm" name="password_confirmation"> name="password_confirmation"とすることで、name="password"の項目と入力値が一致するか確認する。 テンプレートの記載が完了したところで、コントローラーの記述を見ていく。 さきほどもでてきたApp\Http\Controllers\Auth\RegisterControllerについて、登録完了後のリダイレクト先を以下のように修正。 protected $redirectTo = '/'; このままでも登録処理自体は問題なくできる。このようにLaravelの認証機能はそのままでも十分使える上に、カスタマイズもしやすい。 続いて、コントローラーのvalidatorメソッドに設定内容を書き込んでいく。 これまでバリデーションはFormRequestクラスを使って実装していたが、このようにコントローラーに記載しても実現可能。 protected function validator(array $data) { return Validator::make($data, [ 'name' => 'required|string|max:255', 'email' => 'required|string|email|max:255|unique:users', 'password' => 'required|string|min:6|confirmed', ], [], [ 'name' => 'ユーザー名', 'email' => 'メールアドレス', 'password' => 'パスワード', ]); } makeメソッドの第一引数は検証するデータ、第二引数がルール定義、第三引数がメッセージ定義、第四引数が項目名定義。第3引数のメッセージ定義は、validation.php で定義するので空の配列を渡し、第四引数で日本語の項目名を定義。 validation.phpは以下の通り編集。 'confirmed' => ':attribute が確認欄と一致していません。', 'email' => ':attribute には有効な形式のメールアドレスを入力してください。', 'min' => [ // 略 'string' => ':attribute は:min文字以上で入力してください。', // 略 ], 'string' => ':attribute には文字を入力してください。', 'unique' => '入力いただいた :attribute はすでに使用されています。', ログイン機能 ルーティング設定は登録機能と同じものでOKなので、テンプレートの修正をおこなっていく。 ⑧テンプレートの修正 resources/views/auth/login.blade.phpを修正していく。 メールアドレスとPWをいれて送信するだけの画面。パスワード変更はLaravelの機能で対応可能。 password.requestはApp\Http\Controllers\Auth\ForgotPasswordController@showLinkRequestFormをみている。 会員登録のときと同じように、ログインに成功したあとの遷移先を指定するため、app/Http/Controllers/Auth/LoginController.php を編集。 ログインメッセージはauth.phpで定義されているので、jpの下にコピーしてきて編集。 これでログイン機能の実装も完了!
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

日付を取得する方法

・日付を取得する方法 コード <?php date_default_timezone_set('Asia/Tokyo'); for ($i = 0; $i < 366; $i++) { $time = strtotime('+' . $i . ' day'); $day = date('n/j(D)', $time); echo $day . '<br>'; } strtotime('+' . $i . ' day') 文字列を$i日後の時間に変換 $day = date('n/j(D)', $time) 月/日(曜日)の形で$timeの日付を$dayに代入
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

現在時刻を表示する方法

・現在時刻を表示する方法 ①構造化プログラミング コード date_default_timezone_set('Asia/TOKYO'); echo '現在の時刻は、' . date('G時 i時 s秒') . 'です'; 現在時刻を取得するにはdate()を使う。 date_default_timezone_set('Asia/TOKYO')で日本時間を取得するように設定している。 echoで表示するようにして初めて表示される。(date()は時間を返すだけ) ②オブジェクト指向 コード $today = new DateTime(); $today->setTimezone(new DateTimeZone('Asia/Tokyo')); echo '現在の時刻は、' . $today->format('G時 i分 s秒'); 日本時間の設定方法が異なる。
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

「'」や「"」をechoで表示したいとき

・「'」や「"」をechoで表示したいとき 「I'm from Japan.」と表示したいとき、 echo 'I'm from Japan.'; では、シングルクォーテーション(')とアポストロフィー(')が同じ記号であるためエラーとなる。 これを解決する方法を載せておく。 ①文字列をダブルクォーテーション(")で囲む echo "I'm from Japan."; ②エスケープシーケンスを使う echo 'I\'m from Japan.';
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

PHPのreadfile()でファイルサイズが大きいzipファイルをダウンロードできなかったためfopen()-fread()にした話

PHPのreadfile()でファイルサイズが大きいzipファイルをダウンロードできなかったためfopen()-fread()にした話 #修正前 readfile($zip_name); #修正後 $handle = fopen($zip_name, 'rb'); while (!feof($handle)){ echo fread($handle, 4096); ob_flush(); flush(); } fclose($handle);
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む