20220115のPHPに関する記事は8件です。

Zoomのブレイクアウトルームってダサくない??

はじめに 私は現在大学4回生で論文のための実験をしているのですが、このご時世のため実験もオンラインで行うことになりました。 私の実験ではGoogle Formを使って協力者に動画の視聴→アンケート→テストという流れを2回繰り返すことでした。(下図が実験の流れ) 私は実験の協力者を募るため、教授の力を借り、Zoomでのオンライン授業で募集することになりました。 ここで問題が発生です。 上記の場合、Google FormのURLが4つあります。 どうやって4つのURLを均等に協力者に振り分けようかと私は思いました。 4つブレイクアウトルームに分かれてそれぞれに異なるリンクを貼る。→ 私がルーム毎に入退室を行う必要がある。時間がかかる。めんどくさい。 学籍番号を4で割った余り、学籍番号の下1桁でURLを指定する。 → 出席者の学籍番号は十中八九連番にはなっていなので、均等にならない。 4つのブレイクアウトルームに分かれてルームの番号を覚えてもらい、メインルームに戻り、その番号ごとにURLを指定する。 → ダサい!!!!そもそもブレイクアウトルームから戻ってこなさそう。 とりあえず私はブレイクアウトルームを断固として使いたくない!!! そこで私は何個か案を考えてみました。 ランダムジャンプするURLを貼る 実際に作った例 : https://tomomon.jp/programming/random_jump/ javascriptを使って作成する。 index.html <!DOCTYPE html> <html lang="ja"> <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8"> <meta http-equiv="Content-Script-Type" content="text/javascript"> <title>ランダムジャンプ</title> <script type="text/javascript"> <!-- var mylink = new Array( "https://www.youtube.com/watch?v=vLV0UZ308bQ&t=155s", "https://tomomon.jp/travel/my_secret_place/", "https://tomomon.jp/travel/travel_ranking/", "https://tomomon.jp/programming/ksnctf5/" ); function random_jump() { var i = Math.floor(Math.random() * mylink.length); location.href = mylink[i]; } // --> </script> </head> <body> <a href="javascript:random_jump();">ランダムに移動します</a> </body> </html> だだし、これは無作為にリンク先に飛ばされるので、偏る可能性がある。 また、新しいタブで開くとabout:blank#blockedとなってしまう。(Google Chromeの場合) 訪問順に異なるリンク先に移動させる アクセスカウンターの作成 とりあえず訪問者数を得たいので、アクセスカウンターを作成する。 実際に作った例 : https://tomomon.jp/programming/access_counter/ まず,訪問者数を格納する count.dat を作成する。 ディレクトリは下記の感じ。 % tree . . ├── count.dat └── index.php count.dat には初期値0を入れておく。 count.dat 0 index.php <?php //カウント数が記録してあるファイルを読み書きできるモードで開く $fp = fopen('count.dat', 'r+b'); //ファイルを排他ロックする flock($fp, LOCK_EX); //ファイルからカウント数を取得する $count = fgets($fp); //カウント数を1増やす $count++; ?> <!DOCTYPE html> <html lang="ja"> <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8"> <title>アクセスカウンター</title> </head> <body> <div class="counter-area"> <!-- ファイルから取得したカウント数を表示する --> <p>あなたは<span class="access-count"><?php echo $count;?>番目</span>の訪問者です</p> </div> </body> </html> <?php //ポインターをファイルの先頭に戻す rewind($fp); //最新のアクセス数をファイルに書き込む fwrite($fp, $count); //ファイルのロックを解除する flock($fp, LOCK_UN); //ファイルを閉じる fclose($fp); ?> 訪問者を訪問者数でグループに分ける。 訪問順に4つのリンクを順にアクセスするよう誘導する。 訪問者数を4で割った余って+1した番号のリンクを選ばせる。 index.php <?php //カウント数が記録してあるファイルを読み書きできるモードで開く $fp = fopen('count.dat', 'r+b'); //ファイルを排他ロックする flock($fp, LOCK_EX); //ファイルからカウント数を取得する $count = fgets($fp); //カウント数を1増やす $count++; ?> <!DOCTYPE html> <html lang="ja"> <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8"> <title>アクセスカウンター</title> </head> <body> <div class="counter-area"> <!-- ファイルから取得したカウント数を表示する --> <p><span class="access-count">Link<?php echo $count%4+1 ;?></span>をクリックしなさい。</p> </div> <ul class="links"> <li><a href="https://www.youtube.com/watch?v=vLV0UZ308bQ&t=155s">Link1</a> <li><a href="https://tomomon.jp/travel/my_secret_place/">Link2</a> <li><a href="https://tomomon.jp/travel/travel_ranking/"> Link3</a> <li><a href="https://tomomon.jp/programming/ksnctf5/">Link4</a> </ul> </body> </html> <?php //ポインターをファイルの先頭に戻す rewind($fp); //最新のアクセス数をファイルに書き込む fwrite($fp, $count); //ファイルのロックを解除する flock($fp, LOCK_UN); //ファイルを閉じる fclose($fp); ?> 表示されている4つのリンクから選んでクリックするのがダサいし面倒。間違えてクリックする可能性もある。 上記を組み合わせる 上記のアクセスカウンターを使って、ランダムアクセスを改良する。 アクセスjavascriptで書いたurlを格納した配列から訪問者数を4で割った余りを引数として、リンク先のURLを指定する。 index.html <?php //カウント数が記録してあるファイルを読み書きできるモードで開く $fp = fopen('count.dat', 'r+b'); //ファイルを排他ロックする flock($fp, LOCK_EX); //ファイルからカウント数を取得する $count = fgets($fp); //カウント数を1増やす $count++; ?> <!DOCTYPE html> <html lang="ja"> <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8"> <meta http-equiv="Content-Script-Type" content="text/javascript"> <title>ランダムジャンプ2</title> <script type="text/javascript"> <!-- var mylink = new Array( "https://www.youtube.com/watch?v=vLV0UZ308bQ&t=155s", "https://tomomon.jp/travel/my_secret_place/", "https://tomomon.jp/travel/travel_ranking/", "https://tomomon.jp/programming/ksnctf5/" ); function divide_links(num) { location.href = mylink[num]; } // --> </script> </head> <body> <div class="link"> <!-- ファイルから取得したカウント数を表示する --> <a href="javascript:divide_links(<?php echo $count%4 ;?>);">ここをクリックしてください。</a> </div> </body> </html> <?php //ポインターをファイルの先頭に戻す rewind($fp); //最新のアクセス数をファイルに書き込む fwrite($fp, $count); //ファイルのロックを解除する flock($fp, LOCK_UN); //ファイルを閉じる fclose($fp); ?> 以下が実際に実装したもの。 これで均等にリンク先が訪問順に決定する。 また、クリックするところが一つしかないので、間違えることがなくなった。 最後に ブレイクアウトルームを使わずに済んだのですが、リンク先のURLをクリックさせるために一度HPを経由する必要があるのが少し気になります。リダイレクトを設定したらいいのかな? 普段、全くJavaScriptやPHPを触らないので、もっといい方法、間違っていることがあったら教えてください。
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

Zoomのブレイクアウトルームってダサくない??

はじめに 私は現在大学4回生で論文のための実験をしているのですが、このご時世のため実験もオンラインで行うことになりました。 私の実験ではGoogle Formを使って協力者に動画の視聴→アンケート→テストという流れを2回繰り返すことでした。(下図が実験の流れ) 私は実験の協力者を募るため、教授の力を借り、Zoomでのオンライン授業で募集することになりました。 ここで問題が発生です。 上記の場合、Google FormのURLが4つあります。 どうやって4つのURLを均等に協力者に振り分けようかと私は思いました。 4つブレイクアウトルームに分かれてそれぞれに異なるリンクを貼る。→ 私がルーム毎に入退室を行う必要がある。時間がかかる。めんどくさい。 学籍番号を4で割った余り、学籍番号の下1桁でURLを指定する。 → 出席者の学籍番号は十中八九連番にはなっていなので、均等にならない。 4つのブレイクアウトルームに分かれてルームの番号を覚えてもらい、メインルームに戻り、その番号ごとにURLを指定する。 → ダサい!!!!そもそもブレイクアウトルームから戻ってこなさそう。 とりあえず私はブレイクアウトルームを断固として使いたくない!!! そこで私は何個か案を考えてみました。 ランダムジャンプするURLを貼る 実際に作った例 : https://tomomon.jp/programming/random_jump/ javascriptを使って作成する。 index.html <!DOCTYPE html> <html lang="ja"> <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8"> <meta http-equiv="Content-Script-Type" content="text/javascript"> <title>ランダムジャンプ</title> <script type="text/javascript"> <!-- var mylink = new Array( "https://www.youtube.com/watch?v=vLV0UZ308bQ&t=155s", "https://tomomon.jp/travel/my_secret_place/", "https://tomomon.jp/travel/travel_ranking/", "https://tomomon.jp/programming/ksnctf5/" ); function random_jump() { var i = Math.floor(Math.random() * mylink.length); location.href = mylink[i]; } // --> </script> </head> <body> <a href="javascript:random_jump();">ランダムに移動します</a> </body> </html> だだし、これは無作為にリンク先に飛ばされるので、偏る可能性がある。 また、新しいタブで開くとabout:blank#blockedとなってしまう。(Google Chromeの場合) 訪問順に異なるリンク先に移動させる アクセスカウンターの作成 とりあえず訪問者数を得たいので、アクセスカウンターを作成する。 実際に作った例 : https://tomomon.jp/programming/access_counter/ まず,訪問者数を格納する count.dat を作成する。 ディレクトリは下記の感じ。 % tree . . ├── count.dat └── index.php count.dat には初期値0を入れておく。 count.dat 0 index.php <?php //カウント数が記録してあるファイルを読み書きできるモードで開く $fp = fopen('count.dat', 'r+b'); //ファイルを排他ロックする flock($fp, LOCK_EX); //ファイルからカウント数を取得する $count = fgets($fp); //カウント数を1増やす $count++; ?> <!DOCTYPE html> <html lang="ja"> <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8"> <title>アクセスカウンター</title> </head> <body> <div class="counter-area"> <!-- ファイルから取得したカウント数を表示する --> <p>あなたは<span class="access-count"><?php echo $count;?>番目</span>の訪問者です</p> </div> </body> </html> <?php //ポインターをファイルの先頭に戻す rewind($fp); //最新のアクセス数をファイルに書き込む fwrite($fp, $count); //ファイルのロックを解除する flock($fp, LOCK_UN); //ファイルを閉じる fclose($fp); ?> 訪問者を訪問者数でグループに分ける。 訪問順に4つのリンクを順にアクセスするよう誘導する。 訪問者数を4で割った余って+1した番号のリンクを選ばせる。 index.php <?php //カウント数が記録してあるファイルを読み書きできるモードで開く $fp = fopen('count.dat', 'r+b'); //ファイルを排他ロックする flock($fp, LOCK_EX); //ファイルからカウント数を取得する $count = fgets($fp); //カウント数を1増やす $count++; ?> <!DOCTYPE html> <html lang="ja"> <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8"> <title>アクセスカウンター</title> </head> <body> <div class="counter-area"> <!-- ファイルから取得したカウント数を表示する --> <p><span class="access-count">Link<?php echo $count%4+1 ;?></span>をクリックしなさい。</p> </div> <ul class="links"> <li><a href="https://www.youtube.com/watch?v=vLV0UZ308bQ&t=155s">Link1</a> <li><a href="https://tomomon.jp/travel/my_secret_place/">Link2</a> <li><a href="https://tomomon.jp/travel/travel_ranking/"> Link3</a> <li><a href="https://tomomon.jp/programming/ksnctf5/">Link4</a> </ul> </body> </html> <?php //ポインターをファイルの先頭に戻す rewind($fp); //最新のアクセス数をファイルに書き込む fwrite($fp, $count); //ファイルのロックを解除する flock($fp, LOCK_UN); //ファイルを閉じる fclose($fp); ?> 表示されている4つのリンクから選んでクリックするのがダサいし面倒。間違えてクリックする可能性もある。 上記を組み合わせる 上記のアクセスカウンターを使って、ランダムアクセスを改良する。 アクセスjavascriptで書いたurlを格納した配列から訪問者数を4で割った余りを引数として、リンク先のURLを指定する。 index.html <?php //カウント数が記録してあるファイルを読み書きできるモードで開く $fp = fopen('count.dat', 'r+b'); //ファイルを排他ロックする flock($fp, LOCK_EX); //ファイルからカウント数を取得する $count = fgets($fp); //カウント数を1増やす $count++; ?> <!DOCTYPE html> <html lang="ja"> <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8"> <meta http-equiv="Content-Script-Type" content="text/javascript"> <title>ランダムジャンプ2</title> <script type="text/javascript"> <!-- var mylink = new Array( "https://www.youtube.com/watch?v=vLV0UZ308bQ&t=155s", "https://tomomon.jp/travel/my_secret_place/", "https://tomomon.jp/travel/travel_ranking/", "https://tomomon.jp/programming/ksnctf5/" ); function divide_links(num) { location.href = mylink[num]; } // --> </script> </head> <body> <div class="link"> <!-- ファイルから取得したカウント数を表示する --> <a href="javascript:divide_links(<?php echo $count%4 ;?>);">ここをクリックしてください。</a> </div> </body> </html> <?php //ポインターをファイルの先頭に戻す rewind($fp); //最新のアクセス数をファイルに書き込む fwrite($fp, $count); //ファイルのロックを解除する flock($fp, LOCK_UN); //ファイルを閉じる fclose($fp); ?> 以下が実際に実装したもの。 これで均等にリンク先が訪問順に決定する。 また、クリックするところが一つしかないので、間違えることがなくなった。 最後に ブレイクアウトルームを使わずに済んだのですが、リンク先のURLをクリックさせるために一度HPを経由する必要があるのが少し気になります。リダイレクトを設定したらいいのかな? 普段、全くJavaScriptやPHPを触らないので、もっといい方法、間違っていることがあったら教えてください。
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

【HTML】【PHP】<input type="date">で取得した日付フォーマットの変更の仕方について

背景 カレンダーを作成中、予定を入力したときにカレンダー内に表示させようとしたところ、日付のフォーマットが違ってif文が働かなかったので、同じところで悩まないように備忘録兼ねて作成 やりたかったこと 日付を取得するフォーム <!DOCTYPE html> <html lang="ja"> <head> <meta charset="UTF-8"> <title>Document</title> </head> <body> <form action="" method="post"> <input type="date" name="day"> <button type="submit">送信</button> </form> </body> </html> <?php if($_SERVER['REQUEST_METHOD'] === 'POST'){ echo $_POST['day']; ?> このフォームに入力された日付は、デフォルトでyyyy-mm-ddの形式で表示される。 つまり2022年1月1日を選択して送信すると、2022-01-01と表示される。(ここでは$_POSTで取得していますが、filter_input()などを使う方が良いです。) やりたかったのは、この日付表示を別の形式に直して、if文などで使いやすくすること。(自分はY-n-j、つまり2022-01-01表示を2022-1-1表示にしたかった。) date関数 yyyy-mm-dd以外のフォーマットで日付が欲しいときは、date()を使用してフォーマットを整えてあげる必要がある。 date関数 <?php date(変換後のフォーマット, タイムスタンプ(無くてもいい)); ?> 第1引数には、変換後のフォーマット文字列 第2引数には、タイムスタンプ(書かない場合は、現在時刻が使用される) ※ タイムスタンプ:正確にはUNIXタイムスタンプと言うらしい。協定世界時(UTC)での1970年1月1日0時0分0秒からの経過時間を秒数で表したもの。つまり、これを書かないと、1970年1月1日0時0分0秒から現在時刻までの秒数が自動的に第2引数になる。 と言うことで、date関数を使用して2022-1-1と表示させるため下記のように入力すると、エラーが発生する。 date関数 <?php $day = $_POST['day']; echo date("Y-n-j", $day); ?> いろいろ書いてあるが、要はdate()の第2引数の型はintegerでなければならないですよ、と言うことである。 inputタグのtype属性の値dateで取得した日付は、string型になっているため、上記のように直接第2引数とはできずエラー発生となった。 input type="date"のドキュメント strtotime関数 取得した日付をint型にするためにstrtotime()を使用する。 strtotime関数 <?php strtotime(変換したい日付の文字列, ベースタイムスタンプ(無くてもいい)); ?> 第1引数には、変換したい日付/時刻の文字列 第2引数には、返される値を計算するために使用されるベースタイムスタンプ(書かない場合は、現在時刻が使用される。例えば1日前の日付を取得する際なんかは、ここに'-01'を入れたりする。) 長々書いてきたが、要はフォーマットを変えたければ <?php $day = $_POST['day']; echo date("Y-n-j", strtotime($day)); ?> としてあげれば良い。 以下、2022-01-01を変換した一例 <!DOCTYPE html> <html lang="ja"> <head> <meta charset="UTF-8"> <title>Document</title> </head> <body> <form action="" method="post"> <input type="date" name="day"> <button type="submit">送信</button> </form> </body> </html> <?php if($_SERVER['REQUEST_METHOD'] === 'POST'){ $day = $_POST['day']; echo date("F j, Y", strtotime($day)) . "<br/>"; echo date("F j, Y", strtotime($day)) . "<br/>"; echo date("m.d.y", strtotime($day)) . "<br/>"; echo date("j, n, Y", strtotime($day)) . "<br/>"; echo date("Ymd", strtotime($day)) . "<br/>"; echo date("j-m-y", strtotime($day)) . "<br/>"; echo date("D M j", strtotime($day)) . "<br/>"; echo date("Y-m-d", strtotime($day)) . "<br/>"; echo date("Y-n-j", strtotime($day)). "<br/>"; echo date("Y年n月j日", strtotime($day)). "<br/>"; echo date("Y/n/j", strtotime($day)). "<br/>"; } 参考URL 1.date関数ドキュメント 2.input type="date"のドキュメント 3.strtotime関数ドキュメント 4.タイムスタンプについて
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

PHPで数値をアルファベットに変換するchr関数とord関数

PHPで数値をアルファベットに変換する方法 先日、PHPを勉強していてchr()関数とord()関数で、はまってしまったのでまとめておきます。 chr()関数とは この関数は、ASCII, ISO-8859, Windows1252のようなシングルバイトエンコーディング においては、文字セットのマッピングテーブルにある望みの文字の位置を渡すことで、一文字の文字列を作り出すのに使えます。しかし、この関数は stringのエンコーディングについて知りませんし、特にUTF-8やUTF-16のようなマルチバイトエンコーディングについては、この関数にUnicodeのコードポイントは渡せないことに注意してください。 つまり、シングルバイトエンコーディングに登録されている文字セットを、ユーザによって指定されたINT型の数値によって、対応している文字列(英数字か記号のみ)を返す関数であるといえます。 ASCII(アスキーコード)とは コンピュータは0か1かの2進数でしか認識できません。もちろん、ユーザは文字を扱う為それではコンピュータとやりとりができません。そこで、文字をコンピュータが認識できるように文字と2進数を対応付けさせ、登録させたのがASCII、文字コードの一種で、英数字と記号であるといえます。 では、指定した数値に応じて英数字に変換する関数をつくっていきましょう。 main.php <?php function changeNumberToAlphabet(int $number) { return chr($number); } $number = changeNumberToAlphabet(65); echo $number; //結果A //返り値を大文字英数字に指定する場合65~90(A〜Z) echo chr(65); echo chr(66); echo chr(67); //結果 A //結果 B //結果 C //返り値を小文字英数字に指定する場合97~122(a~z) echo chr(97); echo chr(98); echo chr(99); //結果a //結果b //結果c ?> ASCIIコードによって登録されている英数字が大文字(65~90)、小文字(97~122)が指定された数値によって参照し、変換されます。 ただ、chr(65) == Aではなく、指定した数値を任意の結果にしたい、という場合もあるでしょう。例えば、chr(1) == Aのような場合です。その場合は、以下のように指定してすることで、思うような結果になります。 main.php <?php function changeNumberToAlphabet(int $number) { return chr(ord('A') + $number - 1); //chr(65 + $number - 1) と同義 } changeNumberToAlphabet(1); //結果 A ?> 上記の例で、ord('A')の部分ですが、chr()が数値を英数字に変換する関数であれば、ord()関数は、英数字を数値に変換する関数です。 ord()関数とは string が ASCII, ISO-8859, Windows 1252 のような シングルバイトエンコーディング だった場合、 これは文字セットのマッピングテーブルにある文字の位置を返すことと同義です。 しかし、この関数はstring のエンコーディングについて知りませんし、 特に UTF-8 や UTF-16 のようなマルチバイトエンコーディングについては、 この関数からは Unicode のコードポイントは絶対にわからないことに注意してください。 この関数は chr() と逆の動作をします。 先程は、数値を英数字に変換する関数でしたが、次は英数字を数値に変換する関数をつくっていきましょう。 main.php <?php function changeNumberAlphabet(string $alhabet): int { return ord($alhabet) - ord('A') + 1; //$alhabet - 65 + 1 と同義 } $number = changeNumberAlphabet('B'); echo $number; //結果 2 ?> まとめ chr関数とは、ASCIIによって登録されている文字セットを、数値からアルファベットに変換する関数であること。 ord関数とは、その逆でアルファベットを数値に変換する関数であること。
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

PHPUnit用テストDB設定方法

PHP Unitでテストを行うためのテスト用DBを導入するまで Laravel開発にてテスト行う際は、PHP UnitというPHP用のユニットテストプログラムが標準で組み込まれており、テストコードを記述するとテストを実行してくれるとのこと。 早速PHP Unitにてテスト実行するためのテスト用DBを作成・設定したのでまとめます。 手順概要 MySQLにてテスト用DBを作成 config/database.php変更 .env.testing作成 phpunit.xml変更 手順詳細 MySQLにてテスト用DB作成 mysqlに接続し、以下コマンドでテスト用DBを作成 create database TestDababase; config/database.php変更 laravelプロジェクト内のconfigフォルダ下にあるdatabase.phpに使用するDB定義を追加します。 connections配列の中にあるmysqlの内容を丸々コピーして複製。 キーの名称をmysqlからテスト用のDB定義名称に変更。 database.php // その他設定項目省略 'connections' => [           // ↓mysqlからテスト用名称に変更 'test_laravel' => [ 'driver' => 'mysql', 'url' => env('DATABASE_URL'), 'host' => env('DB_HOST', '127.0.0.1'), 'port' => env('DB_PORT', '3306'), 'database' => env('DB_DATABASE', 'forge'), 'username' => env('DB_USERNAME', 'forge'), 'password' => env('DB_PASSWORD', ''), 'unix_socket' => env('DB_SOCKET', ''), 'charset' => 'utf8mb4', 'collation' => 'utf8mb4_unicode_ci', 'prefix' => '', 'prefix_indexes' => true, 'strict' => true, 'engine' => null, 'options' => extension_loaded('pdo_mysql') ? array_filter([ PDO::MYSQL_ATTR_SSL_CA => env('MYSQL_ATTR_SSL_CA'), ]) : [], ], ], .env.testingを作成 Laravelプロジェクトフォルダ直下にある「.env」をコピーし、「.env.testing」に変更。 変更箇所は以下の4箇所です。 「APP_ENV」 :任意の名称 「DB_CONNECTION」 :database.php内に定義したテスト用DB定義名称 「DB_DATABASE」 :1つ目の手順で作成したTestDBの名称を入力。 「APP_Key」 :次手順のコマンドで自動で入力されるため空欄にしておきます。 .env.testing APP_ENV= test_laravel APP_KEY= (空に設定) DB_DATABASE= test_laravel DB_DATABASE= TestDatabase config内容を変更しているので、一旦configキャッシュをクリア terminal php artisan config:clear test用App_Keyを作成するため以下のコマンドでキーを作成 このコマンドで.env.testing内のAPP_KEYに値が入力されます。 terminal php artisan key:generate --env=testing 上記手順完了したらテスト用DBをmigrate。 terminal php artisan migrate --env=testing これでTest用に作成したDB内にテーブルが作成されます。 phpunit.xmlを変更 最後にプロジェクト直下にある「phpunit.xml」の内容を変更します。 「DB_CONNECTION」の値に、database.php内に定義したテスト用DB定義名称を記入。 phpunit.xml <server name="APP_ENV" value="testing"/> <server name="BCRYPT_ROUNDS" value="4"/> <server name="CACHE_DRIVER" value="array"/> <server name="MAIL_DRIVER" value="array"/> <server name="QUEUE_CONNECTION" value="sync"/> <server name="SESSION_DRIVER" value="array"/> <server name="DB_CONNECTION" value="test_laravel"/> ここまでできたらphpunitを動かし、正常にテストが実行されていれば設定完了です。 備考 .envと.env.testingの切り替えの仕組みが気になったので調べてみたところ phpunit.xmlの内容のAPP_ENVのvalueの内容を読み取り、「.env.{{APP_ENV}}」のファイルを環境変数設定ファイルとして読み込みに行くとのこと。 phpunit.xml <server name="APP_ENV" value="testing"/> 試しに以下コードをテストコード内に記述してキーの名称を色々変えてみると設定ファイルとして.env.testingを読み込んでいることがわかります。 testExample.php dd(env('APP_ENV'), env('DB_HOST')); Laravelは設定ファイルをキャッシュしているため、DBを扱うテストコードを実行する前に php artisan config:clear を実行した方がいいとのこと。 設定変えてもddで反映されない場合はconfigをクリアするとうまく行くかと思います。
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

PHP Unitのためのテスト用DB作成手順

PHP Unitでテストを行うためのテスト用DBを導入するまで Laravel開発にてテスト行う際は、PHP UnitというPHP用のユニットテストプログラムが標準で組み込まれており、テストコードを記述するとテストを実行してくれるとのこと。 早速PHP Unitにてテスト実行するためのテスト用DBを作成・設定したのでまとめます。 手順概要 MySQLにてテスト用DBを作成 config/database.php変更 .env.testing作成 phpunit.xml変更 手順詳細 MySQLにてテスト用DB作成 mysqlに接続し、以下コマンドでテスト用DBを作成 create database TestDababase; config/database.php変更 laravelプロジェクト内のconfigフォルダ下にあるdatabase.phpに使用するDB定義を追加します。 connections配列の中にあるmysqlの内容を丸々コピーして複製。 キーの名称をmysqlからテスト用のDB定義名称に変更。 database.php // その他設定項目省略 'connections' => [           // ↓mysqlからテスト用名称に変更 'test_laravel' => [ 'driver' => 'mysql', 'url' => env('DATABASE_URL'), 'host' => env('DB_HOST', '127.0.0.1'), 'port' => env('DB_PORT', '3306'), 'database' => env('DB_DATABASE', 'forge'), 'username' => env('DB_USERNAME', 'forge'), 'password' => env('DB_PASSWORD', ''), 'unix_socket' => env('DB_SOCKET', ''), 'charset' => 'utf8mb4', 'collation' => 'utf8mb4_unicode_ci', 'prefix' => '', 'prefix_indexes' => true, 'strict' => true, 'engine' => null, 'options' => extension_loaded('pdo_mysql') ? array_filter([ PDO::MYSQL_ATTR_SSL_CA => env('MYSQL_ATTR_SSL_CA'), ]) : [], ], ], .env.testingを作成 Laravelプロジェクトフォルダ直下にある「.env」をコピーし、「.env.testing」に変更。 変更箇所は以下の4箇所です。 「APP_ENV」 :任意の名称 「DB_CONNECTION」 :database.php内に定義したテスト用DB定義名称 「DB_DATABASE」 :1つ目の手順で作成したTestDBの名称を入力。 「APP_Key」 :次手順のコマンドで自動で入力されるため空欄にしておきます。 .env.testing APP_ENV= test_laravel APP_KEY= (空に設定) DB_DATABASE= test_laravel DB_DATABASE= TestDatabase config内容を変更しているので、一旦configキャッシュをクリア terminal php artisan config:clear test用App_Keyを作成するため以下のコマンドでキーを作成 このコマンドで.env.testing内のAPP_KEYに値が入力されます。 terminal php artisan key:generate --env=testing 上記手順完了したらテスト用DBをmigrate。 terminal php artisan migrate --env=testing これでTest用に作成したDB内にテーブルが作成されます。 phpunit.xmlを変更 最後にプロジェクト直下にある「phpunit.xml」の内容を変更します。 「DB_CONNECTION」の値に、テスト用に作成したDatabaseの名称を記入。 phpunit.xml <server name="APP_ENV" value="testing"/> <server name="BCRYPT_ROUNDS" value="4"/> <server name="CACHE_DRIVER" value="array"/> <server name="MAIL_DRIVER" value="array"/> <server name="QUEUE_CONNECTION" value="sync"/> <server name="SESSION_DRIVER" value="array"/> <server name="DB_CONNECTION" value="TestDatabase"/> ここまでできたらphpunitを動かし、正常にテストが実行されていれば設定完了です。
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

LaravelとAmazon SES を使ってメールを送ろう!

はじめに タイトルの通り、とても簡単にLaravelとAmazon SESを使ってメールを送ることができます。 記事自体は長いのですが作業自体は特に難しくありません。 Laravel使ってメールを送りたいと考えている方(そうでない方も笑)、ぜひ記事に目を通していってください! 著者の環境 Laravel 8.78.1 PHP 8.0.8 本記事の概要 ゴール アプリから以下のようなメールが送信できることを目標にしていきます。 項目 説明 from mail@test-ses.tk fromの表示名 アプリ名 to アプリにて指定した宛先 やること メールを送信するために以下のステップを踏んでいきます。 もしご自身にとって不要なステップがあったら飛ばしてください。 IAMユーザーの作成 SESの設定 独自ドメインの取得 SESの設定 サンドボックス外への移動 Laravelの設定 IAMユーザーの作成 LaravelからSESにメールの送信リクエストをするには、認証のためにIAMユーザーが必要です。 (最終的に.envにIAMユーザーのアクセスキーやシークレットアクセスキーを記入します) そのため、まずはIAMユーザーを作成しましょう。 今回は以下のようなポリシーを作成し、このポリシーを直接IAMユーザーにアタッチしました(直接IAMユーザーにポリシーアタッチするのは良くないのですが、テストなので許してください笑) 作成したポリシー { "Version": "2012-10-17", "Statement": [ { "Sid": "VisualEditor0", "Effect": "Allow", "Action": [ "ses:SendEmail", "ses:SendRawEmail" ], "Resource": "*" } ] } 補足 アクセスキーとシークレットアクセスキーを確認する方法 IAMユーザーのユーザーページから認証情報タブをクリックします。 アクセスキーの作成をクリックすると、アクセスキーとシークレットアクセスキーが確認できます。 SESの設定 SESを利用するには、送信するためのドメイン又はメールアドレスが必要になります。 今回は送信元にドメインを指定します。 以下独自ドメインの取得についても記載していますが、取得済みの方は読み飛ばしてください。 独自ドメインの取得 今回はfreeenomというサービスを用いて無料でドメインを取得しました。 freenomへの登録を済ませたらヘッダーにあるServices内のRegister New Domainをクリックします。 好きなドメインのところでGet it nowを押します。そうすると、selectedに表示が切り替わります(今回はtest-ses.tkを選択しました)。 その後は完了画面になるまで、continue等を押していきます(完了画面は注文番号が出てくる画面です) ※ 途中にドメインを取得する期間を設定する場所があるので、その部分はご自身の希望の期間を設定してください。デフォルトは3ヶ月です。 これで独自ドメインの取得は以上になります。 しかしこのままではSESで色々ドメインの設定をした時に、freenomで管理をしなければならず結構面倒です。 そのためRoute53に管理を委任していきます。 まずはRoute53にて、先ほど取得した独自ドメインのホストゾーンを作成します。 そうしたら4つのNSレコードが作成されます(SOAレコードも作成されますが、今回はNSレコードのみ使用します)。 それではfreenomeにてRoute53のNSレコードを登録していきましょう。 freenomのヘッダーにあるServices内のMy Domainsをクリックします。 その後、自身のドメインのManage Domainというボタンを押下し、出てきた画面のNameserversをクリックします 先ほどRoute53のNSレコードに記載してあったものを記入していきます。 完了したらdigコマンドにてroute53のNSレコードが出てくるか確認しましょう。 ※直ぐには反映されないこともあります。 $ dig NS test-ses.tk +short ns-1347.awsdns-40.org. ns-14.awsdns-01.com. ns-1629.awsdns-11.co.uk. ns-823.awsdns-38.net. これで独自ドメインの設定は完了です。 それではSESの設定をしていきましょう。 SESの設定 SESのコンソール画面にいったらCreate identityというボタンを押します。 まずは、送信するドメインを設定します。 次にDKIMの設定をしていきます。今回はSESにて簡単に設定できるEasyDKIMを選択しました。 Route53を見ると、設定したDKIMのCNAMEレコードが追記されています(画像の3つのレコード全てがDKIMのドメインです)。 【補足】DKIM(DomainKeys Identified Mail)について メールの電子署名を用いた不正防止の仕組みです。送信者はメールに電子署名を行います。受信側はメールのドメイン検証メールの電子署名を利用した不正メール防止のことです。メール送信者は送信メールに電子署名を行い、メール受信者がドメインが正式なものかを問い合わせて不正を防止しています。 サンドボックス外への移動 SESはデフォルトの状態で Amazon SES サンドボックスに配置されます。 これにより以下のような制限がかかってしまいます。 SESに登録したメールアドレス(ドメイン)からしかメールを送信することができない 最大で 24 時間あたり 200 メッセージ 最大で 1 秒あたり 1 メッセージを送信できます どのアドレスへもメールを問題なく送信したい場合、Amazon SES サンドボックスから削除されるようにリクエストする必要があります。 SESのTopページからRequest production accessというボタンを押します 各種必要な情報を入力して、Requestを送信します。 これでSESの設定は完了です。 次にLaravelの方の設定をしていきましょう。 Laravelの設定 各種準備 まずはライブラリをインストールします。 $ composer require aws/aws-sdk-php 次に.envファイルを編集していきます。 使用するメーラーやIAMの情報を記入していきましょう。 .env MAIL_MAILER=ses MAIL_FROM_ADDRESS=mail@test-ses.tk # @より前は好きな文字を記入し、@の後はSESにて設定したドメインを設定します。 MAIL_FROM_NAME="${APP_NAME}" #FROMの表示名をアプリ名以外にしたい場合は、書き換えてください。 # 作成したIAMユーザーのアクセスキーを記入する AWS_ACCESS_KEY_ID=この部分はIAMのアクセスキーを記入してください。 AWS_SECRET_ACCESS_KEY=この部分はIAMのシークレットアクセスキーを記入してください AWS_DEFAULT_REGION=ap-northeast-1 #東京リージョンではない場合は書き換えてください。 config/mail.phpの変更 ※ 基本的に.envの設定値が適用されるので、第2引数は書き換えなくても動作しますが念の為設定しておきます。 config/mail.php 'default' => env('MAIL_MAILER', 'ses'), 'from' => [ 'address' => env('MAIL_FROM_ADDRESS', 'hiroaki-u@hiroaki-u.tk'), 'name' => env('MAIL_FROM_NAME', 'Test'), ], config/services.php ※ 基本的に.envの設定値が適用されるので、第2引数は書き換えなくても動作しますが念の為設定しておきます。 ```php:config/services.php return [ // 中略 'ses' => [ 'key' => env('AWS_ACCESS_KEY_ID'), 'secret' => env('AWS_SECRET_ACCESS_KEY'), 'region' => env('AWS_DEFAULT_REGION', 'ap-northeast-1'), ], ]; ``` 実装 LaravelではMailファサードを使ってMailを送ることが出来ます。 Mailファサードのみでも送信することはできるのですが、メールの文面等はMailableクラスを用いると楽に実装できるので、今回はMailableクラスを用いようと思います。 Mailableの生成 bash $ php artisan make:mail TestMail 上記のartisanコマンドを打つと、app/Mail/TestMail.phpが作成されます。 メールの文面にDBのデータが必要な場合は、メンバー変数にModelを持ってきて、コンストラクタにModelをDIする必要があります。 今回はUserのデータを使用すると仮定します。 MailTest.php <?php namespace App\Mail; use Illuminate\Bus\Queueable; use Illuminate\Contracts\Queue\ShouldQueue; use Illuminate\Mail\Mailable; use Illuminate\Queue\SerializesModels; use App\Models\User; class MailTest extends Mailable { use Queueable, SerializesModels; public $user; /** * Create a new message instance. * * @return void */ public function __construct(User $user) { $this->user = $user; } /** * Build the message. * * @return $this */ // subjectメソッドでメールのタイトルを設定 // viewメソッドでメールの本文が書いてあるbladeを指定 public function build() { return $this ->subject('メールの題名') ->view('emails.test_content'); } } メールの内容を実装 resources/views内にemails/test_content.blade.phpを作成します。 $ mkdir -p resources/views/emails && touch ./resources/views/emails/test_content.blade.php メールの文面を書いていきます。 今回は『[ユーザー名]さんへのメール』という文面を記載しています。 test_content.blade.php <body> <p>{{ $user->name }}さんへのメール</p> </body> メールの送信処理の実装 Mailファサードを用いてtoメソッドにより送信先を設定し、sendメソッドによりMailableのインスタンスを引数にします。 この処理でメールを送ることが出来ます。 TestController.php use App\Mail\MailTest; use Illuminate\Support\Facades\Mail; class TestController extends Controller { public function index() { $mail_address = [自分が送りたい宛先]; Mail::to($mail_address)->send(new MailTest($review,$user)); } } これで以上となります! 最後まで読んでくださりありがとうございました。 参考記事 Laravelメール送信(公式) SESの送信概要(公式) Amazon SES でメール送信するときのベストプラクティスまとめ SESのIAMポリシー設定 SESのサンドボックス制限
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

【php MyAdmin】 「エラー SQLクエリ:コピー」が表示された

今回、初めての投稿になります。何卒宜しくお願い致します。 現在XAMMPを使ってPHPを勉強しているのですが、パソコンの不具合が生じたので、新しいパソコンに移動することになりました。 そこで新しいパソコンにデータを移動したときに下記のようなエラーが表示されました。 エラー SQLクエリ:コピー とのことです。 そこでもう一度phpmyadminのsqlデータを移動する方法をまとめてみました [PC環境] ● 故障したPC → window10 64ビット ● 新しく入れるPC → window10 64ビット (故障したPCとおなじものになります) 主な流れを書くと次の通りになります。 1、 前のパソコンからSQLデータをエクスポートする 2、 新しいパソコンでXAMMPをインストールする 3、 新しいパソコンのphpmyAdminで新しいデータベースを作成する 4、 3で作成したデータベースに1のデータをインポートする では順番にやっていきましょう 1、 前のパソコンからSQLデータをエクスポートする ⓵XAMMPからPHP myAdminを立ち上げて、移動したいデータベースを選択します。(今回は「todo」のデータを移動したいとします) ⓶データベースを選択したページに「エクスポート」という項目があるのでそこをクリックします ⓷右下の「実行」ボタンをクリックする。そうすると、データベース名のSQL(〇〇.sql)がダウンロードされます 2、 新しいパソコンでXAMMPをインストールする こちらに関しては今回省略します。「XAMMP インストール」などで検索すれば出てくると思います 3、 新しいパソコンのphpmyAdminで新しいデータベースを作成する ⓵新しいパソコンにてPHP myAdminを立ち上げます。 ⓶1-⓷で出来上がったsqlのタイトル名で、データベースを作成します。(今回はtodoのデータベースを作成) * データベースの作り方は画面左にある「新規作成」ボダンをクリックすると作成画面が出来上がります。 4、 3で作成したデータベースに1のデータをインポートする ⓵3で作成したデータベースの画面から「インポート」のボタンをクリックし、インポート画面に移動します ⓶インポート画面から「ファイルを選択する」のボタンをクリックして、1-⓷のsqlを選びます。  右下にある「実行」のボタンをクリックすると終了です。 無事にデータが移動されたらこんな感じに表示されます。 なお、私の間違った原因は 3、のデータベースを作成せずに、そのまま4の内容を実行してしまった結果でした。 単純なことですが、いざやってみると抜けてしまった内容なので、今回はここにまとめておきます。 なお、私はプログラミング歴約1年の新人です。 もっと効率よい方法があればご意見いただければ幸いです。 今後ともよろしくお願いいたします
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む