20200314のMySQLに関する記事は5件です。

【PHP+MySQL】恐竜画像登録&画像表示にトライ!!!(恐竜シリーズプチ最終回)

はじめに

改良恐竜登録ツール(PHP+MYSQL版)
でも恐竜登録ツールを作成した。
しかし、何かが足りない。
恐竜登録と言えば、画像!!!

前回の記事で、DBに保存した画像の表示方法をまとめた。

今回は今までの内容を結集した恐竜画像登録&画像表示プログラムを作成してみた。

1.プログラム概要

機能1.登録済み恐竜画像を表示

dino_image1.jpg

例)7のリンクをクリックすると、インドミナスレックスの画像を表示。

dino_image2.jpg

機能2.恐竜の画像登録

(1)カテゴリーを確定後、登録したい恐竜(ティラノサウルス)を選択。
登録恐竜一覧には、画像登録済みの恐竜が表示されている。

dino_image3.jpg

(2)ファイル選択ダイアログで、登録したい画像を選択して確定ボタンを押す。
(tirano_mini.jpg(選択した画像)が表示される。)

dino_image4.jpg

(3)登録が完了すると、登録済みの恐竜一覧にリンクが表示される。
dino_image5.jpg

(4)リンクをクリックすると登録された画像が表示される。
dino_image6.jpg

2.実際のコード

(1)画像格納用のテーブル(tbl_dinoimg)の作成
id:恐竜のID
ext:画像ファイルのmimeタイプ
img:画像ファイルをバイナリデータにしたもの

create table tbl_dinoimg (
 id integer,
 img mediumblob,
 ext varchar(10),
 primary key(id)
);
common_dino2_image.php
<?php 

  function NewPdo($dbname)
  {
    $dsn = 'mysql:dbname='.$dbname.';host=localhost:3308;charset=utf8mb4';
    $user = 'root';
    $password = 'root123';
    $dbh = new PDO($dsn, $user, $password);
    return $dbh;

  }

  function Checkdino($db0,$qry0,$val1,$type1)
  {
    $result3=$db0->prepare($qry0);
    //パラメータをセット
    $result3->bindparam(1,$val1);
    $result3->bindparam(2,$type1);
    $result3->execute();
    //検索結果を配列に格納する
    $select_data=$result3->fetch();
    return $select_data;
  }
  //クエリ実行して得られる全データ(パラメータ)
  function get_SelectTypeData($db0,$query0,$val1)
  {
    $result_a=$db0->prepare($query0);
    $result_a->bindparam(1,$val1);
    $result_a->execute();
    return $result_a;
  }
  //クエリ実行して得られる全データ
  function get_AllData($db0,$query0)
  {
    $result_a=$db0->prepare($query0);
    $result_a->execute();
    return $result_a;
  }
  //$str1:検索対象文字列,$str_mark:探したい文字: 戻り値、探したい文字より前にある文字列
  function get_BeforeMarkString($str1,$str_mark)
  {
    $idx0=strpos($str1, $str_mark);
    $retstr=substr($str1,0,$idx0);
    return $retstr;
  }

  //$str1:検索対象文字列,$str_mark:探したい文字、探したい文字より後にある文字列
  function get_AfterMarkString($str1,$str_mark)
  {
    $idx0=strpos($str1, $str_mark);
    $retstr=substr($str1,$idx0+1);
    return $retstr;
  }
 ?>  

start_dino_image.php
<!DOCTYPE html>
<html lang="ja">
<meta charset="utf-8">
<title>恐竜画像登録</title>
<body>
<h1>恐竜画像登録!!</h1>

<?php 

  require "common_dino2_image.php";
  //画像フォーム部分
  $dbname='db_dino';
  $dbh=NewPdo($dbname);

  $query_type0 = "SELECT DISTINCT type0 from tbl_dino";
 ?>

  <!-- tbl_dinoに登録されている恐竜カテゴリーと一覧を表示する部分 -->
  <form action="start_dino_image.php" method="post">
カテゴリー:
  <?php $result_a=get_AllData($dbh,$query_type0); 
  $cate0=isset($_POST['dtype01'])?htmlspecialchars($_POST['dtype01']):null;

   ?> 
  <select name="dtype01" style="width: 100px">
    <?php while($select_data=$result_a->fetch(PDO::FETCH_ASSOC)){
      //$cate0が$select_data['type0']と等しい場合
      if($cate0 == $select_data['type0']){ 
        echo "<option selected>".$select_data['type0']."</option>";
      //$cate0が$select_data['type0']と等しくない場合
      }else{
        echo "<option>".$select_data['type0']."</option>";
      }
    }  
    ?>
  </select>
  <input type="submit" name = "btn2" value="確定">
  </form>

<?php 

  $dbname='db_dino';
  $dbh=NewPdo($dbname);
  $query_select_type0 = "SELECT dname0 from tbl_dino where type0 = ?";
  $result3=get_SelectTypeData($dbh,$query_select_type0,$cate0);

 ?>
  <form action="start_dino_image.php" enctype="multipart/form-data" method="post">
対象恐竜:
  <select name="dname" style="width: 280px">
    <?php $dino0=isset($_POST['dname'])?htmlspecialchars($_POST['dname']):null; ?>
    <?php while($select_data=$result3->fetch(PDO::FETCH_ASSOC)){
      echo "<option>".$select_data['dname0']."</option>";
    }
    ?>
  </select><br>
  <label>画像/動画アップロード</label>
  <input type="file" name="upfile">
  <input type="hidden" name="btn3" value="<?=$cate0?>">
  <input type="submit" value="確定">
  </form>


<?php 

  //ファイルアップロードがあったとき
  try{
    $dbname='db_dino';
    $dbh=NewPdo($dbname);
    //$pdo = new PDO("mysql:host=127.0.0.1;dbname=mediatest;charset=utf8", $user, $pass);
    if (isset($_FILES['upfile']['error']) && is_int($_FILES['upfile']['error']) && $_FILES['upfile']['name'] !== ""){
    //エラーチェック
      switch ($_FILES['upfile']['error']) {
        case UPLOAD_ERR_OK: // OK
          break;
        case UPLOAD_ERR_NO_FILE:   // 未選択
          throw new RuntimeException('ファイルが選択されていません', 400);
        case UPLOAD_ERR_INI_SIZE:  // php.ini定義の最大サイズ超過
          throw new RuntimeException('ファイルサイズが大きすぎます', 400);
        default:
          throw new RuntimeException('その他のエラーが発生しました', 500);
      }


      //拡張子を見る
      $tmp = pathinfo($_FILES['upfile']['name']);
      $extension = $tmp["extension"];
      if($extension === "jpg" || $extension === "jpeg" || $extension === "JPG" || $extension === "JPEG"){
        $ext1 = "image/jpeg";
      }
      elseif($extension === "png" || $extension === "PNG"){
        $ext1 = "image/png";
      }
      else{
        echo "非対応ファイルです.<br/>";
        echo ("<a href=\"start_dino_image.php\">戻る</a><br/>");
        exit(1);
      }
      //カテゴリーと恐竜名からidを探す
      $sql_select="SELECT * FROM tbl_dino WHERE dname0=? and type0=?";
      $dname1=isset($_POST['dname'])?htmlspecialchars($_POST['dname']):null;
      $type1=isset($_POST['btn3'])?htmlspecialchars($_POST['btn3']):null;
      $select_data1=Checkdino($dbh,$sql_select,$dname1,$type1);
      $dino_id=$select_data1['id'];

      //画像・動画をバイナリデータにする.
      $raw_data = file_get_contents($_FILES['upfile']['tmp_name']);

    }
    $dbname='db_dino';
    $dbh=NewPdo($dbname);

    $sql_del = "DELETE FROM tbl_dinoimg WHERE id=?";
    //画像・動画をDBから削除
    $result1=$dbh->prepare($sql_del);
    //パラメータをセット
    $result1->bindparam(1,$dino_id);
    $result1->execute();

    //画像・動画をDBに格納.
    $sql_ist = "INSERT INTO tbl_dinoimg(id, img, ext) VALUES (?,?,?)";
    $result1=$dbh->prepare($sql_ist);
    //パラメータをセット
    $result1->bindparam(1,$dino_id,PDO::PARAM_INT);
    $result1->bindparam(2,$raw_data,PDO::PARAM_LOB);
    $result1->bindparam(3,$ext1,PDO::PARAM_STR);
    $result1->execute();
    echo $dino_id."<br>";
  }

  catch(PDOException $e){
    echo("<p>500 Inertnal Server Error</p>");
    exit($e->getMessage());
  }

 ?>


<?php  
  //tbl_dinoimgに登録されている恐竜idと名前を表示する。
  $sql_idall="SELECT T1.id,T1.dname0,T1.type0 FROM tbl_dino T1";
  $sql_idall = $sql_idall." INNER JOIN tbl_dinoimg T2 ON T1.id=T2.id ORDER BY T2.id";

  $dbname='db_dino';
  $dbh=NewPdo($dbname);

  $result1=get_AllData($dbh,$sql_idall);
  echo "<br><h4>登録恐竜一覧</h4><br>";
  while ($row = $result1 -> fetch(PDO::FETCH_ASSOC)){
    $id=$row['id'];
 ?> 
  <!-- idと恐竜名とカテゴリー名 -->
    <a href="dino_display_image.php?id=<?=$id?>"><?=$id?></a>:<?= $row['dname0'] ?>(<?= $row['type0'] ?>)
<?php 
    echo ("\n"."<br/>");
  }
  $dbh=null;

 ?>

</body>
</html>

実はこの格納した画像を表示する事が超大変だった。
(前回の記事の部分)
よくある下記のコードでは、画面に表示されるのはどこまでも深い
黒一色の画面だったのだ。

header("Content-Type: image/jpeg");
echo ($row['img']);

そのうちにbase64というキーワードを見つけることになる。
1.DBから画像バイナリデータを取得
2.base64でエンコード
3.2を画像のmimeタイプで表示
という手順があることが分かった

dino_display_image.php
<?php 
  if(isset($_GET['id']) && $_GET['id'] !== ""){
    $id = $_GET['id'];
  }
  else{
    header("Location: start_dino_image.php");
  }
  try {
    require "common_dino2_image.php";
    $dbname='db_dino';
    $dbh = NewPdo($dbname);
    $sql_select = "SELECT ext,img FROM tbl_dinoimg WHERE id = ?";
    $result1=$dbh->prepare($sql_select);
    //パラメータをセット
    $result1->bindparam(1,$id,PDO::PARAM_INT);
    $result1->execute();
    $row = $result1 -> fetch(PDO::FETCH_ASSOC);
    //取得した画像バイナリデータをbase64で変換。
    $img = base64_encode($row['img']); 
 ?>
    <!-- エンコードした情報をimgタグに表示 -->
    <img src="data:<?php echo $row['ext'] ?>;base64,<?php echo $img; ?>"><br>
    <a href="start_dino_image.php">戻る</a>

<?php 


  }
  catch (PDOException $e) {
    echo("<p>500 Inertnal Server Error</p>");
    exit($e->getMessage());
  }
 ?>

参考URL

PHPでbase64の使い方を知ろう!サンプルコードで速攻理解

今後に向けて

PHPでは一応恐竜シリーズの区切りがついた。
他のプログラミング言語でも、このシリーズにトライしたいと考えている。

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

データベースとは [初心者向け][シンプルに]

データベースとは

データベース(略してDB)とは、大量のデータが入っている箱のようなもの。
(後からデータの追加、削除、検索をしやすい形に整理してある)

データベースの種類(型)

データベースには
「階層型」「ネットワーク型」「リレーショナル型」
の3つがある。
単にデータベースと言った場合はリレーショナル型をさすことが多い。(圧倒的に広く使われているそう)

リレーショナルデータベース(RDB)とは?

 →行と列からなる「表」でデータを管理するデータベース。↓
スクリーンショット 2020-03-14 15.02.23.png
↑こんなイメージですかね。

  • データの重複を避けられる
  • 検索能力が高い
  • SQLを用いたデータのアクセスが可能 (SQLとはデータベースとやり取りするときに使う言葉)

等の特徴がある。

どんなリレーショナルデータベースがあるか

代表的な製品は、
MySQL、Oracle、MS Access、MS SQL Server、DB2、PostgreSQLなどなど

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

【MySQL・Docker】cryptography is required for sha256_password or caching_sha2_password

DockerでMySQL8.0のイメージを使用した際、「cryptography is required for sha256_password or caching_sha2_password」エラーが発生したのでその回避策。

原因

デフォルトの認証がcaching_sha2_passwordになっていたのですが、これだと暗号化がうまくいかないのか、復号の際の検証がうまくいかないのか、エラーが発生しているようです。

参考
アプリ制作時に悩まされたエラー集
MYSQL8.0におけるデフォルトの認証プラグインの変更

回避策

認証方式をMySQL8.0.4以前のmysql_native_passwordに戻しましょう。CMDで変更することも可能だと思いますが、今回はmy.cnfを自作して、起動したコンテナにマウントします。

my.cnf
[musqld]
default_authentication_plugin= mysql_native_password
docker-compose.yaml
・・・略
  mysql:
    image: mysql:8.0
    volumes:
      - ./my.cnf:/etc/mysql/conf.d/my.cnf

my.cnfをマウントする方式にしておくことで文字コード問題(utf8,latin問題)などが発生した場合も設定を書いてあげるだけなので簡単に対応することができるようになります。

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

【初心者向け】Laravelのデータベース設定でつまずいた話

はじめに

MAMPを使用してLaravelの環境を構築しようとした際にDB接続の設定でつまずいたため、その内容と解決した方法をまとめます。  

対象読者

初めてLaravelでwebアプリを作ろうとしている初心者の方。

LaravelのDB設定がうまくいかない方。 

開発環境

・mac book pro(Mojave) 
・MAMP(version5.7)
・MySQL
・Composer(version1.9.1)
・Laravel(ver5.8.3)

エラーにハマった経緯

もともとXAMPPを使用してLaravelのアプリを開発していました。
しかし、macで開発をする場合はMAMPを使用した方がベターであるとの話を聞いて、 これを機にMAMPを使おうと思いXAMPPの環境からMAMPの環境にアプリを移行しようとしたのですが、SQLSTATE[HY000] [2002] No such file or directoryのエラーが出てDBに接続できなくなりました。

移行する際にやったこと(失敗例)

XAMPPで環境を作った際、筆者はWEBサーバーもDBサーバーもよくわかっていませんでした。
調べたところ.envと/config/database.phpあたりがどうやらDB接続の設定ファイルらしいとわかり、見よう見まねで何とか接続することができました。

で、MAMPに移行するに当たって、久々にDB接続の設定ファイルを見た所、とりあえず、.envと/config/database.phpのそれらしいところをMAMPに合わせて修正すれば良さそうな気がしたのでやってみました。

MAMPのアプリを立ち上げてサーバーを起動させるとスタートページに飛ぶのでページ内にあるMySQLの設定を参照します。
スクリーンショット 2020-03-13 23.48.34.png

DB_HOST=localhost
DB_PORT=8889
DB_DATABASE=database_name
DB_USERNAME=root
DB_PASSWORD=root

/config/database.phpの中身は先頭に*をつけた項目のみ変更しました。

database.php
      'mysql' => [
            'driver' => 'mysql',
            'url' => env('DATABASE_URL'),
            *'host' => env('DB_HOST', 'localhost'),
            *'port' => env('DB_PORT', '8889'),
            *'database' => env('DB_DATABASE', 'database_name'),
            *'username' => env('DB_USERNAME', 'root'),
            *'password' => env('DB_PASSWORD', 'root'),
            *'unix_socket' => env('DB_SOCKET', '/Applications/MAMP/tmp/mysql.sock'),
            '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'),
            ]) : [],
        ],

このように設定してコマンドラインから以下のコマンドを実行したところエラー発生

$php artisan migrate
エラー内容
 Illuminate\Database\QueryException  : SQLSTATE[HY000] [2002] No such file or directory

エラーをみた感じどこかのpathが違うのかなと思いエラー内容を検索したところ、どうやら'unix_socket' => env('DB_SOCKET', '/Applications/MAMP/tmp/mysql.sock')の部分が関係ありそうとわかりました。
そう言えばXAMPPを使った時には/config/database.phpのこの部分をいじった覚えがなかったので、この記述について調べてみると、どうやらMAMPを使ってLaravelからDBに接続するにはTCP接続とUNIXドメインソケットを使用する方法の2通りがあるらしいということがわかりました。
【参考】Laravel5でデータベース接続にUNIXドメインソケットを使う

一応TCP接続が一般的ということでUNIXドメインソケットを使用するよりは簡単そうだと感じ、ひとまずUNIXドメインソケットを使用する方法は保留にしておくことにしました。
よくわからないものは書かない方が良いということで'unix_socket' => env('DB_SOCKET', '/Applications/MAMP/tmp/mysql.sock')の部分を削除し、またTCP接続をする場合にはDB_HOSTを localhostではなく127.0.0.1に変更する必要があるという記事を見つけて.env、/config/database.php共に修正をしました。

【参考】MySQLでlocalhostと127.0.0.1の違い

サーバーを再起動してから、再度以下のコマンドを実行したところ同じエラーが発生

$php artisan migrate
エラー内容
 Illuminate\Database\QueryException  : SQLSTATE[HY000] [2002] No such file or directory

修正した設定は絶対に正しいはずだったのでこうなってしまうとどこが違うかの検討もつかずお手上げでした。

解決方法

筆者は全く知らなかったのですが、どうやらLaravelではApacheを再起動した場合でも内部のキャッシュが残ってしまいプログラムを変更してもうまく反映してくれないことがあるそうです。

【参考】Laravel キャッシュクリア系コマンドなど

そこでコマンドラインから以下のコマンドを実行してキャッシュのクリアを行いました。

php artisan cache:clear
php artisan config:cache

.envファイルと/config/database.phpは以下のように記述

DB_CONNECTION=mysql
DB_HOST=127.0.0.1
DB_PORT=8889
DB_DATABASE=database_name
DB_USERNAME=root
DB_PASSWORD=root
database.php
   'mysql' => [
            'driver' => 'mysql',
            'url' => env('DATABASE_URL'),
            'host' => env('DB_HOST', '127.0.0.1'),
            'port' => env('DB_PORT', '8889'),
            'database' => env('DB_DATABASE', 'database_name'),
            'username' => env('DB_USERNAME', 'root'),
            'password' => env('DB_PASSWORD', 'root'),
            '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'),
            ]) : [],
        ],

DB接続の確認をするために以下のコマンドを打つとエラーが消えて実行することができたことから、DB接続が確認できました。

php artisan migrate

補足

以上の方法でDB接続をすることには成功したのですが、せっかくなので先ほど保留にしたUNIX_ドメインソケットを使用する方法にも挑戦しました。

UNIX_ドメインソケットを使用したDB接続(エラー編)  

.envファイルと/config/database.phpのDB_HOST127.0.0.1localhostに変更して、/config/database.phpのDB_SOCKETの部分を先の/Applications/MAMP/tmp/mysql.sockに設定をしました。
以下設定ファイル

DB_CONNECTION=mysql
DB_HOST=localhost
DB_PORT=8889
DB_DATABASE=database_name
DB_USERNAME=root
DB_PASSWORD=root
database.php
       'mysql' => [
            'driver' => 'mysql',
            'url' => env('DATABASE_URL'),
            'host' => env('DB_HOST', 'localhost'),
            'port' => env('DB_PORT', '8889'),
            'database' => env('DB_DATABASE', 'database_name'),
            'username' => env('DB_USERNAME', 'root'),
            'password' => env('DB_PASSWORD', 'root'),
            'unix_socket' => env('DB_SOCKET', '/Applications/MAMP/tmp/mysql/mysql.sock
            '),
            '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'),
            ]) : [],
        ],

このように設定ファイルを変更し、キャッシュをクリアしてサーバーを立ち上げ直し以下のコマンドを実行してDB接続ができているかを試したところまたしてもエラーが発生。
(DBを作り直すコマンドなので実行には注意)

php artisan migrate:refresh
 Illuminate\Database\QueryException  : SQLSTATE[HY000] [2002] No such file or directory

またこのエラーかということで詰みました。今回も変なところは見当たらないと思っていたのですが、ネットにあがっている記事を色々と見ていたところこのような記事を発見しました。

【参考】Laravelの.envファイルと、config/database.phpファイルについてのメモ

筆者は今まで設定ファイルの中のそれっぽい記述に飛びついて書いていたため全く意識してなかったのですが、config/database.phpのmysqlの設定部分は連想配列になっており、env()という関数に引数として.envファイルで設定した環境変数を渡す形のプログラムとなっています。また、env()の第二引数ではデフォルト値を渡しているそうです。

筆者は今までLaravelのDB接続設定で.envとconfig/database.phpの違いがよくわからないまま、どうしてDB接続の設定ファイルが二つもあるのかという風に思っていましたが、これに気づいて少し納得しました。
とはいえ実際に試してみないと曖昧なままなので、これを踏まえて先ほど成功したTCP接続で実験してみることにしました。

env関数の実験(TCP接続)

config/database.phpがenv()により.envで設定した環境変数の値を取得し、env()の第二引数はデフォルト値であるということは、.envさえ設定していればconfig/database.phpのenv関数の第二引数には何も渡さなくていいんじゃないかという予想を元に.envとconfig/database.phpを変更してみました。

DB_CONNECTION=mysql
DB_HOST=127.0.0.1
DB_PORT=8889
DB_DATABASE=database_name
DB_USERNAME=root
DB_PASSWORD=root
database.php
    'mysql' => [
            'driver' => 'mysql',
            'url' => env('DATABASE_URL'),
            'host' => env('DB_HOST', ''),
            'port' => env('DB_PORT', ''),
            'database' => env('DB_DATABASE', ''),
            'username' => env('DB_USERNAME', ''),
            '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'),
            ]) : [],
        ],

上記のように設定ファイルを変更して以下のようにコマンドを打ってキャッシュを削除します。

php artisan cache:clear
php artisan config:cache

サーバーを再起動してから、以下のコマンドを打つと実行できるようになり、DB接続が確認できました。

php artisan migrate:refresh

UNIX_ドメインソケットを使用したDB接続(解決編) 

要するに.envファイル内の記述がLaravelのDB接続の設定ファイルとしてはメインだということがわかったのですが、よくよく考えてみるとunix_socketに関する記述がデフォルトでは.envファイルの方に書かれていませんでした。
そこで試しに以下の一文を.envファイルに追加しました。

DB_SOCKET=/Applications/MAMP/tmp/mysql/mysql.sock

上の記述を追加した後の.envファイルの設定は以下のようになります。

DB_CONNECTION=mysql
DB_HOST=localhost
DB_SOCKET=/Applications/MAMP/tmp/mysql/mysql.sock
DB_PORT=8889
DB_DATABASE=database_name
DB_USERNAME=root
DB_PASSWORD=root

/config/database.phpについては変更なしのままです。

database.php
 'mysql' => [
            'driver' => 'mysql',
            'url' => env('DATABASE_URL'),
            'host' => env('DB_HOST', ''),
            'port' => env('DB_PORT', ''),
            'database' => env('DB_DATABASE', ''),
            'username' => env('DB_USERNAME', ''),
            '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'),
            ]) : [],
        ],

このように設定したら、再度キャッシュをクリアするコマンドを打ちます。

php artisan cache:clear
php artisan config:cache

サーバーを再起動して、以下のコマンドを打つと実行できたことから、DB接続が確認できました。

php artisan migrate:refresh

まとめ

本記事ではMAMPを使用したLaravelのDB接続についてエラーを解決するために色々試してみました。

長くなったので本記事のトピックをまとめます。

  1. MAMPを使う場合LaravelのDB接続方法にはTCP接続とUNIX_SOCKETを使用した接続がある
  2. Laravelではキャッシュをクリアしないと設定の変更が反映されないことがある
  3. TCP接続を使う際はDB_HOSTを127.0.0.1とする
  4. UNIX_SOCKETを使用して接続する際はDB_HOSTをlocalhostとし、DB_SOCKETを設定する
  5. config/database.phpで使われているenv関数は.envで設定した環境変数を取得する関数である
  6. UNIX_SOCKETを使用して接続する際は.envにDB_SOCKETを設定する文を追加する

終わりに

今まで、あまり内容を理解せずに行っていたLaravelのDB接続設定ですが、今回しっかりと向き合えたおかげで曖昧にしていた部分がよくわかりました。
また、今回はMAMPを使用しておりますが、XAMPPや他の方法でも同じように設定できるのかはわからなかったので後々実験してみようと思います。
本記事を作成する中で色々と試し理解したつもりではありますが、まだまだ理解の浅い部分や間違った解釈をしている部分があるかも知れません。そのような部分があった場合はご指摘いただけると幸いです。

また、初心者の方を対象にした記事になっていますが、記事を作成した筆者もまた、合間の時間を使って独学で学んでいる初心者です。筆者の話をすると、現在webプログラマーを目指して就職活動中ですが、未経験歓迎と書いてありながらも現場で働いている社員の方は即戦力になる人が欲しいと思っているのが本音なのか、どんなに熱心に準備をして望んでも興味なさそうに面接をされて落とされることもありました。
ただ、それはそれで仕方ないと筆者は割り切るようにしています。笑
しんどいことや辛いこともたくさんありますが、頑張っていきましょう!

参考サイト一覧

本記事の中で参考にさせていただいた記事を一度リンクを貼ったものも含めて再度掲載します。

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

【EC2】本番環境で反映されない!?本番環境エラー時log確認系コマンド【リリース前】

こんばんみ

おささです

さ、前置きはダラダラ書かず

log確認行きまっしょい!

EC2関係のエラーで役立つlog確認コマンド

まずはEC2サーバーにログインしてね!

その後

[ec2-user@ip-アドレス〜]$ cd /var/www/確認したいリポジトリ名/current/log

[ec2-user@ip-アドレス log]$ ls

[ec2-user@ip-アドレス log]$ ls
production.log unicorn.stderr.log unicorn.stdout.log
   ↑        ↑         ↑

上記、3つのlogが出てきたら準備OK!
(これらがなければ、本番環境構築時のミスがあるかも?)

あとは、確認したいlogの前に less をつけて、これらを確認!

【例】→ [ec2-user@ip-アドレス log]$ less production.log

ちなみにproduction.logを見れば、
 ・syntax errorなのか
 ・method errorなのか
 ・unknown errorなのか 等

ざーっくりとしたerror箇所は確認できます。

もっと詳しくエラー内容を知りたい!

[ec2-user@ip-アドレス log]$ tailf production.log

これで、もっと詳しいエラー内容を見ることができます?
※「この引数がおかしいよ!」みたいに。

その他

ⅰnginxの再読込&再起動
 [ec2-user@ip-アドレス リポジトリ名]$ sudo service nginx reload
 [ec2-user@ip-アドレス リポジトリ名]$ sudo service nginx restart

MySQL(お使いの方は)の再起動
 [ec2-user@ip-アドレス リポジトリ名]$ sudo service mysqld restart

unicornのmasterをkill
 [ec2-user@ip-アドレス リポジトリ名]$ ps aux | grep unicorn
 [ec2-user@ip-アドレス リポジトリ名]$ kill マスターの番号

gitを最新にpull
 [ec2-user@ip-アドレス リポジトリ名]$ git pull
 [ec2-user@ip-アドレス リポジトリ名]$ git log ←一番上のlogが最新になっているか確認をしてね!

なども有効ですので、参考までに♪

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む