20210725のPHPに関する記事は11件です。

Make Laravel Permission by yourself

Laravel Guardian Laravel Guardian makes it easy to perform permission https://github.com/cuongnd88/lara-guardian 1-Install cuongnd88/lara-repository using Composer. $ composer require cuongnd88/lara-guardian 2-Add the following service provider in config/app.php <?php // config/app.php return [ // ... 'providers' => [ // ... Cuongnd88\LaraGuardian\LaraGuardianServiceProvider::class, ] // ... ]; 3-Run make:guardian command php artisan vendor:publish --provider="Cuongnd88\LaraQueryKit\LaraQueryKitServiceProvider" php artisan make:guardian App/Traits provides QueryKit trait to empower Laravel models. App/Guardian/Traits has a trait to support Laravel Guardian. App/Http/Middlewares/GuardianMiddleware.php is to check user's permissions. App/Models provides 5 models such as Action, Role, Group, Permission, Role. database/migrations has 5 tables: actions, roles, groups, permissions, roles. Sample Usage Based on route's name, Lara Guardian checks user's permission. You must follow the rule in naming a route: $page.$action Route::group(['middleware' => ['guardian']], function(){ Route::get('/user', function(){ dump("Congratulation. You have the right permission"); })->name('user.read'); }); You have to assign the guard middleware in your app/Http/Kernel.php file. protected $routeMiddleware = [ . . . . 'guardian' => \App\Http\Middleware\GuardianMiddleware::class, ]; There is the relationship of Guardian's models MEMO: the alias of actions, pages tables is used to name a route, therefore you need to enter lower-case letters, dash symbol instead of space. Please add App\Guardian\Traits\HasGuardian.php into the model namespace App\Models; use Illuminate\Foundation\Auth\User as Authenticatable; use Illuminate\Notifications\Notifiable; use App\Guardian\Traits\HasGuardian; class User extends Authenticatable { use Notifiable; use HasGuardian; } The HasGuardian trait provides: joinGroup($groupId) : user joins a group. public function joinGroup(Request $request) { $user = \App\Models\User::find(10); $user->joinGroup(2); } joinMultiGroups($groups) : user joins multi groups. public function joinManyGroups(Request $request) { $user = \App\Models\User::find(10); $user->joinMultiGroups([ ['group_id' => 1], ['group_id' => 3], ]); } hasPermissions(array $where = [], string $action = null, array $select = []) : show user's permissions. public function getUserPermissions(Request $request) { $user = \App\Models\User::find(10); $user->hasPermissions()->toArray(); } rightAccess(string $page = null, string $action = null) : check user has the permission to access. public function checkUserAccess(Request $request) { $user = \App\Models\User::find(10); if ($user->rightAccess('product', 'create')) { dump('Right Access'); } else { dump('Forbidden'); } } Import/Export data Currently, Lara Guardian imports array data (read files in config\guardian) into database, and exports data in DB to file by using simple command php artisan guardian --action[=ACTION] --model[=MODEL] --action= is import or export value. model= is one or three values actions|pages|groups. For example: php artisan guardian --action=import --model=actions App\Traits\QueryKit.php support these useful methods in importing/exporting guardian data: insertDuplicate(array $data, array $insertKeys, array $updateKeys) is insert new rows or update existed rows. The first argument consists of the values to insert or update, while second argument lists the column(s) that uniquely identify records within the associated table. The third argument is an array of the columns that should be updated if a matching record already exists in the database. $data = [ ['fullname' => 'AAAA', 'email' => 'aaaa@xxxx.com', 'age' => 20, 'address' => 'WWW'], ['fullname' => 'BBBBB', 'email' => 'bbbb@xxxx.com', 'age' => 25, 'address' => 'QQQQ'], ]; \App\Models\User::insertDuplicate( $data, ['fullname', 'email'], ['age', 'address'] ); except(array $columns) is to retrieve a subset of the output data. $exceptable = ['created_at', 'updated_at', 'deleted_at']; $data = app(User::class)->except($exceptable)->get()->toArray()
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

【AWS】Laravel + Docker + RDS(MySQL) でデプロイした時のDB関連のエラーとその解決

はじめに AWS(EC2)にデプロイする際、DB関連のエラーで躓いたため記録として残します。 DB関連にフォーカスしているので、それ以外のインストールの手順は省いています。 前提 ・今からmigrateします ・EC2インスタンス作成済み ・sshログインできる 条件 macOS: "11.2.3 Big Sur" php artisan -V # > Laravel Framework 6.20.30 php -v # > PHP 8.0.8 nginx -v # > nginx version: nginx/1.12.2 mysql -h エンドポイント -u マスターユーザー名 -p データベース名 Enter password: # > Server version: 8.0.25 git --version # > git version 2.32.0 1. php artisan migrateでエラー MySQLをインストール ssh sudo yum -y install mysql artisanコマンドが使えるディレクトリに移動してmigrate php artisan migrate すると以下のエラーが... SQLSTATE[HY000] [2002] Connection timed out DBに接続をしようとしたけどできてない様子。 .envを確認して何回か修正したが、改善せず。 .envファイル 入れる値 DB_HOST エンドポイント DB_USERNAME マスターユーザー名 DB_PASSWORD マスターパスワード 解決 AWSのセキュリティグループ→インバウンドルールを確認すると、TypeがMySQLではなかったのが原因でした。 →MySQLに変更することで無事migrateすることができました。 php artisan migrate # migrate成功 Migration table created successfully. 念の為テーブル確認 ターミナル mysql -h エンドポイント -u マスターユーザー名 -p データベースの指定 -p の後は空白を開ける。空白を開けずに入力するとパスワードとなってしまいます。 以下が表示されれば接続成功。 ターミナル Welcome to the MariaDB monitor. Commands end with ; or \g. Your MySQL connection id is 174 Server version: 8.0.25 Source distribution Copyright (c) 2000, 2018, Oracle, MariaDB Corporation Ab and others. Type 'help;' or '\h' for help. Type '\c' to clear the current input statement. MySQL [(none)]> もし、-pを指定せずに接続しても以下のように指定することで見ることができます。 show databases;とすることで、全てのdatabaseが表示。 ターミナル MySQL [(none)]> show databases; +--------------------+ | Database | +--------------------+ | information_schema | | lantern ← このdetabaseを確認したい | mysql | | performance_schema | | sys | +--------------------+ lanternというdetabaseを見たかったらuseで指定する。 ターミナル MySQL [(none)]> use lantern Reading table information for completion of table and column names You can turn off this feature to get a quicker startup with -A Database changed MySQL [lantern]> ← lanternに変更された 参考 このエラーを解決するにあたって以下のサイトを参考にさせて頂きました。 2. php artisan db:seedでエラー Class Faker\Factory Faker\Factoryのクラスがないよと言われる。 解決 Herokuで同じようなことが起こっている人たちがいましたが、AWSでも同じようにすると解決できました。 結論から言うと、以下のようにfakerphp/fakerをrequire-devからrequireへ移動しました。 composer.json "require": { "php": "^7.2.5|^8.0", "doctrine/dbal": "^3.1", "fideloper/proxy": "^4.4", "intervention/image": "2.5.1", "laravel/framework": "^6.20.26", "laravel/tinker": "^2.5", + "fakerphp/faker": "^1.9.1" }, "require-dev": { "barryvdh/laravel-debugbar": "^3.6", "facade/ignition": "^1.16.15", "laravel/ui": "^1.0", "mockery/mockery": "^1.0", "nunomaduro/collision": "^3.0", "phpunit/phpunit": "^8.5.8|^9.3.3" - "fakerphp/faker": "^1.9.1" }, デプロイの際、パッケージのインストールで以下のように記述しました。 composer install --no-dev --prefer-dist --no-devとすることで、「開発環境のみ必要で本番環境で必要ないパッケージはインストールしない」とできます。 具体的には、phpunitやdebugbarなどは本番環境には必要ないためインストールされないようにしています。 「開発環境のみ」というのはrequire-devの部分です。 上記のコマンドを実行するとrequire-devで書かれているものはインストールされません。 修正後、gitにpushし本番環境でもcomposerをアップデートして反映させます。 composer update この後にもう一度php artisan db:seedをすると無事実行されました。 php artisan db:seed Database seeding completed successfully. 参考 このエラーを解決するにあたって以下のサイトを参考にさせて頂きました。 おわり この他にも、ディレクトリの記述ミスで実行できなかったのもあり、これを機にディレクトリをしっかり意識するようになりました。 初歩的なミスばかりですが、おかげでデプロイの概要が少しずつ理解できてきたかなと感じます! このまま自動デプロイ目指してやっていきます! 参考
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

Laravelアプリをロリポップへ設置した

laravel6のwebアプリをロリポップ スタンダードプランで動かしたときに結構時間かかったのでメモを残す。 作業環境 Win10 home Laravel 6.20 PHP 7.4 MariaDB 10.6 SSHでロリポップへ接続 ロリポップの管理画面からSSHでの接続情報を入手して入力する。 (Git Bashを使用したが、PowerShellなどでも同じだと思う) ssh (アカウント)@(サーバー) -p(接続ポート) 入力例 ssh abcde-123456789@abc.lolipop.jp -p1234 次にパスワードを聞かれる。 自動生成された30文字くらいの文字列なので間違えないよう慎重に入力する。 (パスワードは入力しても何も表示されないので何文字入力したかもわからない) 正しいパスワードを入力すると下記のように表示される。 [(アカウント)@(サーバー番号) ~]$ 表示例 [abcde-123456789@abc123 ~]$ PHPのパスを通す この時点ではパスが通っておらずphp -vを実行してもPHPのヴァージョンを確認できない。 PHPのパスを通す $ export PATH="$PATH:/usr/local/php/7.4/bin" 上記を実行することでphp -vが通るようになる。 ただ、このままでは毎回パスを通さないといけなくて面倒なので、.bash_profileファイルを作成する。 .bash_profileを作成しviで開く $ vi ~/.bash_profile viコマンドで.bash_profileを開いたら、「i」キーを押して「挿入」モードにする。 .bash_profileへ下記を記入 PATH="$PATH:/usr/local/php/7.4/bin" 上記を入力して「esc」キーを押して:wqで保存する。 これで今後もパスが通った状態となる。 Composerをインストールする 下記コマンドを実行してwebディレクトリへ移動。 webディレクトリへ移動 $ cd web ここに下記を実行してcomposerをインストールする。 composerをインストール $ /usr/local/php/7.4/bin/php -r "eval('?>'.file_get_contents('https://getcomposer.org/installer'));" インストールしたら一応composer -vを実行してcomposerがインストールされているか確認する。 FTP接続してファイルを転送する 今回設置するWebアプリはGitHubなどに上げていないのでFTPで転送する。 Windows10のエクスプローラーを起動して、アドレスバーにロリポップのFTPサーバーアドレスを入力。 (パスワードなどのFTPサーバー情報は、ロリポップの管理画面からユーザー設定 → アカウント情報で入手する。FTPサーバーアドレスはWebDAVの欄に記載されている) WebDAVのアカウントとパスワードを入力して接続する。 任意のディレクトリを作成しそこへ必要なファイルを転送。 .git、node_modules、vendorの3ディレクトリ以外は全ファイルを転送した。 今回は.envファイルも転送したが、データベースの接続情報は開発環境のままなので、エディタでロリポップのデータベース用に内容修正。 composer updateを実行 SSH接続しているGitBashに戻り、composer updateを実行したがエラーで停止してしまった。 composerUpdateを実行 $ composer update 下記のようなエラーが出た。 エラー内容 Loading composer repositories with package information Warning from https://repo.packagist.org: Support for Composer 1 is deprecated and some packages will not be available. You should upgrade to Composer 2. See https://blog.packagist.com/deprecating-composer-1-support/ Updating dependencies (including require-dev) mmap() failed: [12] Cannot allocate memory mmap() failed: [12] Cannot allocate memory PHP Fatal error: Out of memory (allocated 679682048) (tried to allocate 8592000 bytes) in phar:///usr/local/bin/composer/src/Composer/Util/RemoteFilesystem.php on line 462 Fatal error: Out of memory (allocated 679682048) (tried to allocate 8592000 bytes) in phar:///usr/local/bin/composer/src/Composer/Util/RemoteFilesystem.php on line 462 メモリが足らんということらしいので、エラー内容から検索して下記を実行。 composerUpdateでメモリ不足を解消したコマンド $ php -d memory_limit=-1 ../composer.phar install 上記コマンドを実行すると、composer updateが再開し無事終了。 ログイン画面を表示することができた。 参考サイト 今回はいろいろ調べ回りましたが、主に下記2サイト様を参考にさせていただきました。 非常に助かりました。ありがとうございました。
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

PHPでLINEログイン実装してみたメモ①〜認可コードが返ってくるまで〜

準備 LINE developersのアカウント作成 まず最初にLINE developersのアカウントを作成します。 プロバイダーとLINEログインチャネル作成 下記概要ページにしたがって「プロバイダー」とLINEログインの「チャネル」を作成します。 概要 devlopersコンソールにログイン プロバイダー(利用者の情報(LINE IDなど)を取得する開発者・企業・組織のこと)を作成 チャネルを作成 今回はLINEログインチャネルを作成します 「新規チャネル作成」→「LINEログイン」を選択します。 必須項目を入力して「作成」します。アプリタイプは今回は「ウェブアプリ」を選択します。 。 LINEログインチャネルの設定 LINEログインアプリを作成すると次のようなページができます。ここでいろいろ情報が確認できます。 チャネルID(チャネルに対してユニークなID)やチャネルシークレットは後々いろいろ必要になってくるのでメモをしておくと良いかもしれません。 webアプリにlLINEログインを組み込む それでは作成するWEBアプリにLINEログインを組み込んでいきたいと思います。 大枠は下記公式ドキュメントも参照ください。 PHPでコードを書く まず初めに、PHPで簡単にハローワールドのコードを書きます。 <?php echo 'Hello, World!!'; ローカルサーバーを立ち上げる ターミナルを立ち上げ、ファイルが置いてあるディレクトリでPHPのローカルサーバを立ち上げます。-Sがポイントです。 php -S localhost:8000 index.php にアクセスして「Hello, World!!」が表示されていることを確認します。 ngrokでローカルサーバーを外部からでもつなげるようにする 次に「ngrok」というサービスを使って、自分のPCからしかアクセスできない「ハローワールド」を外からでもアクセスできるようにします。 ngrok公式 ngrokが便利すぎる ngrokのインストール 下記セットアップページにしたがって、ngrok公式からダウンロードします。 ngrokでサーバーを立ち上げる 先ほどローカルサーバーを立ち上げた同じディレクトリで、下記コマンドを入力してサーバーを立ち上げます。 ngrok http 8000 するとターミナル上に下記が表示され、http or httpsで外部からアクセスができるようになります。 ※フリープランの場合はサーバーを複数立ち上げられません。もしも既に立ち上がっている場合は下記コマンドでサーバーを停止してください。 killall ngrok // ngrokのサーバー停止 Forwardingにあるhttps://8bbebde7cc12.ngrok.ioにアクセスしてみます。(このURLはサーバーを立ち上げ直すたびに毎回変わります) ハローワールドが表示されていることが確認できました! コールバックURLを設定する 次に、コールバックURLを設定します。このURLはLINEの認証突破後に、「認可コード」と「State」を受け取るために設定します。(この2つは後ほどまた出てきます) ここには先ほどngrokで外部からアクセスできるようにしたURLを設定します。 メールアドレスの取得権限を申請する メールアドレスの情報を取得したい場合は下記手順で申請をしておきます。 ユーザーに認証と認可を要求する 次に、URLにアクセスした時にLINEの認証画面を挟むように設定します。 とりあえず、URLにパラメータをくっつけます。 URL https://access.line.me/oauth2/v2.1/authorize いろいろ複雑なので、まずは必須パラメータのみくっつけて試します。そして私はpostman(https://www.postman.com/)を使ってURLを作りました。 GETにしてurlを入れて、KEYとVALUEにパラメータを入れるとURLができるので便利です。 できたURLはこんな感じです。client_idとredirect_uriは適宜変更してください。 https://access.line.me/oauth2/v2.1/authorize?response_type=code&client_id=**********&redirect_uri=[https://](https://8bbebde7cc12.ngrok.io/)*****************/&state=1238al8esad8&scope=profile%20openid これをこのままブラウザのURLにコピペしてアクセスします。 正しくパラメータが設定できていれば、LINEのログイン画面にアクセスします。 401エラーの時 これは私も引っかかって「???」となったのですが、個人LINE等でアクセスしようすると公開前設定のため、アクセスができません。 確認のためにLINEログインチャネルの「権限設定」で個人LINEをメールで招待等で招待しておいてください。また、Tester権限の付与がよいらしい。開発中のアプリのテストのテストができるのはTester権限とのこと。 「ログイン」してみる 次に先ほどの認証画面で「ログイン」を押します。 「Hello, World」の文字が表示されたら成功です!! ここでアクセス後のURLをよく見てみます。先ほど設定した「コールバックURL」の後ろに何やらいろいろくっついているのがわかります。これがcode(認可コード)とstateです。 このcodeはこの後アクセストークンを発行するために必要な情報になります。アクセストークンを発行することで、LINE上に登録されているユーザー名やプロフィール画像、ユーザーID等の情報を取得することができます。 次の記事ではこのcodeを使ってアクセストークンを取得し、画面上にLINEのユーザー名や画像を表示させてみたいと思います。 今日のところはここまでです。
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

fuel.php Fuel\Core\Database_Exception [ 42000 (1064) ]:エラー

fuel.phpのエラーはググっても古い記事が多く、苦戦しました。 本日は以下のエラーと格闘。 Fuel\Core\Database_Exception [ 42000 (1064) ]: SQLSTATE[42000]: Syntax error or access violation: 1064 You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'group, profile_fields, last_login, login_hash, created_at) これはデフォルトで用意しなきゃいけないusersテーブルの中の「group」というテーブルが悪さをしてます。 これは予約語です。 なのでバッククウォートで囲ってあげる必要がありますね。 まずは fuel>packages>auth>classes>auth>login>simpleauth.php に入ります。 そこの260行目付近に以下の記述があります。 デフォルトだとgroupがシングルクオーテーションで囲われてるだけなのですが その内側をバッククウォートで囲ってあげればOKですね。 fuel.php $user = array( 'username' => (string) $username, 'password' => $this->hash_password((string) $password), 'email' => $email,                           //こいつです。このやろーーー '`group`' => (int) $group, 'profile_fields' => serialize($profile_fields), 'last_login' => 0, 'login_hash' => '', 'created_at' => \Date::forge()->get_timestamp(), ); 多分SELECTの時とかも悪さをしそうなのでエラー画面からファイル名を特定して書き換えてやる 必要がありそうですね。
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

fuel.phpのFuel\Core\Database_Exception [ 2014 (2014) ]:エラー

このエラーはfuel.phpのバージョンが18.1以降にDBの接続方法が mysqliの時に起きました。 対処法は簡単 app>config>db.phpの中の以下の[active]の箇所をpdoに変更するだけ。 fuel.php return array( 'active' => 'mysqli', 'pdo' => array( //ここを変える 'type' => 'pdo',                    //接続配列 'connection' => array() //PDOの接続DSN(データソース名) 'dsn' => 'mysql:host = localhost; dbname = db名', 'username' => 'root', 'password' => 'root',               //永続的に接続するかどうか 'persistent' => false,                              //MYSQL、MYSQLiを使用するときにクライアント圧縮するかどうか 'compress' => false, ) //テーブル接頭辞(Wordpressのテーブルの前のwp_...みたいなやつ) 'table_prefix' => '', 'caching' => false, 'profiling' => true, ),   'mysqli' => array( 'type' => 'mysqli', 'connection' => array( 'hostname' => 'localhost', 'database' => 'framework', 'username' => 'root', 'password' => 'root', 'persistent' => false, 'compress' => false, ), 'table_prefix' => '', 'charset' => 'utf8', 'caching' => false, 'profiling' => true, ), );
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

悪徳ひきこもり支援業者一覧アプリケーション

悪徳ひきこもり支援業者一覧アプリケーションを開発しました 一覧表示部分 <!-- 悪徳ひきこもり業者一覧作成システム --> <!-- 新規作成 2021/07/22--> <!-- 作成者 乃木坂好きのITエンジニア--> <!DOCTYPE html> <html lang="ja"> <!-- ヘッダー部分--> <head> <meta charset="utf-8"> <link rel="stylesheet" href="ichiran.css"> <title>悪徳ひきこもり業者一覧作成</title> </head> <!-- ボディー部分--> <body> <h1>悪徳ひきこもり業者一覧</h1> <h2>結果リスト</h2> <?php $pdo = new PDO("mysql:host=127.0.0.1;dbname=jissyu;charset=utf8", "root", ""); // データベースからデータを取得する try{ $sql = "SELECT id,company,address,hiyou FROM hikikomori;"; $stmt = $pdo->prepare($sql); $stmt -> execute(); } catch(PDOException $e){ echo "例外処理が発生しました"; echo $e->getMessage(); } ?> <table> <tr> <th>id</th> <th>会社名</th> <th>住所</th> <th>月額費用</th> </tr> <?php // 取得したデータを表示する while ($row = $stmt -> fetch(PDO::FETCH_ASSOC)) { ?> <tr> <td><?= $row["id"] ?></td> <td><?= $row["company"] ?></td> <td><?= $row["address"] ?></td> <td><?= $row["hiyou"] ?></td> </tr> <?php } ?> </table> <a href="hikikomori.php" id="return">入力画面に戻る</a> </body> <footer> <p class="hattori"> by 乃木坂好きのITエンジニア</p> </footer> </html> 入力フォーム <!-- 引きこもり悪徳業者一覧管理システム --> <!-- 新規作成 2021/07/22--> <!-- 作成者 乃木坂好きのITエンジニア--> <!DOCTYPE html> <html lang="ja"> <!-- ヘッダー部分--> <head> <meta charset="utf-8"> <link rel="stylesheet" href="hikikomori.css"--> <title>ひきこもり支援悪徳業者一覧管理システム</title> <script type="text/javascript"> function check(){ //変数の定義 const company = document.getElementById('company'); const submit = document.getElementById('submit'); if(company.value.replace(/\s+/, '').length == 0 ){ alert('運営会社名が入力されていません。'); } else { if(window.confirm('送信してよろしいですか?')){ // 確認ダイアログを表示 return true; // 「OK」時は送信を実行 } else{ // 「キャンセル」時の処理 window.alert('キャンセルされました'); // 警告ダイアログを表示 return false; // 送信を中止 } } } // --> </script> </head> <!-- ボディー部分--> <body> <?php // データベースに接続する $pdo = new PDO("mysql:host=127.0.0.1;dbname=jissyu;charset=utf8", "root", ""); // print_r($_POST); // 受け取ったデータのレコードを削除する if (isset($_POST["delete_id"])) { $delete_id = $_POST["delete_id"]; $sql = "DELETE FROM hikikomori WHERE id = :delete_id;"; $stmt = $pdo->prepare($sql); $stmt -> bindValue(":delete_id", $delete_id, PDO::PARAM_INT); $stmt->execute(); } // 受け取ったデータを書き込む if ((isset($_POST["company"])) && (isset($_POST["address"])) && (isset($_POST["hiyou"]))) { try{ $company = $_POST["company"]; $address = $_POST["address"]; $hiyou = $_POST["hiyou"]; $regist = $pdo->prepare("INSERT INTO hikikomori(company,address,hiyou) VALUES(:company,:address,:hiyou)"); $regist ->bindValue(":company", $company); $regist ->bindValue(":address", $address); $regist ->bindValue(":hiyou", $hiyou); $regist->execute(); } catch(PDOException $e) { echo "例外処理が発生しました"; echo $e->getMessage(); } } ?> <h1>引きこもり悪徳業者一覧アプリケーション</h1> <h2>引きこもり悪徳業者一覧入力フォーム</h2> <form id = "entry" action="hikikomori.php" method="post" role="form" onSubmit= "return check()"> <div class="form-group"> <dd>ひきこもり悪徳業者名を入力してください <dt> <span class="must"> * </span></dt> <dd> <label>ひきこもり悪徳業者名</label></dd> <dd> <input type="text" name="company" id="company"></dd> </div> <div class="form-group"> <dd>住所を入力してください <dd> <label>住所</label></dd> <dd> <input type="text" name="address" id="address"></dd> </div> <div class="form-group"> <dd>月額の費用を入力してください <dd> <label>月額の費用</label></dd> <dd> <input type="text" name="hiyou"></dd> </div> <p></p> <button type="submit" id="submit" onMouseOver="changeColor()" onMouseOut="revertColor()">データ登録</button> <script> function changeColor(){ document.getElementById('submit').style.backgroundColor = 'yellow'; } function revertColor(){ document.getElementById('submit').style.backgroundColor = null; } </script> </form> <a href="hikikomori_ichiran.php" class="ichi">ひきこもり支援悪徳業者一覧</a> <h2>一覧リスト</h2> <?php // データベースからデータを取得する $sql = "SELECT id,company,address,hiyou FROM hikikomori ORDER BY id DESC;"; $stmt = $pdo->prepare($sql); $stmt -> execute(); ?> <table> <tr> <th>id</th> <th>ひきこもり支援悪徳業者名</th> <th>住所</th> <th>月額費用</th> </tr> <?php // 取得したデータを表示する while ($row = $stmt -> fetch(PDO::FETCH_ASSOC)) { ?> <tr> <td><?= $row["id"] ?></td> <td><?= $row["company"] ?></td> <td><?= $row["address"] ?></td> <td><?= $row["hiyou"] ?></td> <td> <form action="hikikomori.php" method="post"> <input type="hidden" name="delete_id" value=<?= $row["id"] ?>> <button class="delete" type="submit" onclick="deleted()">削除</button> </form> </td> </tr> <?php } ?> <script language="javascript" type="text/javascript"> function deleted(){ if(window.confirm('データを削除してよいですか?')){ // 確認ダイアログを表示 return true; // 「OK」時は送信を実行 } else{ // 「キャンセル」時の処理 window.alert('キャンセルされました'); // 警告ダイアログを表示 return false; // 送信を中止 } } </script> </table> <a href="../index.html" class="menu">メニュー画面に戻る</a> </body> <footer> <p class="hattori"> by 乃木坂好きのITエンジニア</p> </footer> </html>
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

アプリ作成②「じゃんけんゲーム」

【作成の過程】 次に取り組んだのは、昔ゲームセンターで遊んだ「じゃんけんポンっ」のゲーム作成。 目指すイメージは決まっているが、そこまでどういうプロセスをたどるかは、完全にオリジナル。 とりあえず、基本的なアプリ設計過程と同じように、要件定義→設計→実装→テストというウォーターフォール型の行程をたどってみた。 要件定義は、ただじゃんけんで勝敗を決めるゲームを作るというごくごく単純なものなので難しくない。 設計では、機能設計で実装したい機能を列挙して、データベース設計、画面設計とアプリのイメージを細分化・具体化していった。 そして、実装を始めると、この画面があった方がいいとか課題が出てきて、当初の設計の甘さを感じた(笑) 最終的にテストをして、最低限の形にはなったかなという感じ。 まだまだ、デザインがチープだったり、実装したい機能(ルーレット、対戦モード、コイン複数枚がけ…)はあるが、今後の課題ということで、 まずは、オリジナルのアプリを作り、それを形にできたことのうれしさを感じた。 【アプリの概要】 小さい頃にゲームセンターで、わずかなコインを握りしめて白熱した「じゃんけんゲーム」をプログラミングで再現した。 勝った時は歓喜し、負けた時は絶望に打ちひしがれて、帰路についた。なぜ、あの頃はあんなに夢中になれたんだろう。皆さんが童心に帰ることができればいいですね。 【主な機能】 ・ユーザー登録機能 ・ユーザーログイン機能 ・画像ファイルアップロード機能 ・ゲーム機能 ・ランキング表示機能 【画面一覧】 ・ユーザー登録画面 ・ユーザー登録確認画面 ・ユーザー登録完了画面 ・ログイン画面 ・ゲーム画面 ・ゲーム結果画面 ・コイン獲得画面 ・ランキング画面 【開発環境】 ・CSSフレームワーク:Bootstrap ・言語:PHP ・DB:MySQL 【苦労した点】 ・ゲストモードの実装(どのような方法をとればいいか試行錯誤し、結果的にguestをデータベースに登録し、ゲストボタンを押した際、guestのデータを取得しアプリを使えるようにした。※上書きは許容しない) ・コイン枚数の画面間引継ぎ方法(セッションの受け渡しをできるだけシンプルなコードで表現したかったが…) 【今後搭載したい機能】 ・対戦モード(人間二人で使用) ・コンピューターの出し手や、獲得するコインを、ルーレットで決定させる。 ・2枚の3枚betや、勝ったコインを元手にチャレンジができ、ハイリスクハイリターンが狙える。 【アプリURL】 ・じゃんけんゲーム ・ソースコード
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

アプリの作成①「メッセージ投稿アプリ」

【作成の過程】 今まで学習した基礎的な知識を基に、オリジナルアプリの作成を始めた。 まずは、PHPの章の学習で使ったUdemy教材をベースにデザインやゲストの実装等アレンジし、「メッセージ投稿アプリ」を作成した。 今までは、動画で提示される課題の通りのものを作っていたが、 少しでもオリジナル要素を加えようとすると、正解がないわけで、どうしたらいいのかいろいろと考え込んでしまったが、 ひとまず形にし、デモデータを搭載した。 【アプリの概要】 複数のユーザーがメッセージを投稿・共有できるアプリ 【主な機能】 ・ユーザー登録機能 ・ユーザーログイン機能 ・画像ファイルアップロード機能 ・メッセージ投稿機能 ・メッセージ返信機能 ・メッセージ一覧表示機能 ・メッセージ詳細表示機能 ・ページネーション機能 【画面一覧】 ・ユーザー登録画面 ・ユーザー登録確認画面 ・ユーザー登録完了画面 ・ログイン画面 ・メッセージ投稿・一覧表示画面 ・メッセージ詳細画面 【開発環境】 ・CSSフレームワーク:Bootstrap ・言語:PHP ・DB:MySQL 【今後搭載したい機能】 ・メッセージ修正機能 ・いいね機能 【アプリURL】 ・メッセージ投稿アプリ ・ソースコード
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

PHPとSQLの理解

【PHP,MySQL】 Udemy動画教材の「PHP+MySQL(MariaDB) Webサーバーサイドプログラミング入門」(たにぐちまこと氏)で学習した。 これまでは、デザインを作る要素が強かったHTML,CSSに、PHP,MySQLが加わることで、繰返し、条件分岐やデータベースとの連携など、よりプログラミングらしくなってきて、実現できる世界が広がったし、世の中のWebサイトの仕組みがなんとなくわかってきて、自分でもサービスを作ってみたいと思った。 動画合計12時間の長丁場で、特に初期の知識が空の状態だと、知識がなかなか定着せずに、モチベーションを保つのが難しかったが、行き詰まったら飛ばすなど、工夫しながら進めた。 【動画学習のコツ】 全体的に言えることだが、動画を見ながらコーディングする際重要なのは、ゴール(目的)を明確に認識したうえで取り組むことだと思う。でなければ、ただ写しているだけの「作業」になってしまう。だから、その章・レッスンごとのゴールを確認したうえで、まずは動画を見ないで自分でできるところまで進め、つまづいたところをメモに残し、動画で答え合わせをするという方法がいいと思った。 でも、まずは、動画と一緒に作り、動かすことが大事だと思う。
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

docker php-fpm に ldap拡張を組み込む

デフォルトでは php-fpm なコンテナに ldap拡張が入ってないので組み込む場合の Dockerfile FROM php:8-fpm ARG UID=1000 ARG GID=1000 RUN useradd -m -u ${UID} docker # node.js for yarn RUN curl -sL https://deb.nodesource.com/setup_16.x | bash - RUN apt-get install -y nodejs # yarn (webpack etc,...) RUN apt remove cmdtest && apt remove yarn RUN curl -sS https://dl.yarnpkg.com/debian/pubkey.gpg | apt-key add - RUN echo "deb https://dl.yarnpkg.com/debian/ stable main" | tee /etc/apt/sources.list.d/yarn.list RUN apt-get update \ && apt-get install -y libldb-dev libldap2-dev \ && ln -s /usr/lib/x86_64-linux-gnu/libldap.so /usr/lib/libldap.so \ && ln -s /usr/lib/x86_64-linux-gnu/liblber.so /usr/lib/liblber.so \ && apt-get install yarn \ && docker-php-ext-install pdo_mysql ldap \ && apt install -y git unzip USER ${UID}:${GID} COPY --from=composer:latest /usr/bin/composer /usr/bin/composer
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む