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

データベースからデータを取り出す PHP/MYSQL

■はじめに PHPでデータベースと接続しておく 以前に記事を書いたのでそちらを参照ください。 https://qiita.com/pito555/items/77d2f141846a40d8c659 ■①SQL文の準備 $sqlとしてSQL文を入れる変数を用意 ●下記SQL文の意味 左から読むとわかりやすい! テーブル名 FROM(から) *(全部) SELECT(選択) $sql = 'SELECT * FROM テーブル名'; ■②SQLの実行 $SQL文を実行するために記述します。 ▼ $dbh 以前データベースに接続するために書いたPDOを格納しているもの ▼ query 問い合わせる ▼ $sql 実行するSQL文 ▼ $stmt PDOStatementとして実行される。 $stmt = $dbh->query($sql); ■③SQLの結果を受け取る。 ▼fetchAll 全ての行を返す。 フェッチモードを使いデータの結果を受け取る。 PDOでデータベースからデータを取り出した時に配列の形式を指定するモード 今回はベーシックなPDO::FETCH_ASSOCを使用します。 ▼fetchAllの引数としてフェッチモードを使う。 PDO::FETCH_ASSOCはカラム名の配列を返す。 詳しくは下記URLを参照してみてください。 https://blog.senseshare.jp/fetch-mode.html $result = $stmt->fetchAll(PDO::FETCH_ASSOC) ■HTMLの中でPHPを使いデータを表示する。 ▼foreachで配列の中身を取り出す。 //ポイントforeachの最後に:で閉じる。;ではエラーになる。 <table> <?php foreach($result as $column):?> <tr> <td><?php echo $column['カラム名']?></td> <td><?php echo $column['カラム名']?></td> <td><?php echo $column['カラム名']?></td> <tr> //最後にforeachを終わらせる。 <?php endforeach; ?> </table>
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

In PackageManifest.php line 122: Undefined index: nameでなんか詰まった話

composer2にしたら起きている問題らしい とりあえずやったことをメモメモ なんかkey:generateしたらこれが出た In PackageManifest.php line 122: Undefined index: name composerのバージョンが1 から 2にしたときに起きたみたい。 合わせいないといけないものだったため、composerを1にする方法で解決した。 バージョン確認して composer --version とりあえず 下げてみる 下げるコマンド composer self-update --1 ちなみに2にする場合はコマンドの1を2にすればいい 以上!!!!
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

PHP 基本文法学んでみた

PHP基本文法 僕はRubyをやっていたのでPHPの基本文法はだいぶハードルが低かったです。 早速やっていきましょう!! PHPとはスクリプト言語でありシンプルな記述だけど大規模アプリケーションの開発ができる。 フレームワークの例として、Laravel(ララベル)、CakePHP(ケイクピーエイチピー)、Zend(ゼンド)などがある。 プログラムの基本構造は3つ!! 1.順次進行  上から順に処理 2.条件分岐  if文などでほにゃららの場合これこれの処理を行う..など 3.繰り返し for文などで◯回繰り返しす処理だど ・・・Rubyとかと考え方はおんなじだね~~やったぜ? <?php」で始まり「?>」で終わる 終わりの「?>」は省略可能! 「\n」は改行という意味。 Echoで文字列や変数の中身を参照!! 処理の終わりのセミコロンのは注意ですな^^ Rubyはいらないからね こういう記述の仕方は何回かやってけば覚えるもんだから大丈夫かな php Greeting.php ←このコマンドで実行!! 変数 変数は、例えるなら、「箱」。 変数があることで、文字や数字などのデータを変数に入れておける。 また、変数は、必要な時に取り出すことができます。 変数にデータを入れることを「代入」といい、取り出すことを「参照」。 変数には名前をつけることができ、変数名という。 変数を作ることを「変数を宣言する」という。 これもRubyでやったからOK? ただドルマークで始まるってことは注意!  データ型 gettype()でデータ型を確認できる。 PHPのプール型がちょいと特殊 RubyであればTrueかFalseどちらか1つを持つ型だけど、 Trueのときは「1」が代入され、Falseのときは何も代入されない。  配列 箱に複数のデータを格納できるデータ型。 インデックスという番号が振り分けれている。 これもRubyでやったからOK? 書き方1 変数 =array(要素数); ←( )に直でデータを書くこともできる。 書き方2 変数=[ データ ];  条件分岐 if (条件A) { 条件Aを満たした場合の処理 } else if(条件B) { 条件Bを満たした場合の処理 } else{ 条件を満たさなかった場合の処理
}   繰り返し処理 For文 continueでスキップ Breakで処理の終了 for(スタート値; 繰り返しの回数;インクリメント;){処理内容}  関数 処理のこと。関数を宣言するメリットは3つ。 1.同じものを2回書く必要がなくなること。 2.同じものを他の場面でも使えること。 3.他の人も使うことができること。 function 関数名( ) { 実行する処理 } ←JSと一緒の書き方だからOK? クラス クラス=データと処理をまとめたもの。 インスタンス=実体 クラスが車の設計図だとしたら、インスタンスはベンツやプリウスなど車本体。 プロパティ=クラス内のデータのこと メソッド=クラス内の処理のこと プロパティにはアクセス修飾子をつける必要があります。 public=どこからでもアクセス可能です。 protected=クラス自身、継承したクラス、親クラスからのみアクセスできます。 private=同じクラスの中でのみアクセス可能です。  
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

Laravel-Excelで大容量のエクセルファイルをエクスポートする際の対策

背景 Laravelには特定のモデルのレコードをエクセル形式で読み書きしてくれるLaravel-Excelというライブラリが存在する。 しかし多くのレコードをエクスポートすると処理時間が長引き、クレームやユーザーの離脱等が発生すると考えられる。 その際の対策をサンプルコードも含めてメモ。 大容量ファイルのエクスポート 方針 処理をLaravelのQueueに入れる エクスポート処理 エクスポートが終わったらエクセルファイルをS3にアップロード ユーザーにダウンロードリンクをメール通知 実装 ※本記事ではLaravel-Excelのインストール方法は対象外とします。 以下のartisanコマンドを実行 php artisan make:export UsersExport --model=User 下記のようなファイルが生成される。 backend/app/Exports/UsersExport.php <?php namespace App\Exports; use App\Models\User; use Illuminate\Support\Collection; use Maatwebsite\Excel\Concerns\FromCollection; class UsersExport implements FromCollection { /** * @return Collection */ public function collection(): Collection { return User::all(); } } S3にアップロードするためのライブラリを追加 composer require --with-all-dependencies league/flysystem-aws-s3-v3 "^1.0" 以下のartisanコマンドを実行し、DBにキューを管理するテーブルを追加 php artisan queue:table php artisan migrate キューに入れるジョブを定義 php artisan make:job NotifyUserOfCompletedExport エクスポート完了時に送信する通知(Notification)を定義 php artisan make:notification ExportCompleted 通知が送信されるようにジョブを編集する。 app/Jobs/NotifyUserOfCompletedExport.php <?php declare(strict_types=1); namespace App\Jobs; use App\Models\User; use App\Notifications\ExportCompleted; use Illuminate\Bus\Queueable; use Illuminate\Contracts\Queue\ShouldQueue; use Illuminate\Foundation\Bus\Dispatchable; use Illuminate\Queue\InteractsWithQueue; use Illuminate\Queue\SerializesModels; /** * Class NotifyUserOfCompletedExport * @package App\Jobs */ class NotifyUserOfCompletedExport implements ShouldQueue { use Dispatchable, InteractsWithQueue, Queueable, SerializesModels; /** * @var User */ private User $user; /** * @var string */ private string $fileName; /** * Create a new job instance. * * @param User $user * @param string $fileName */ public function __construct(User $user, string $fileName) { $this->user = $user; $this->fileName = $fileName; } /** * Execute the job. * * @return void */ public function handle() { $this->user->notify(new ExportCompleted($this->fileName)); } } 通知にS3のリンクを含めるように修正する。 app/Notifications/ExportCompleted.php <?php declare(strict_types=1); namespace App\Notifications; use App\Http\Controllers\UserController; use Illuminate\Bus\Queueable; use Illuminate\Notifications\Messages\MailMessage; use Illuminate\Notifications\Notification; use Illuminate\Support\Facades\Storage; /** * Class ExportCompleted * @package App\Notifications */ class ExportCompleted extends Notification { use Queueable; /** * @var string */ private string $fileName; /** * Create a new notification instance. * * @param string $fileName * @return void */ public function __construct(string $fileName) { $this->fileName = $fileName; } /** * Get the notification's delivery channels. * * @param mixed $notifiable * @return array */ public function via($notifiable): array { return ['mail']; } /** * Get the mail representation of the notification. * * @param mixed $notifiable * @return MailMessage */ public function toMail($notifiable): MailMessage { $s3 = Storage::disk('s3'); return (new MailMessage) ->line('Export has been completed.') ->line('Please click link to download a exported file.') ->action('Download ' . $this->fileName, $s3->url($this->fileName)); } /** * Get the array representation of the notification. * * @param mixed $notifiable * @return array */ public function toArray($notifiable): array { return [ // ]; } } Controllerクラスで定義したジョブを呼び出す。 ※通常はサービス層などをで処理を分離すべきかと思われます。 UserController.php public function queue(): View|RedirectResponse { try { DB::beginTransaction(); Excel::queue(new UsersExport, 'users.xlsx', 's3')->chain([ new NotifyUserOfCompletedExport( request()->user() ?? User::factory()->create(), 'users.xlsx' ) ]); DB::commit(); } catch (Throwable $e) { DB::rollBack(); logger()->error($e); return redirect(route('users.excel.export.download-form')) ->withErrors($e->getMessage()); } $message = 'Successfully queued an export job'; return \view('index', compact('message')); } 動作確認 mailtrapに登録し、.envに必要な情報を入力する。 .env MAIL_MAILER=smtp MAIL_HOST=smtp.mailtrap.io MAIL_PORT=2525 MAIL_USERNAME=******** MAIL_PASSWORD=******** MAIL_ENCRYPTION=tls MAIL_FROM_ADDRESS=test@test.com MAIL_FROM_NAME="${APP_NAME}" S3のバケットにアップロードするためAWSのクレデンシャル等を.envに追加 .env AWS_ACCESS_KEY_ID=******** AWS_SECRET_ACCESS_KEY=******** AWS_DEFAULT_REGION=******** AWS_BUCKET=******** AWS_USE_PATH_STYLE_ENDPOINT=false 適当なBladeファイルを定義しキューエクスポート用のリンクを追加 index.blade.php @extends('layouts.app') @section('content') <section> <h1>Laravel/Excel Sample app</h1> <div> <a href="{{route('users.excel.queue')}}">Add a job of export user models in queue</a> </div> </section> @endsection localhost/users/excelにアクセスし「Add a job of export user models in queue」リンクをクリック 画面上部に成功メッセージが表示されることを確認。 mailtrapでファイルダウンロードリンク付きのメールが送信されることを確認する。 ※ファイルダウンロードのためにはバケットの公開範囲を設定してください 結言 下記のようにQueueを使う際にファイルストレージが指定できることは公式ドキュメントから読み取れないので注意 Excel::queue(new UsersExport, 'users.xlsx', 's3'); 謝辞 実装方針共有いただいた先輩ARIGATOH 補足 ※記事へのご指摘歓迎します。
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

基礎②〜if文、else、else if文〜 php

はじめに If文、for文は基礎的なものだが理解するまでに時間がかかったので今回もまとめてみることにした。具体的な構文は言語によって異なるが、今回はPHPでまとめていきたいと思う。 内容 if文について Ifとは日本語で「もし〜であれば/ならば」という意味で使われる。 それと同様にプログラミングの世界でも「もし〜ならば」実行するといった、 特定の処理の場合に使われる。 例1: $a = 100; if($a > 50){ //ここで条件を指定する。 echo "$aは50より大きい"; //処理の実行 } 結果: $aは50より大きい 100という数字は50より大きいので「$aは50より大きい」という結果になった。 それでは条件が成り立たなかった場合を見てみる 例2: $a = 100; if($a > 150){ echo "$aは150より大きい"; } 結果: (条件が成り立たないため処理が実行されず何も表示れない) else、else if文 else・・・if文以外の条件以外だった場合 例:  $a = 10; if( $a == 20) { echo "$aは20です。 "; }else{ echo "$aは20ではないです。"; } 結果: $aは20ではないです。 上記の例の説明をすると、 まず$aの値を決めます。 if内で$aの値に条件をつけ、ここでは$aの変数の「中身は20だよ」結果を定義してます。 その次にelseが登場し、「$aの変数の中身は20ではない(それ以外という認識が正しいかも?)」と結果を定義してあげます。 そして結果は最初に$aの値は「10」と設定していたので、$aの中身は20ではないという結果が正しいことになります。 eseif・・・ifの条件とは別の条件で一致させる場合 例: $a = 10; if( $a > 20) { echo "$aは20よりも大きいです "; }else if( $a >= 10){ echo "$aは20以下で10以上です"; }else{ echo "$aは10より小さいです。"; } 結果: $aは20以下で10以上です 上記の例を説明すると、 if内で$aの値は「$aは20よりも大きいです 」という条件をつけ、そうだった場合「中身は20だよ」という結果を定義してます。 その次にelse ifが登場し、「$aは20以下で10以上です」という条件をつけ、正しかった場合は「$aは20以下で10以上です」という結果を定義してます。 最後にelseです。これは上記のifにもelse ifにもどの条件にも当てはまらなかった場合を指します。 そして結果は$aの値は最初に「10」と定義しているため、「$aは20以下で10以上です」という結果になります。 まとめ If文はシンプルにその条件に当てはまるか当てはまらないかという白黒つけたいシンプルのもので elseというのはそれ以外の場合という条件の付け足し。 else if はさらに条件を付け足したい場合のもに使用される。このif文は多くの場面で使用されるためしっかり覚えていきたいと思いました。
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

29_新規プロジェクトの作成や初期設定について

概要 新規プロジェクトを作成するときのコマンドと手順をおさらいしましょう。 新規プロジェクトの作成 2通りのコマンドがあります。 ※ここではプロジェクト名をsrcとしています。 バーションを指定せずに作成 laravel new src バージョンを指定して作成 composer create-project --prefer-dist laravel/laravel src "6.*" 初期設定 タイムゾーンの変更 config/app.php 'timezone' => 'UTC', // UTCをAsia/Tokyoに変更 'timezone' => 'Asia/Tokyo', 言語の変更 localとfallback_localの2箇所で設定がありますが、falllback_localは該当言語が見つからない場合の言語なので、enのままにしておきます。 また、resources\langにjaの設定が保存されているフォルダとja.jsonファイルが必要になります。 ja.jsonが他言語記述の略になるため、使用しない場合は不要です。 GitHubのLaravel-lang/langにソースがあります。 config/app.php 'local' => 'en', // enをにja変更 'local' => 'ja', 遷移先の変更 デフォルトの設定で書きますが、ここはコントローラーからの変更なので使い方次第にはなります。 新規登録後の遷移先 RegisterController.phpから編集します。 RegisterController.php protected $redirectTo = '/home'; ログイン後の遷移先 loginController.phpから編集します。 loginController.php protected $redirectTo = '/home'; データベースの設定 初期設定がMysqlなので、Mysqlを使用する場合は.envファイルを変更するだけです。 以下の部分に該当する変更箇所を書き換えればOKです。 DB_CONNECTION=mysql DB_HOST=127.0.0.1 DB_PORT=3306 DB_DATABASE=laravel DB_USERNAME=root DB_PASSWORD= 動作についてはmigrateコマンドでテーブルが作成されたかで確認します。 php artisan migrate フロントエンドパッケージとauth機能 bootstrap, vue.js, reactがインストールできます。 パッケージをまとめてインストールする場合 bootstrapとvue.jsをまとめてインストールできる。 この時、バージョンの指定がないとエラーになる。 laravel6.xはlaravel/ulの1.xが対応しているらしい。 composer require laravel/ul "1.*" 個別にインストールする場合 個別にインストールする場合は、引数に--authを指定することで、ログイン/ユーザー登録スカフォールド(auth関連ファイル)を生成します。 // ファイルを生成 php artisan ui bootstrap php artisan ui vue php artisan ui react auth関連のファイルを生成 インストールしたフロントエンドパッケージに合わせて生成します。 laravel/uiでインストールした場合はvueだけでOKです。 php artisan ui bootstrap --auth php artisan ui vue --auth php artisan ui react --auth npmのインストールと実行 フロントエンド開発に必須な依存パッケージです。 Nodeのダウンロードとインストールが必要です。 npm install && npm run dev 補足 npm run dev // 開発用にビルド npm run watch // 常時ビルド npm run prod // 本番用にビルド
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

連想配列からキーと値を指定して抽出する

データベースからレコードを取得した際、大体は以下のような二次元の連想配列である。 この時、あるキーにおいて指定の値を持つものを抽出したいことがある。 元データ $array = [ 0 => ['id' => 1, 'blood' => 'A', 'name' => 'yamada'], 1 => ['id' => 2, 'blood' => 'B', 'name' => 'tanaka'], 2 => ['id' => 3, 'blood' => 'O', 'name' => 'satake'], 3 => ['id' => 4, 'blood' => 'B', 'name' => 'murata'], 4 => ['id' => 5, 'blood' => 'B', 'name' => 'takeda'] ]; 例えば、キー blood の値が B のものを抽出する場合は以下。1 $new_array = array_filter($array, fn($a) => $a['blood'] === 'B'); print_r($new_array); 結果 Array ( [0] => Array ( [id] => 2 [blood] => B [name] => tanaka ) [1] => Array ( [id] => 4 [blood] => B [name] => murata ) [2] => Array ( [id] => 5 [blood] => B [name] => takeda ) ) コメントにて、より簡潔な記述を教えていただきましたので修正しました。 ↩
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む