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

AWSを利用した、LEMP構成によるWordpressサイトの構築 〜Wordpressサイト構築編〜

作業手順 項目表 No タイトル 1 SSL証明書取得編 2 WEBサーバー構築編 3 ★Wordpressサイト構築編(今ここ) 4 Wordpressテーマ導入編 5 エラー対応編 はじめに LEMP構成のWordpressサイトを作成します。 PHPインストール PHP $ amazon-linux-extras install php7.4 -y #インストール $ php -v #インストール確認 PHP 7.4.19 (cli) (built: May 13 2021 22:36:40) ( NTS ) Copyright (c) The PHP Group Zend Engine v3.4.0, Copyright (c) Zend Technologies $ systemctl start php-fpm #起動 $ systemctl enable php-fpm #自動起動設定 MariaDBのバージョンアップ Amazonlinux2には、デフォルトでMariaDBのバージョン5.5がインストールされていますが、10.5にバージョンアップさせます。 MariaDB $ sudo vi /etc/yum.repos.d/MariaDB.repo #5.5から10.5に変更 [mariadb] name = MariaDB baseurl = http://yum.mariadb.org/10.5/centos7-amd64 gpgkey=https://yum.mariadb.org/RPM-GPG-KEY-MariaDB gpgcheck=1 $ yum install MariaDB-server MariaDB-client -y #インストール $ mysql -V #確認 mysql Ver 15.1 Distrib 10.5.10-MariaDB, for Linux (x86_64) using readline 5.1 $ systemctl start mariadb.service #起動 $ systemctl enable mariadb.service #自動起動設定 Nginx設定 Nginx $ cp -p /etc/php-fpm.d/www.conf /etc/php-fpm.d/www.conf.org #www.confのバックアップ $ vi /etc/php-fpm.d/www.conf #以下設定を変更 user = nginx group = nginx pm.max_children = 10 pm.start_servers = 2 pm.min_spare_servers = 2 pm.max_spare_servers = 5 $ chown -R nginx:nginx /var/lib/php/session #権限をnginxに変更 $ cp /etc/nginx/nginx.conf /etc/nginx/nginx.conf.org #nginx.confのバックアップ $ mkdir -p /var/www/html #/var/www/htmlフォルダの作成 $ chown -R nginx:nginx /var/www/html #htmlディレクトリの権限をnginxに変更 $ vi /etc/nginx/nginx.conf #以下設定を変更 server { client_max_body_size 20M; listen 80 default_server; listen [::]:80 default_server; server_name _; root /var/www/html; # Load configuration files for the default server block. include /etc/nginx/default.d/*.conf; location ~ \.php$ { root cat ; fastcgi_pass unix:/run/php-fpm/www.sock; fastcgi_index index.php; fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; include fastcgi_params; } $ nginx -t #nginx設定の構文チェック エラーがでなければOK nginx: the configuration file /etc/nginx/nginx.conf syntax is ok nginx: configuration file /etc/nginx/nginx.conf test is successful $ systemctl restart nginx.service #再起動 PHP設定 PHP $ vi /etc/php.ini #以下設定を変更 date.timezone = “Asia/Tokyo” expose_php = Off upload_max_filesize = 8M post_max_size = 16M memory_limit = 512M mbstring.language = Japanese mbstring.detect_order = auto mbstring.encoding_translation = Off mbstring.detect_order = UTF-8,SJIS,EUC-JP,JIS,ASCII $ systemctl restart php-fpm #再起動 $ netstat -al --protocol=unix |egrep "Proto|fpm" #nginxとphp-fpmのUNIXドメインソケット接続確認 Proto RefCnt Flags Type State I-Node Path unix 2 [ ACC ] STREAM LISTENING 61433 /run/php-fpm/www.sock $ echo '<?php phpinfo(); ?>' | sudo tee /var/www/html/phpinfo.php #PHPの設定内容の表示確認 ブラウザからhttp://パブリックIP/phpinfo.phpもしくはhttp://パブリック IPv4 DNS/phpinfo.phpにアクセスし、PHPの設定内容が表示されることを確認する。 MariaDB設定 MariaDB $ mysql -uroot -p MariaDB [(none)]> create database test_db; #データベース作成 Query OK, 1 row affected (0.000 sec) MariaDB [(none)]> create user 'test-user'@'localhost' identified by 'test-password'; #ユーザー作成とPW設定 Query OK, 0 rows affected (0.002 sec) MariaDB [(none)]> grant all on test_db.* to 'test-user'@'localhost'; #データベースに対してユーザー権限を付与 Query OK, 0 rows affected (0.002 sec) MariaDB [(none)]> exit #終了 $ systemctl restart mariadb.service #再起動 $ mysql_secure_installation #mariaDBのセキュリティ保護 Switch to unix_socket authentication [Y/n] y # unix_socket認証に切替え Enabled successfully! Reloading privilege tables.. ... Success! Change the root password? [Y/n] y # ルートパスワードへ変更 New password: Re-enter new password: Password updated successfully! Reloading privilege tables.. ... Success! Remove anonymous users? [Y/n] y #匿名のユーザーアカウントを削除 ... Success! Disallow root login remotely? [Y/n] y #リモートでのルートログインを無効 ... Success! Remove test database and access to it? [Y/n] y #テストデータベースを削除 - Dropping test database... ... Success! - Removing privileges on test database... ... Success! Reload privilege tables now? [Y/n] y #権限テーブルを再ロード、変更を保存 ... Success! Cleaning up... All done! If you've completed all of the above steps, your MariaDB installation should now be secure. Thanks for using MariaDB! $ systemctl restart mariadb.service #再起動 Wordpressのインストール&設定 Wordpress $ cd /var/www/html
 #htmlディレクトリへ移動 $ wget https://ja.wordpress.org/latest-ja.tar.gz
 #Wordpressパッケージのダウンロード $ tar xzvf latest-ja.tar.gz #解凍 $ cd wordpress
 #wordpressディレクトリへ移動 $ cp wp-config-sample.php wp-config.php #sampleの雛形からwp-config.phpを作成 
$ vi wp-config.php #以下設定を変更 /** WordPress のためのデータベース名 */ define( 'DB_NAME', 'test_db’ ); /** MySQL データベースのユーザー名 */ define( 'DB_USER', ‘test-user’ ); /** MySQL データベースのパスワード */ define( 'DB_PASSWORD', ‘test-password’ ); /** Absolute path to the WordPress directory. */ if ( ! defined( 'ABSPATH' ) ) { define( 'ABSPATH', __DIR__ . '/' ); } if (empty($_SERVER['HTTPS'])) { $_SERVER['HTTPS'] = 'on'; $_ENV['HTTPS'] = 'on'; } /** Sets up WordPress vars and included files. */ require_once ABSPATH . 'wp-settings.php'; $ mv * /var/www/html
 #htmlディレクトリの移動 $ cd /var/www/html/ #htmlディレクトリへ移動 $ rm -r wordpress/ #wordpressフォルダの削除 https://[ドメイン名]でアクセスすると下記のインストール画面が表示されます。 項目入力し、インストール後に成功!の画面が表示されれば完了です。
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

EC2にLEMP構成のWordpressサイトを作成してみた

はじめに 前回作成記事をもとにLEMP構成のWordpressサイトを作成します。 PHPインストール PHP $ amazon-linux-extras install php7.4 -y #インストール $ php -v #インストール確認 PHP 7.4.19 (cli) (built: May 13 2021 22:36:40) ( NTS ) Copyright (c) The PHP Group Zend Engine v3.4.0, Copyright (c) Zend Technologies $ systemctl start php-fpm #起動 $ systemctl enable php-fpm #自動起動設定 MariaDBのバージョンアップ Amazonlinux2には、デフォルトでMariaDBのバージョン5.5がインストールされていますが、10.5にバージョンアップさせます。 MariaDB $ sudo vi /etc/yum.repos.d/MariaDB.repo #5.5から10.5に変更 [mariadb] name = MariaDB baseurl = http://yum.mariadb.org/10.5/centos7-amd64 gpgkey=https://yum.mariadb.org/RPM-GPG-KEY-MariaDB gpgcheck=1 $ yum install MariaDB-server MariaDB-client -y #インストール $ mysql -V #確認 mysql Ver 15.1 Distrib 10.5.10-MariaDB, for Linux (x86_64) using readline 5.1 $ systemctl start mariadb.service #起動 $ systemctl enable mariadb.service #自動起動設定 Nginx設定 Nginx $ cp -p /etc/php-fpm.d/www.conf /etc/php-fpm.d/www.conf.org #www.confのバックアップ $ vi /etc/php-fpm.d/www.conf #以下設定を変更 user = nginx group = nginx pm.max_children = 10 pm.start_servers = 2 pm.min_spare_servers = 2 pm.max_spare_servers = 5 $ chown -R nginx:nginx /var/lib/php/session #権限をnginxに変更 $ cp /etc/nginx/nginx.conf /etc/nginx/nginx.conf.org #nginx.confのバックアップ $ mkdir -p /var/www/html #/var/www/htmlフォルダの作成 $ chown -R nginx:nginx /var/www/html #htmlディレクトリの権限をnginxに変更 $ vi /etc/nginx/nginx.conf #以下設定を変更 server { client_max_body_size 20M; listen 80 default_server; listen [::]:80 default_server; server_name _; root /var/www/html; # Load configuration files for the default server block. include /etc/nginx/default.d/*.conf; location ~ \.php$ { root cat ; fastcgi_pass unix:/run/php-fpm/www.sock; fastcgi_index index.php; fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; include fastcgi_params; } $ nginx -t #nginx設定の構文チェック エラーがでなければOK nginx: the configuration file /etc/nginx/nginx.conf syntax is ok nginx: configuration file /etc/nginx/nginx.conf test is successful $ systemctl restart nginx.service #再起動 PHP設定 PHP $ vi /etc/php.ini #以下設定を変更 date.timezone = “Asia/Tokyo” expose_php = Off upload_max_filesize = 8M post_max_size = 16M memory_limit = 512M mbstring.language = Japanese mbstring.detect_order = auto mbstring.encoding_translation = Off mbstring.detect_order = UTF-8,SJIS,EUC-JP,JIS,ASCII $ systemctl restart php-fpm #再起動 $ netstat -al --protocol=unix |egrep "Proto|fpm" #nginxとphp-fpmのUNIXドメインソケット接続確認 Proto RefCnt Flags Type State I-Node Path unix 2 [ ACC ] STREAM LISTENING 61433 /run/php-fpm/www.sock $ echo '<?php phpinfo(); ?>' | sudo tee /var/www/html/phpinfo.php #PHPの設定内容の表示確認 ブラウザからhttp://パブリックIP/phpinfo.phpもしくはhttp://パブリック IPv4 DNS/phpinfo.phpにアクセスし、PHPの設定内容が表示されることを確認する。 MariaDB設定 MariaDB $ mysql -uroot -p MariaDB [(none)]> create database test_db; #データベース作成 Query OK, 1 row affected (0.000 sec) MariaDB [(none)]> create user 'test-user'@'localhost' identified by 'test-password'; #ユーザー作成とPW設定 Query OK, 0 rows affected (0.002 sec) MariaDB [(none)]> grant all on test_db.* to 'test-user'@'localhost'; #データベースに対してユーザー権限を付与 Query OK, 0 rows affected (0.002 sec) MariaDB [(none)]> exit #終了 $ systemctl restart mariadb.service #再起動 $ mysql_secure_installation #mariaDBのセキュリティ保護 Switch to unix_socket authentication [Y/n] y # unix_socket認証に切替え Enabled successfully! Reloading privilege tables.. ... Success! Change the root password? [Y/n] y # ルートパスワードへ変更 New password: Re-enter new password: Password updated successfully! Reloading privilege tables.. ... Success! Remove anonymous users? [Y/n] y #匿名のユーザーアカウントを削除 ... Success! Disallow root login remotely? [Y/n] y #リモートでのルートログインを無効 ... Success! Remove test database and access to it? [Y/n] y #テストデータベースを削除 - Dropping test database... ... Success! - Removing privileges on test database... ... Success! Reload privilege tables now? [Y/n] y #権限テーブルを再ロード、変更を保存 ... Success! Cleaning up... All done! If you've completed all of the above steps, your MariaDB installation should now be secure. Thanks for using MariaDB! $ systemctl restart mariadb.service #再起動 Wordpressのインストール&設定 Wordpress $ cd /var/www/html
 #htmlディレクトリへ移動 $ wget https://ja.wordpress.org/latest-ja.tar.gz
 #Wordpressパッケージのダウンロード $ tar xzvf latest-ja.tar.gz #解凍 $ cd wordpress
 #wordpressディレクトリへ移動 $ cp wp-config-sample.php wp-config.php #sampleの雛形からwp-config.phpを作成 
$ vi wp-config.php #以下設定を変更 /** WordPress のためのデータベース名 */ define( 'DB_NAME', 'test_db’ ); /** MySQL データベースのユーザー名 */ define( 'DB_USER', ‘test-user’ ); /** MySQL データベースのパスワード */ define( 'DB_PASSWORD', ‘test-password’ ); /** Absolute path to the WordPress directory. */ if ( ! defined( 'ABSPATH' ) ) { define( 'ABSPATH', __DIR__ . '/' ); } if (empty($_SERVER['HTTPS'])) { $_SERVER['HTTPS'] = 'on'; $_ENV['HTTPS'] = 'on'; } /** Sets up WordPress vars and included files. */ require_once ABSPATH . 'wp-settings.php'; $ mv * /var/www/html
 #htmlディレクトリの移動 $ cd /var/www/html/ #htmlディレクトリへ移動 $ rm -r wordpress/ #wordpressフォルダの削除 https://[ドメイン名]でアクセスすると下記のインストール画面が表示されます。 項目入力し、インストール後に成功!の画面が表示されれば完了です。
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

EC2(Amazon linux2)を利用した、LEMP構成によるWordpressサイトの構築

はじめに 前回作成記事をもとにLEMP構成のWordpressサイトを作成します。 PHPインストール PHP $ amazon-linux-extras install php7.4 -y #インストール $ php -v #インストール確認 PHP 7.4.19 (cli) (built: May 13 2021 22:36:40) ( NTS ) Copyright (c) The PHP Group Zend Engine v3.4.0, Copyright (c) Zend Technologies $ systemctl start php-fpm #起動 $ systemctl enable php-fpm #自動起動設定 MariaDBのバージョンアップ Amazonlinux2には、デフォルトでMariaDBのバージョン5.5がインストールされていますが、10.5にバージョンアップさせます。 MariaDB $ sudo vi /etc/yum.repos.d/MariaDB.repo #5.5から10.5に変更 [mariadb] name = MariaDB baseurl = http://yum.mariadb.org/10.5/centos7-amd64 gpgkey=https://yum.mariadb.org/RPM-GPG-KEY-MariaDB gpgcheck=1 $ yum install MariaDB-server MariaDB-client -y #インストール $ mysql -V #確認 mysql Ver 15.1 Distrib 10.5.10-MariaDB, for Linux (x86_64) using readline 5.1 $ systemctl start mariadb.service #起動 $ systemctl enable mariadb.service #自動起動設定 Nginx設定 Nginx $ cp -p /etc/php-fpm.d/www.conf /etc/php-fpm.d/www.conf.org #www.confのバックアップ $ vi /etc/php-fpm.d/www.conf #以下設定を変更 user = nginx group = nginx pm.max_children = 10 pm.start_servers = 2 pm.min_spare_servers = 2 pm.max_spare_servers = 5 $ chown -R nginx:nginx /var/lib/php/session #権限をnginxに変更 $ cp /etc/nginx/nginx.conf /etc/nginx/nginx.conf.org #nginx.confのバックアップ $ mkdir -p /var/www/html #/var/www/htmlフォルダの作成 $ chown -R nginx:nginx /var/www/html #htmlディレクトリの権限をnginxに変更 $ vi /etc/nginx/nginx.conf #以下設定を変更 server { client_max_body_size 20M; listen 80 default_server; listen [::]:80 default_server; server_name _; root /var/www/html; # Load configuration files for the default server block. include /etc/nginx/default.d/*.conf; location ~ \.php$ { root cat ; fastcgi_pass unix:/run/php-fpm/www.sock; fastcgi_index index.php; fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; include fastcgi_params; } $ nginx -t #nginx設定の構文チェック エラーがでなければOK nginx: the configuration file /etc/nginx/nginx.conf syntax is ok nginx: configuration file /etc/nginx/nginx.conf test is successful $ systemctl restart nginx.service #再起動 PHP設定 PHP $ vi /etc/php.ini #以下設定を変更 date.timezone = “Asia/Tokyo” expose_php = Off upload_max_filesize = 8M post_max_size = 16M memory_limit = 512M mbstring.language = Japanese mbstring.detect_order = auto mbstring.encoding_translation = Off mbstring.detect_order = UTF-8,SJIS,EUC-JP,JIS,ASCII $ systemctl restart php-fpm #再起動 $ netstat -al --protocol=unix |egrep "Proto|fpm" #nginxとphp-fpmのUNIXドメインソケット接続確認 Proto RefCnt Flags Type State I-Node Path unix 2 [ ACC ] STREAM LISTENING 61433 /run/php-fpm/www.sock $ echo '<?php phpinfo(); ?>' | sudo tee /var/www/html/phpinfo.php #PHPの設定内容の表示確認 ブラウザからhttp://パブリックIP/phpinfo.phpもしくはhttp://パブリック IPv4 DNS/phpinfo.phpにアクセスし、PHPの設定内容が表示されることを確認する。 MariaDB設定 MariaDB $ mysql -uroot -p MariaDB [(none)]> create database test_db; #データベース作成 Query OK, 1 row affected (0.000 sec) MariaDB [(none)]> create user 'test-user'@'localhost' identified by 'test-password'; #ユーザー作成とPW設定 Query OK, 0 rows affected (0.002 sec) MariaDB [(none)]> grant all on test_db.* to 'test-user'@'localhost'; #データベースに対してユーザー権限を付与 Query OK, 0 rows affected (0.002 sec) MariaDB [(none)]> exit #終了 $ systemctl restart mariadb.service #再起動 $ mysql_secure_installation #mariaDBのセキュリティ保護 Switch to unix_socket authentication [Y/n] y # unix_socket認証に切替え Enabled successfully! Reloading privilege tables.. ... Success! Change the root password? [Y/n] y # ルートパスワードへ変更 New password: Re-enter new password: Password updated successfully! Reloading privilege tables.. ... Success! Remove anonymous users? [Y/n] y #匿名のユーザーアカウントを削除 ... Success! Disallow root login remotely? [Y/n] y #リモートでのルートログインを無効 ... Success! Remove test database and access to it? [Y/n] y #テストデータベースを削除 - Dropping test database... ... Success! - Removing privileges on test database... ... Success! Reload privilege tables now? [Y/n] y #権限テーブルを再ロード、変更を保存 ... Success! Cleaning up... All done! If you've completed all of the above steps, your MariaDB installation should now be secure. Thanks for using MariaDB! $ systemctl restart mariadb.service #再起動 Wordpressのインストール&設定 Wordpress $ cd /var/www/html
 #htmlディレクトリへ移動 $ wget https://ja.wordpress.org/latest-ja.tar.gz
 #Wordpressパッケージのダウンロード $ tar xzvf latest-ja.tar.gz #解凍 $ cd wordpress
 #wordpressディレクトリへ移動 $ cp wp-config-sample.php wp-config.php #sampleの雛形からwp-config.phpを作成 
$ vi wp-config.php #以下設定を変更 /** WordPress のためのデータベース名 */ define( 'DB_NAME', 'test_db’ ); /** MySQL データベースのユーザー名 */ define( 'DB_USER', ‘test-user’ ); /** MySQL データベースのパスワード */ define( 'DB_PASSWORD', ‘test-password’ ); /** Absolute path to the WordPress directory. */ if ( ! defined( 'ABSPATH' ) ) { define( 'ABSPATH', __DIR__ . '/' ); } if (empty($_SERVER['HTTPS'])) { $_SERVER['HTTPS'] = 'on'; $_ENV['HTTPS'] = 'on'; } /** Sets up WordPress vars and included files. */ require_once ABSPATH . 'wp-settings.php'; $ mv * /var/www/html
 #htmlディレクトリの移動 $ cd /var/www/html/ #htmlディレクトリへ移動 $ rm -r wordpress/ #wordpressフォルダの削除 https://[ドメイン名]でアクセスすると下記のインストール画面が表示されます。 項目入力し、インストール後に成功!の画面が表示されれば完了です。
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

【Laravel】SQL発行回数を減らす 〜複数レコードを一気にDBへ保存する方法〜

Laravelで複数レコードを保存する際、一度のSQL発行で処理する方法を考える。 現状は4つのレコードを保存する為に、4回SQLを発行している。 コードは以下の通り。 RoomController.php //1人目 $room_player_1 = RoomPlayer::create([ "name" => null, "room_id" => $room_id, "user_id" => 1, ]); //2人目 $room_player_2 = RoomPlayer::create([ "name" => null, "room_id" => $room_id, "user_id" => 2, ]); //3人目 $room_player_3 = RoomPlayer::create([ "name" => null, "room_id" => $room_id, "user_id" => 3, ]); //4人目 $room_player_4 = RoomPlayer::create([ "name" => null, "room_id" => $room_id, "user_id" => 4, ]); これを一度のSQL発行で処理するには、以下のようにデータを配列に格納し、insert( )で保存する。 ※ちなみに、save(), create() で複数データをテーブルに格納する場合, foreach() 等で繰り返し処理をする必要がある。 RoomController.php $players = [ ["name" => null, "room_id" => $room_id, "user_id" => 1], ["name" => null, "room_id" => $room_id, "user_id" => 2], ["name" => null, "room_id" => $room_id, "user_id" => 3], ["name" => null, "room_id" => $room_id, "user_id" => 4] ]; $save_players = RoomPlayer::insert($players);
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

php-webdriverでエラーが発生し、要素の取得ができない

現象 echo $driver->findElements(WebDriverBy::tagName("a"))[1]->getText(); など、要素を取得しようとすると、 Fatal error: Uncaught Facebook\WebDriver\Exception\UnknownCommandException: GET /session/d6ad6784c4b4c042ffaefe2def5a305f/element//text を表示。(sessionの後の値は都度変わる) //Googleのホームページに移動 $url = 'https://www.google.com/'; $driver->get($url); //終了 $driver->quit(); など、起動や終了は問題なくできます。 原因 php-webdriverのバージョンが古いことが問題でした。 バージョンを指定せずにインストールしていたので、最新版が入っているとばかり思っていましたが、バージョンを確認すると、1.3.0でした。(1.3.0は2017年リリース。2021年6月9日現在の最新版は1.11.1) ↑ ここから確認すると、1.4.0からはext-zipが必要になっており、使用しているmacのPHPのバージョンではext-zipが使用できなかったため、1.3.0になってしまったようです。 対応 PHPのバージョンを上げて、php-webdriverの最新版をインストールしたら、無事動作するようになりました!
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

Laravel - Artisan::call()でTenancyのコマンドを呼び出せない

前提 Tenancyのバージョンは5.6を使用しています。 問題 あるファイルでArtisan::call()を使用してTenancyのartisanコマンドを呼び出そうするとエラーが出ます。 index.php Artisan::call('tenancy:db:seed'); エラー↓ Symfony\Component\Debug\Exception\FatalThrowableError : Class 'App\Console\Commands\Artisan' not found 解決方法 妥協案ではありますが、PHPのexec関数を使用したら動きました。 index.php exec('php artisan tenancy:db:seed'); Artisan::call()で正常に動作させる方法をご存知の方はコメントしていただけるとありがたいです。 参考 Tenancyとは異なるライブラリですが、下記のIssueを参考にしました。
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

件数をカウントしたいときの方法 php sql

参考サイト 上記サイトの参考箇所 基本的に,以下の方法に従います. 件数だけでなく結果セットも一緒に欲しい場合, PDOStatement::fetchAll メソッドで一気に配列として取得し,それに対してPHPの count 関数を使う. 件数だけが欲しい場合は, SELECT COUNT(*) WHERE ... といったクエリを発行し,その結果を PDOStatement::fetchColumn メソッドで得る. これらの方法が最も推奨されますが,他の方法が無いわけではありません.以下に補足説明を示します.但しこれらはMySQLやPostgreSQLについてのみ当てはまり,SQLiteには当てはまりません. バッファクエリ使用時 SELECT に対しても常に PDOStatement::rowCount メソッドを使うことができる. 非バッファクエリ使用時 PDOStatement::fetchAll メソッドを実行した後,つまり全てのフェッチが終わった後であれば SELECT に対しても PDOStatement::rowCount メソッドを使うことができる. 結果のフェッチを途中で中断したまま次のクエリ実行に移行するときは, PDOStatement::closeCursor メソッドを使ってカーソルを閉じる必要がある.1つ目の結果セットをPDOStatementに保持したまま2つ目のSQLを実行することはできないので,その場合はあらかじめ PDOStatement::fetchAll メソッドでデータを退避させておく必要がある.
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

Laravelでcsvファイルのvalidationをする

概要 ・開発でcsvインポート機能を作った際にバリデーションでちょっと手間取った ・力技かもしれないがとりあえず頑張った証拠として残しておこうと思った。 ・ライブラリ等は使ってません。 これが正解かもわからないですがもっといい方法あるよとかあれば教えていただけると嬉しいです。 仕様 PHP 7.4 Laravel 8 mysql 8 DBテーブル詳細 仮にこんなテーブルがあるとします。 prohectsテーブル またこのprojectsテーブルにはpositionsテーブルとskillsテーブルが多対多で紐づいています。 positionsテーブル skillsテーブル これらのテーブルにcsvから一気に登録します。 テーブルの中身よりもcsvのデータに対しても普通にバリデーションできているところがミソです。 csvファイル csvファイルはこんな感じです。色ついてるところは気にしなくて大丈夫です。 リレーションしているところはめんどくさいのでIDで記入しました。skillとpositionは複数登録できるのでexplodeして配列で入れます。 実装 今回はRequestクラスを使ってRequestクラス内で完結するやり方です。 TestRequest.php <?php namespace App\Http\Requests\Test; use App\Models\Agent; use App\Models\Position; use App\Models\Skill; use App\Models\Station; use Illuminate\Foundation\Http\FormRequest; use Illuminate\Validation\Rule; use SplFileObject; class TestRequest 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(): array { $skills = Skill::all(); $skill_ids = $skills->pluck('id')->toArray(); $positions = Position::all(); $position_id = $positions->pluck('id')->toArray(); $agents = Agent::all(); $agent_ids = $agents->pluck('id')->toArray(); $stations = Station::all(); $station_ids = $stations->pluck('id')->toArray(); return [ 'csv_file' => ['required', 'file', 'mimetypes:text/plain', 'mimes:csv,txt'], 'csv_array' => ['required', 'array'], 'csv_array.*.name' => ['required', 'unique:projects', 'string'], 'csv_array.*.station_id' => ['required', 'integer', Rule::in($station_ids)], 'csv_array.*.description' => ['required', 'string', 'max:500'], 'csv_array.*.required_condition' => ['nullable', 'string', 'max:500'], 'csv_array.*.better_condition' => ['nullable', 'string', 'max:500'], 'csv_array.*.work_start' => ['nullable', 'string', 'max:5'], 'csv_array.*.work_end' => ['nullable', 'string', 'max:5'], 'csv_array.*.weekly_attendance' => ['nullable', 'integer', 'max:5'], 'csv_array.*.skill_ids' => ['required', 'array', 'max:10'], 'csv_array.*.skill_ids.*' => ['required', 'integer', Rule::in($skill_ids)], 'csv_array.*.position_ids' => ['required', 'array', 'max:10'], 'csv_array.*.position_ids.*' => ['nullable', 'integer', Rule::in($position_id)], ]; } protected function prepareForValidation() { $file_path = $this->file('csv_file')->path(); // CSV取得 $file = new SplFileObject($file_path); $file->setFlags( SplFileObject::READ_CSV | // CSVとして行を読み込み SplFileObject::READ_AHEAD | // 先読み/巻き戻しで読み込み SplFileObject::SKIP_EMPTY | // 空行を読み飛ばす SplFileObject::DROP_NEW_LINE // 行末の改行を読み飛ばす ); foreach ($file as $index => $line) { // ヘッダーを取得 if (empty($header)) { $header = $line; continue; } $csv_array[$index]['station_id'] = (int)$line[0]; $csv_array[$index]['name'] = $line[1]; $csv_array[$index]['description'] = $line[2] == "" ? null : $line[2]; $csv_array[$index]['required_condition'] = $line[3] == "" ? null : $line[3]; $csv_array[$index]['better_condition'] = $line[4] == "" ? null : $line[4]; $csv_array[$index]['work_start'] = $line[5] == "" ? null : $line[5]; $csv_array[$index]['work_end'] = $line[6] == "" ? null : $line[6]; $csv_array[$index]['weekly_attendance'] = (int)$line[7] === 0 ? null : (int)$line[7]; $csv_array[$index]['skill_ids'] = explode(',', $line[8]); $csv_array[$index]['position_ids'] = explode(',', $line[9]); } $this->merge([ 'csv_array' => $csv_array, //requestに項目追加 ]); } } ざっくり解説すると Requestで入ってきたcsvデータを配列に入れて整理しcsv_arrayという名前で項目を追加してバリデーションしていく感じです。 prepareForValidation関数はLaravelで提供されている関数でバリデーション前にRequestの中身を加工することができます。 csvのデータは配列に加工しているので.*で取り出すことができます。 項目を追加しているので元々のcsvファイル自体のバリデーションも同時に行えます。 intにしたり中身が空だった時にnullにしたりしているところは各仕様に合わせて変更してください。 stringで避ければそのままいれるだけで大丈夫です。 以上です。 参考 【Laravel】バリデーション前にデータ加工する方法
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

【Php】PDOでdatabaseに接続する

初めに PDOについて学習した内容のoutput用記事です。 ※内容に間違いなどがある場合はご指摘をよろしくお願いします。 ※こちらの記事はあくまでも個人で学習した内容のoutputとしての記事になります。 PDOとは Php Database Objectsの略でphpを使ってdatabaseに接続するためのクラス。 PDOクラスからインスタンスを生成する PDOクラスにはあらかじめコンストラクタが定義されており、インスタンスを生成すると同時にデータベースへ接続する関数が実行されます。引数としてDSN(Database source name)とユーザーネーム、パスワード、その他のオプションを指定します。 //DSN,ユーザーネーム,パスワードをそれぞれDB_HOST,DB_USER,DB_PASSWORDに格納 const DB_HOST = 'mysql:dbname=hogehoge;host=127.0.0.1;charset=utf8'; const DB_USER = 'fugafuga'; const DB_PASSWORD = '12345678'; それからPDOクラスのインスタンスを作り変数$pdoに格納します。 $pdo = new PDO(DB_HOST, DB_USER, DB_PASSWORD); これで簡単にデータベースに接続できます。前提としてmysqlにdatabaseとアカウントを作成しておく必要があります。 DSNとは DSN(Database source name)はデータベースのソースネームで接続するデータベースを識別するための情報。データベースの名前や種類、ホスト、文字コードなどが入る よく使うPDOのoption PDOのインスタンスを生成する時に、よく使われるオプションは以下の3つです。 ① PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC → データベースと接続して帰ってくる値を連想配列という形で受け取る ② PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION → 例外を表示する ③ PDO::ATTR_EMULATE_PREPARES => false → SQLインジェクション対策 (フォームに不正な入力をし、データベースを改ざんすることを防ぐ) $pdo = new PDO(DB_HOST, DB_USER, DB_PASSWORD, [ //追記 PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC, PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION, PDO::ATTR_EMULATE_PREPARES => false, ]); データベース接続に失敗した時の処理 try catch文を使ってデータベース接続に失敗した時のエラーメッセージを表示するようにします。catchの引数にPDOExceptionのインスタンス?$e(変数名はなんでも構いません)を渡すことによってエラーの内容を表示することができます。 try{ $pdo = new PDO(DB_HOST, DB_USER, DB_PASSWORD, [ PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC, PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION, PDO::ATTR_EMULATE_PREPARES => false, ]); echo 'connection successful'; }catch(PDOException $e){ echo $e -> getMessage() . "\n"; exit(); } PDOExceptionクラスが持つgetMessage()を使えば、PDOの接続失敗時のエラーメッセージを表示することができます。また、exit();によって処理を終わらせます。 参考サイト https://www.php.net/manual/ja/class.pdo.php https://www.php.net/manual/ja/pdo.construct.php https://www.php.net/manual/ja/exception.getmessage.php https://www.php.net/manual/ja/class.pdoexception.php https://www.php.net/manual/ja/language.oop5.paamayim-nekudotayim.php https://www.php.net/manual/ja/language.oop5.decon.php https://techacademy.jp/magazine/19296
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む