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

fromから送ったデータがうまくDBに入らない

fromから送ったデータがうまくDBに入らない原因 bladeファイル <form action="{{ route('posts.add') }}" method="POST"> <table> @csrf <tr> <th>タイトル</th> <td> <input type="text" name="title"> </td> </tr> <tr> <th>人数</th> <td>       //数字だけの入力にしたかったのでtype="number"を指定 <input type="number" name="member"> </td> </tr> <table> </form> コントローラー public function add(Request $request){ $param =[ 'title' => $request->title, 'member' => $request->member, ]; DB::table('posts')->insert($param); return redirect('/posts/index'); } データを送ろうとしたら下記のエラーが出た SQLSTATE [23502]: Non-null violation 翻訳すると「データがnullだから違反してるよ」的な感じだった。 多分....。 なぜNULLで送られる? 原因はDBにあった。 public function up() { Schema::create('posts', function (Blueprint $table) { $table->id(); $table->integer('member'); }); } memmberカラムをintegerとしていたためエラーが起きた。 なのでbladeファイルのinputのtypeをtext変更 //numberからtextに変更 <input type="text" name="member"> するとうまくデータが送れた。 原因はまだわからないので明日調べる。 もっとDBを勉強するべきだな... 今日はここまで!
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

DBのカラム削除方法 Laravel

使わないカラム名があったので消した。 消し方 まずマイグレーションを作る $php artisan make:migration drop_column_テーブル名_column --table=テーブル名 出来上がったマイグレーションに消したいカラム名を記載 public function up() { Schema::table('posts', function (Blueprint $table) { //postsテーブルのカラム削除 $table->dropColumn('カラム名'); }); } マイグレーション実行 $php artisan migrate これで消せた!
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

今日PostgreSQLにデータを入れようとしたらエラーが出た

その前に軽くPostgreSQLの操作確認 //postgre起動 $sudo brew services start postgresql //データベース一覧 $psql -l //データベース接続 $psql データベース名 //テーブル一覧 mydb=# \dt; //テーブル接続 mydb=# psql テーブル名 //テーブルの中身確認 mydb=# \d テーブル名 ここからが問題 formで受け取ったデータをDBに入れようとしたらエラーが起きた。 SampleController public function add(Request $request){ $param =[ 'title' => $request->title, 'member' => $request->member, 'grade' => $request->grade, 'message' => $request->message, 'comment' => $request->comment, ];  //テーブル名を指定してinsert()でテーブルに値を格納 DB::table('posts')->insert($param); //リダイレクトでパスを指定 return redirect('/posts/index'); すると Class 'App\Http\Controllers\DB' not found というエラーが出た ただ下記の書き忘れだった...。 use Illuminate\Support\Facades\DB 次から気をつけよう。
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

PHP XML、チェックボックス、半角全角、剰余算

simplexml_load_file 読み込むurlを指定 simplexml_load_file('ここに読み込みたいhttpsのURLを記述'); ---------------------------------------------------------- 例 $xml = simplexml_load_file('https://_____________'); foreach($xml->channel->item as $item): ?> <a href="<?php print($item->link); ?>"><?php print($item->title); ?></a> <?php endforeach; ?> ---------------------------------------------------------- <a href=""></a> リンク先を記述 print($item->link)、print($item->title) これで中身の要素を指定して出力する $xmlや$itemで何を持ってこれているのか、中身の確認をしたい場合 【var_dump】を使用することで確認ができる!!! var_dump($xml); チェックボックス チェックボックスを使用する場合、[]を使用し配列として持っていく! []がないと、配列の中身は空の状態になる! name="reserve[]" ←OK name="reserve" ←NG ーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーー 例 <form action="submit.php" method="post"> <p>希望日</p> <p> <input type="checkbox" name="reserve[]" value="6/5">6月5日<br> <input type="checkbox" name="reserve[]" value="6/6">6月6日<br> <input type="checkbox" name="reserve[]" value="6/7">6月7日<br> </p> <input type="submit" value="送信する"> </form> mb_convert_kana 半角全角 <?php $a = '10'; ここに全角数字を入れた場合 $a = mb_convert_kana($a, 'n', 'UTF-8'); ←半角に変換 if (is_numeric($a)){ print($a.'歳'); }else{ print('年齢が数字ではありません'); } ?> ーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーー 通常は、全角数字では、if文のfalseになるが、 mb_convert_kanaを使用することで、全角数字を【半角】に変換してくれる! 文字の場合は、そのままで扱うえるので便利!!! ページの遷移 Location <?php header('Location: https://_____________'); exit(); // ページの遷移が可能 剰余算 繰り返しを行う 剰余算を使用することで、動きを一定に稼働するよう利用する! %で出たあまりの数字でを使用する! ーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーー 例 <?php $week = array('日','月','火','水','木','金','土'); for($i=0; $i<31; $i++) { print($week[$i%7]. "\n"); ←割り切れると0になり、再度'日'に戻る! } ?>
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

VRChatのログイン監視体制を作る②

概要 以下の記事を参照 本記事について 上記記事にてフレンドのログインを監視するところまで作成しているので、 本記事では通知の種類やサンプルコードを記載します。 メール通知 1つめはメールにて通知を行う方法を紹介します。 今回使用するシステムはSendGridです こちら、クラウドタイプのメール配信サービスで初回会員登録に承認が必要ですが、 無料プランでもある程度の件数のメールを送ることができるサービスです。 今回記載するスクリプトは以下環境にて動作させています。 ----環境---- OS : Linux Apacheバージョン : 2.4.6 PHP       : 7.4.13 今回はcURLを使用してapiをpostする方法でメールを送ります。 ※SendGrid公式ライブラリを使用する場合の方法はSendGrid公式に記載されています sendmail.php <?php $url = 'https://api.sendgrid.com/'; $sendgrid_apikey =SendGridのAPIキー; $mail_address = "送信先のメールアドレス"; $FILE = 'tmp_players.txt'; $BOARD = json_decode(file_get_contents($FILE)); $params = array( 'Authorization: Bearer' => $sendgrid_apikey , 'to' => $mail_address, 'subject' => "監視対象ログイン通知", 'html' => " 以下お友達がログインしました <br /> ".$BOARD. "早く会いに行きましょう", 'from' => 'vrclogintest@monitoring.jp', ); $request = $url.'api/mail.send.json'; if (!defined('CURL_SSLVERSION_TLSv1_2')){ define('CURL_SSLVERSION_TLSv1_2', 6); } // カールリクエストを生成する $session = curl_init($request); // SSLv3を使用しないようにPHPに指示します(代わりにTLSを選択します) curl_setopt($session, CURLOPT_SSLVERSION, CURL_SSLVERSION_TLSv1_2); curl_setopt($session, CURLOPT_HTTPHEADER, array('Authorization: Bearer ' . $sendgrid_apikey)); // CurlにHTTP POSTを使用するように指示します curl_setopt ($session, CURLOPT_POST, true); // これがPOSTの本文であることをcurlに伝えます curl_setopt ($session, CURLOPT_POSTFIELDS, $params); // Curlにヘッダーを返さないように指示しますが、応答を返します curl_setopt($session, CURLOPT_HEADER, false); curl_setopt($session, CURLOPT_RETURNTRANSFER, true); // レスポンスを得る $response = curl_exec($session); curl_close($session); ?> これで、以下メールが送信されます 通知メールが来ることでログインしたことが分かるので早く会いに行きましょう デスクトップ通知 上記メールでの通知ですが、常に監視するためのLinuxサーバーが必要です。 PCを起動していないとログインの通知が来てもすぐにログインはできないので、 常にPCを起動しておく場合はデスクトップに通知を飛ばしたほうがいいですよね。 ということで、次にデスクトップに通知を飛ばす方法を以下にて解説します。 今回はplyerモジュールを使用します。 今回記載するスクリプトは以下環境にて動作させています。 ----環境---- OS : Windows Python : 3.8.8 Anaconda version : 4.10.1 plyer : 2.0.0 notification.py from plyer import notification user_file = open("tmp_players.txt", mode='r',encoding='utf-8') user_data = user_file.read() user_file.close() notification.notify( title = "監視対象ログイン通知", message=user_data + "\nがログインしています\n\n早く会いに行きましょう", timeout=5 ) 上記を実行することで以下通知が飛んできます こちらを一定時間ごとに自動実行することで常にログイン動向を確認することができるので ログイン通知が飛んで来たら早く会いに行きましょう 終わりに これは友達を監視ではなく見守るのための技術紹介記事なので 変なことに使用しないようにしましょう あくまで友達を見守りたい人向けです...
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

論理削除済み&自分自身を除外するuniqueバリデーション

メールアドレスがログインID代わりに使用される場合などは、users内のemailカラムにユニーク制約を付加する必要があります。 加えて登録・更新時のバリデーションにおいても重複する値を弾く必要があるわけですが、Userモデルが論理削除に設定されている場合は、論理削除されたレコードの値は除外するようにルール側で対応する必要があります。 論理削除済みのレコードを除外する 新規ユーザー登録のバリデーションはこう。 'email' => 'required|unique:users,email,,,deleted_at,NULL|max:255|email:rfc,dns', 論理削除に設定する場合は、基本的にdeleted_atカラムがNULLであることや、existカラムに1が入っていることで存在していることを判断することになります。 create_users_table.php ・ ・ $table->boolean('exist')->nullable()->storedAs('case when deleted_at is null then 1 else null end'); ・ ・ $table->unique(['email', 'exist']); ルールにもその条件を書くことで、バリデーション時に「存在しているユーザーのカラム」だけをチェックするようになります。 uniqueルールのパラメータは以下のような構成となっています。 テーブル名(必須) カラム名(必須) 除外する値 除外するカラム 追加でチェックするカラム(例ではdeleted_atカラム) 値の条件(例ではNULL) 新規登録時は3,4番目を空欄にし、追加条件の部分で「deleted_atがNULLであること」を指定しています。 同一ユーザーのレコードを除外する ユーザー情報更新画面があったとして、email以外の部分を更新しようとした場合。 そのままだと自分自身のemailと重複していると見做され、バリデーションエラーとなって更新できません。 ログイン後にアクセスするそうした画面においては、Authファサード等でユーザーIDを取得し、それを除外します。 UpdateRequest.php use Illuminate\Support\Facades\Auth; ・ ・ ・ $id = Auth::id(); return [ 'email' => 'required|unique:users,email,'. $id .',id,deleted_at,NULL|max:255|email', user/3/editなどのURLであれば、ルートでID部分を変数化し、Requestクラス内で受け取ることも可能です。 web.php Route::post('/user/{id}/edit', [UserController::class, 'update']); UpdateRequest.php use Illuminate\Support\Facades\Auth; ・ ・ ・ return [ 'email' => 'required|unique:users,email,'. $this->id .',id,deleted_at,NULL|max:255|email', これによって、「更新対象ユーザーを除いたユーザー」かつ「有効なユーザー」のレコードとのみ比較するように設定できます。
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

電話番号のハイフンあり・なしを両方許容するバリデーション

コピペ元はこちらです。 https://hacknote.jp/archives/22518/ XXXXRequest.php return [ // 電話番号のバリデーション 'tel_number' => '・・・|regex:/^(0{1}\d{1,4}-{0,1}\d{1,4}-{0,1}\d{4})$/', ] ワタシ正規表現ゼンゼンワカラナイ。 コピペだけではアレなので、調べながらなんとか読んでみます。(間違ってたら指摘してください) 市外局番部分 '^(0{1}\d{1,4}' 「行頭は0一文字固定の1~4桁の数列」 ^は行頭にマッチする。 {n} は、直前の文字をn回繰り返す。 \dは「0~9までの数字」というパターンの省略形。 それが1~4回繰り返される。 ハイフン '-{0,1}' ハイフンが0~1回繰り返される、つまりあってもなくてもいい。 市内局番部分 '\d{1,4}' 0~9までの数字が1~4回。 加入者番号 '\d{4})' 0~9までの数字が4回。 ここまでのすべてを()で囲って、ひとつのグループとする。
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

macOS XAMPPを用いてWordPressのローカル開発環境を整える

目的 レンタルサーバでよく使われている PHP7.4 のローカル開発環境をつくる M1マックで爆速でWordPressを使いたい(これだよ!) 遅いレンタルサーバを使ってネット経由でサイトのデバッグしたくない(切実) 環境構築を優先し、セキュリティは緩く設定する(使い勝手を最優先) XAMPPの最新版を使ってみる(インストールが簡単そう) WordPressの最新版を使う(なんでも最新) 概要 XAMPPのインストール ApacheとMySQLとProFTPDの起動 電源再投入時にXAMPPを起動する PHPMyAdminを使ってDB設定 WordPressインストール DBとの連携 作業 XAMPPのインストール https://www.apachefriends.org/download.html にて PHP7.4 の最新版をダウンロードする。 7.4.19 / PHP 7.4.19 Download (64 bit) 161 Mbをクリックする。 Downloadフォルダを開き、ダウンロードしたインストーラ「xampp-osx-7.4.19-0-installer.dmg」を開く。 ウインドウが開いたらXAMPPのアイコンをドラックしてアプリケーションフォルダに移動する。 アプリケーションフォルダを開き、XAMPPのアイコンをクリックして起動 なぜかXAMPP Core Filesがチェックされていないので、チェックする。 アプリケーションフォルダにXAMPPフォルダを別に作りインストールする。 ウェブに誘導される Learn more abort Bitnami for XAMPPのチェックボックスを外す インストールを始める。 圧縮解凍を始める。 途中です。 終わったのでFinishボタンを押す。 ウェルカム画面出る。旧XAMPPと比べシンプルすぎる。。。これは何かある。。。 Apacheだけ動いていることを確認 プロセス3つとも動かす イベントログを確認する ブラウザを確認する。アクセス先は「localhost」「127.0.0.1」でも大丈夫。 ブラウザ上部のPHPinfoタブを押してみる。 ブラウザ上部のphpMyAdminタブを押してみる。 この位は。。。できて当然だ。。。ここから先が大問題。。。
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

macOS XAMPPを用いてWordPressのローカル開発環境をつくる

目的 レンタルサーバでよく使われている PHP7.4 のローカル開発環境をつくる M1マックで爆速でWordPressを使いたい(これだよ!) 遅いレンタルサーバを使ってネット経由でサイトのデバッグしたくない(切実) 環境構築を優先し、セキュリティは緩く設定する(使い勝手を最優先) XAMPPの最新版を使ってみる(インストールが簡単そう) WordPressの最新版を使う(なんでも最新) 概要 XAMPPのインストール ApacheとMySQLとProFTPDの起動 電源再投入時にXAMPPを起動する PHPMyAdminを使ってDB設定 WordPressインストール DBとの連携 XAMPPのインストール https://www.apachefriends.org/download.html にて PHP7.4 の最新版をダウンロードする。7.4の最新版の7.4.19 / PHP 7.4.19 Download (64 bit) 161 Mbをクリック。 Downloadフォルダを開き、ダウンロードしたインストーラ「xampp-osx-7.4.19-0-installer.dmg」を開く。 ウインドウが開いたらXAMPPのアイコンをドラックしてアプリケーションフォルダにコピーする。 アプリケーションフォルダを開き、XAMPPのアイコンをクリックして起動 なぜかXAMPP Core Filesがチェックされていないので、チェックする。 アプリケーションフォルダにXAMPPフォルダを別に作りインストールする。 ウェブに誘導される Learn more abort Bitnami for XAMPPのチェックボックスを外す インストールを始める。 圧縮解凍を始める。 途中です。 終わったのでFinishボタンを押す。 ApacheとMySQLとProFTPDの起動 ウェルカム画面出る。旧XAMPPと比べシンプルすぎる。。。これは何かある。。。 Apacheだけ動いていることを確認 プロセス3つとも動かす イベントログを確認する ブラウザを確認する。アクセス先は「localhost」「127.0.0.1」でも大丈夫。 ブラウザ上部のPHPInfoタブを押してみる。 ブラウザ上部のphpMyAdminタブを押してみる。 この位は。。。できて当然だ。。。ここから先が大問題。。。 電源再投入時にXAMPPを起動する HOW-TO-Guidesを見る ページごとグーグル翻訳をかける。一番下の「XAMPPの自動起動」が大事です。 「XAMPPの自動起動 デフォルトでは、システムを再起動するたびに XAMPP またはそのコンポーネントを手動で起動する必要があります。ただし、システムの起動時に XAMPP コンポーネントが自動的に起動するように構成することもできます。」こりゃ面倒なことが書かれている。でも、しょうがない。 ターミナルを起動します。ここからターミナル慣れしてない人は。。。諦めて。。。ください。。。残念。。。 cd /Library/LaunchDaemons sudo vi org.apachefriends.xampp.plist iを入力した後。。。以下をペーストします。 <?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd"> <plist version="1.0"> <dict> <key>Label</key> <string>org.apachefriends.xampp</string> <key>ProgramArguments</key> <array> <string>/Applications/XAMPP/xamppfiles/xampp</string> <string>start</string> </array> <key>UserName</key> <string>root</string> <key>RunAtLoad</key> <true/> <key>OnDemand</key> <false/> </dict> </plist> ESCキー2回、シフトキー+ZZで保存します。 ls more org.apachefriends.xampp.plist にてちゃんとファイルが作成されていることを確認しましょう。パソコンを再起動します。 ブラウザに「localhost」と入力して動作を確認しましょう。ここで一旦コーヒーブレークしましょうね。疲れたと思います。 PHPMyAdminを使ってDB設定 だんだんと難しくなってきました。。。でも、がんばるしかないです。 まずは、ブラウザから「localhost」を入力して、見慣れた画面を出します。右上のphpMyAdminタブを押してみましょう。 この画面は、重要な情報が示されています。データベースとして既に5つ作られていること。文字情報は、UTF-8 Unicode (utf8mb4)が選択されていること。そして、一番大事なこと、データベースの所有者が「root@localhost」であることです。ユーザ名がrootであり、データベースのホストマシンがlocalhostであることを示します。いいですか。これは重要なことです。理解してない人は、ここから先にはすすめません。ブラウザを閉じましょう。さようならぁ〜 いじくっていると重要な情報をみたくなることがあります。その時は、左上のここを押しましょう。また見られます。ふー。 WordPressインストール DBとの連携
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

var_dump()の内容をファイル出力する

メモ dump.php $file="out.txt" ob_start(); var_dump('内容'); $dump = ob_get_contents(); ob_end_clean(); file_put_contents($file, $dump);
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

プロジェクト型演習 #3 (DB作成, web画面)

本番環境の構築 実際にシステムで使用するDBを作成する。 前提として プロジェクト型演習 #1 (raspberrypi DB操作) 実装済み、更に Apache2 をインストール済みののRaspberry Pi を利用しているものとして話を進める。 今回は、本番用DBを作成し、Web画面で確認するところまでやってみる。 DB構築 ログイン 面倒なので、以前作成したユーザ, DBを使い回す。 ユーザでログイン pi@raspberry:~ $ sudo mysql -upi -praspberry DBへ入る MariaDB[(none)]> use sample_db Database changed 各種テーブルの作成 ※下記SQL文をそのままコピペでおけ。詳しくは #1 を参照。 スコアテーブルの作成 CREATE TABLE `score` ( `num` int(32) NOT NULL AUTO_INCREMENT, `id` int(4) NOT NULL, `score` int(8) NOT NULL, `great` int(4) NOT NULL, `good` int(4) NOT NULL, `bad` int(4) NOT NULL, `datetime` DATETIME NOT NULL, PRIMARY KEY (`num`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8; 楽曲テーブルの作成 CREATE TABLE `music` ( `id` int(4) NOT NULL AUTO_INCREMENT, `name` varchar(512) NOT NULL, `max` int(8) NOT NULL, PRIMARY KEY (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8; 楽曲テーブルにデータを挿入 INSERT INTO `music` (`name`, `max`) VALUES ("ピタゴラスイッチ", 100), ("きらきら星", 200); スコアテーブルにデータを挿入 INSERT INTO `score` (`id`, `score`, `great`, `good`, `bad`, `datetime`) VALUES (1, 100, 25, 50, 0, '2021-06-04 21:45:31'); WEB画面 (PHP) TOPページ 今後修正予定だが、雑に作っておく。 以下の全ファイルを/var/www/html/内に配置。index.phpは前回作成したものを修正する。 pi@raspberry:~ $ cd /var/www/html pi@raspberry:/var/www/html $ nano index.php TOP index.php <?php $title = "認知症予防システム"; require('./header.php'); $page = "home"; ?> <h1 class="mx-auto" style="width: 200px; font-family: ヒラギノ丸ゴ ProN W4;">スコア表</h1> <table class="table"> <thead class="table-light" style="background-color: #008b8b;"> <th>日付</th> <th>曲名</th> <th>スコア</th> <th>GREAT</th> <th>GOOD</th> <th>BAD</th> <th>%</th> </thead> <?php ini_set('display_errors', "On"); //phpinfo(); include "./pdo_connect.php"; $sql = "SELECT * FROM score JOIN music WHERE score.id = music.id ORDER BY score.datetime DESC"; $stmt = $pdo -> query($sql); foreach($stmt as $row){ ?> <tbody id = "<?=$row['num']?>"> <td><?=date('Y年m月d日 H:i',strtotime($row['datetime']))?></td> <td><?=$row['name']?></td> <td><?=$row['score']?></td> <td><?=$row['great']?></td> <td><?=$row['good']?></td> <td><?=$row['bad']?></td> <td><?=($row['score'] / $row['max']) * 100?></td> </tbody> <?php } ?> </table> <?php require('./footer.php'); ?> ヘッダーファイル pi@raspberry:/var/www/html $ nano header.php ヘッダーファイル header.php <!DOCTYPE html> <html lang='ja'> <head> <meta charset='utf-8' /> <link rel="stylesheet" href="https://stackpath.bootstrapcdn.com/bootstrap/4.3.1/css/bootstrap.min.css" integrity="sha384-ggOyR0iXCbMQv3Xipma34MD+dH/1fQ784/j6cY/iJTQUOhcWr7x9JvoRxT2MZw1T" crossorigin="anonymous"> <script src="https://code.jquery.com/jquery-3.3.1.slim.min.js" integrity="sha384-q8i/X+965DzO0rT7abK41JStQIAqVgRVzpbzo5smXKp4YfRvH+8abtTE1Pi6jizo" crossorigin="anonymous"></script> <script src="https://cdnjs.cloudflare.com/ajax/libs/popper.js/1.14.7/umd/popper.min.js" integrity="sha384-UO2eT0CpHqdSJQ6hJty5KVphtPhzWj9WO1clHTMGa3JDZwrnQq4sF86dIHNDz0W1" crossorigin="anonymous"></script> <script src="https://stackpath.bootstrapcdn.com/bootstrap/4.3.1/js/bootstrap.min.js" integrity="sha384-JjSmVgyd0p3pXB1rRibZUAYoIIy6OrQ6VrjIEaFf/nJGzIxFDsf4x0xIM+B07jRM" crossorigin="anonymous"></script> <title><?=$title?></title> <link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/fullcalendar@5.5.0/main.min.css"> <script src="https://cdn.jsdelivr.net/npm/fullcalendar@5.5.0/main.min.js"></script> </head> <body> <nav class="navbar navbar-dark mb-5" style="background-color: #008080;"> <a class="navbar-brand" href="./index.php">認知症予防システム</a> <button class="navbar-toggler" type="button" data-toggle="collapse" data-target="#navbarNavAltMarkup" aria-controls="navbarNavAltMarkup" aria-expanded="false" aria-label="Toggle navigation"> <span class="navbar-toggler-icon"></span> </button> <div class="collapse navbar-collapse" id="navbarNavAltMarkup"> <div class="navbar-nav"> <a id="home" class="nav-item nav-link" href="./index.php">Home <span class="sr-only">(current)</span></a> <a id="calendar" class="nav-item nav-link" href="./calendar.php">Calendar</a> <a id="graph" class="nav-item nav-link" href="./graph.php">Graph</a> </div> </div> </nav> <div class="container w-80"> フッターファイル pi@raspberry:/var/www/html $ nano footer.php フッターファイル footer.php </div> </body> </html> <script> const div = document.getElementById("<?=$page?>"); div.classList.add('active'); </script> カレンダー pi@raspberry:/var/www/html $ nano calendar.php カレンダー calendar.php <?php $title = "カレンダー"; require('./header.php'); $page = "calendar"; ?> <div id='calendar-box'></div> <?php require('./footer.php'); ?> <script> document.addEventListener('DOMContentLoaded', function() { var calendarEl = document.getElementById('calendar-box'); var calendar = new FullCalendar.Calendar(calendarEl, { initialView: 'dayGridMonth', events: [ <?php include "./pdo_connect.php"; $sql = "SELECT * FROM score JOIN music WHERE score.id = music.id"; $stmt = $pdo -> query($sql); foreach($stmt as $row){ ?> { id: '<?=$row['num']?>', title: '<?=$row['name']." ".$row['score']?>', start: '<?=date('Y-m-d',strtotime($row['datetime']))?>', url: './index.php#<?=$row['num']?>' }, <?php } ?> ], // 日本語化 locale: 'ja', buttonText: { prev: '<', next: '>', prevYear: '<<', nextYear: '>>', today: '今日', month: '月', week: '週', day: '日', list: '一覧' }, }); calendar.render(); }); </script> グラフ pi@raspberry:/var/www/html $ nano graph.php グラフ graph.php <?php $title = "グラフ"; require('./header.php'); $page = "graph"; $labels = []; $datetime_list = []; for ($i = 6; $i >= 0; $i--) { $m = (int)date("m", strtotime("-"."$i"." day")); $d = (int)date("d", strtotime("-"."$i"." day")); $labels[] = $m."月".$d."日"; $datetime_list[] = date("Y-m-d", strtotime("-"."$i"." day")); } $start = date("Y-m-d", strtotime("-6 day")); $start .= " 00:00:00"; $end = date("Y-m-d", strtotime("-0 day")); $end .= " 99:99:99"; include "./pdo_connect.php"; $sql = "SELECT * FROM score JOIN music WHERE score.id = music.id AND score.datetime BETWEEN '$start' AND '$end'"; $stmt = $pdo -> query($sql); $cnt = 0; $max_list = [0, 0, 0, 0, 0, 0, 0]; $min_list = [200, 200, 200, 200, 200, 200, 200]; foreach($stmt as $row){ for ($i = $cnt; $i < 7; $i++) { if ($datetime_list[$i]." 00:00:00" <= $row['datetime'] && $row['datetime'] <= $datetime_list[$i]." 99:99:99") { if ($max_list[$cnt] < ($row['score'] / $row['max']) * 100) { $max_list[$cnt] = ($row['score'] / $row['max']) * 100; } if ($min_list[$cnt] > ($row['score'] / $row['max']) * 100) { $min_list[$cnt] = ($row['score'] / $row['max']) * 100; } break; } else { $cnt ++; } } } for ($i = 0; $i < 7; $i++) { if ($min_list[$i] == 200) { $min_list[$i] = 0; } } ?> <h1>折れ線グラフ</h1> <canvas id="myLineChart"></canvas> <script src="https://cdnjs.cloudflare.com/ajax/libs/Chart.js/2.7.2/Chart.bundle.js"></script> <script> var ctx = document.getElementById("myLineChart"); var myLineChart = new Chart(ctx, { type: 'line', data: { labels: ['<?=$labels[0]?>', '<?=$labels[1]?>', '<?=$labels[2]?>', '<?=$labels[3]?>', '<?=$labels[4]?>', '<?=$labels[5]?>', '<?=$labels[6]?>'], datasets: [ { label: '最高得点率(%)', data: [<?=$max_list[0]?>, <?=$max_list[1]?>, <?=$max_list[2]?>, <?=$max_list[3]?>, <?=$max_list[4]?>, <?=$max_list[5]?>, <?=$max_list[6]?>], borderColor: "rgba(255,0,0,1)", backgroundColor: "rgba(0,0,0,0)" }, { label: '最低得点率(%)', data: [<?=$min_list[0]?>, <?=$min_list[1]?>, <?=$min_list[2]?>, <?=$min_list[3]?>, <?=$min_list[4]?>, <?=$min_list[5]?>, <?=$min_list[6]?>], borderColor: "rgba(0,0,255,1)", backgroundColor: "rgba(0,0,0,0)" } ], }, options: { title: { display: true, text: '得点率(<?=$labels[0]?> ~ <?=$labels[6]?>)' }, scales: { yAxes: [{ ticks: { suggestedMax: 100, suggestedMin: 0, stepSize: 10, callback: function(value, index, values){ return value + '%' } } }] }, } }); </script> <?php require('./footer.php'); ?> DB接続ファイル pi@raspberry:/var/www/html $ nano pdo_connect.php DB接続ファイル pdo_connect.php <?php //データベースの接続と選択 $hostdbname = 'mysql:host=localhost;dbname=sample_db;charset=UTF8'; $username = "pi"; $password = "raspberry"; $pdo = new PDO($hostdbname, $username, $password); $pdo -> setAttribute(PDO::ATTR_ERRMODE,PDO::ERRMODE_EXCEPTION); ?> 実行 TOPページの確認 カレンダーページの確認 グラフページの確認 おそらくこんな感じでできるはず、、、 ※この画像はPC上にDockerで環境構築したものを使用している為、実際とは異なる。 今後 TOPページの装飾 検索機能やランキング、ソートなんかの実装(余力あれば)
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

webpush:vapidでのopenssl_pkey_new()のエラー

プログラミング初心者です。 WebPushをLaravel(5.8)で実装したい過程で、 php artisan webpush:vapid 実行したら ErrorException : openssl_pkey_new(): private key length is too short; it needs to be at least 384 bits, not 0 vendor/web-token/jwt-core/Util/ECKey.php:157 $key = openssl_pkey_new([ 156| 'curve_name' => self::getOpensslCurveName($curve), > 157| 'private_key_type' => OPENSSL_KEYTYPE_EC, 158| ]); というエラーが出ました。 エラー文検索しても解決できず、メンターさんと1時間以上格闘しましたが、それでも解決できませんでした。 「メンターさんが解決できなかったら私にできるわけないだろうと」諦めかけてました。 でもvapid作成できなきゃ進まないため、検索してったらこのサイトを見つけました。 bitsが関係してるだろうから、エラーが出てる場所のECKey.phpの$key = openssl_pkey_new([]);の[ ]中にこれを入力してみたら・・・ "private_key_bits" => 2048, まさかの VAPID keys set successfully. 衝撃すぎて、体が飛び起きました。 ちなみにマニュアルサイトにある OPENSSL_KEYTYPE_RSAではダメでOPENSSL_KEYTYPE_ECじゃないと ErrorException : Undefined index: ec というエラーが出ちゃいました。返されるキーのデータが違うみたいですよ(正直違いよくわかりません)。
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む