20200406のMySQLに関する記事は9件です。

【node.js】bookshelfとknexを使ってCRUD操作

expressを使ったbookshelfの操作方法について書かれております。

Bookshelfとは

SQLを使わずデータベースを使うことができるORM

Bookshelfは、 Knex SQLクエリビルダー上に構築されたNode.js用のJavaScript ORMです。 Promiseベースのコールバックインターフェイスと従来のコールバックインターフェイスの両方、トランザクションサポート、eager / nested-eagerリレーションのロード、ポリモーフィックな関連付け、1対1、1対多、および多対多のリレーションのサポートを備えています。
PostgreSQL、MySQL、SQLite3で動作するように設計されています。

knexとは

Bookshelfは、内部で「クエリービルダー」と呼ばれるknexモジュールを利用しています。ですから、インストールの際には、まずknexを入れておく必要があります。

良く分からないけど、Bookshelfを使う際にはついてくる物らしい。。。

モジュールのインストール

npm install --save knex
npm install --save bookshelf

Bookshelfの初期設定

var knex = require('knex')({
    client: 'mysql',
    connection: {
        host    : '127.0.0.1',
        user    : 'root',
        password: '',
        database: 'データベース名',
        charset : 'utf8'
    }
});

var Bookshelf = require('bookshelf')(knex);

var Mydata = Bookshelf.Model.extend({
    tableName: 'Mydata(テーブル名)'
});

上記のコードで行っている事は、
knexのロード、
knexの初期設定、
Bookshelfのロード、
モデルの作成

モデルとは?

テーブルにアクセスするオブジェクトです。
これを使って、テーブルのデータをCRUD操作します。

モデルの項目追加

hasTimestamps:true タイムスタンプのデータをレコードに追加する
user: function() {return this.belongsTo(テーブル名) 他のテーブルの値を取得可能にする

これでBookshelfの初期設定は完了しました。
いよいよ、CRUD操作をしていきます。

Bookshelfのメソッド

Bookshelfで操作する際に使用するメソッドです。使いながら覚えていきましょう。

fetchAll 全てのレコードを取得する物
then データベースアクセス完了後の処理をコールバック関数として設定します。
catch thenを実行した時にエラーが発生した時の処理です。
save オブジェクトの引数をテーブルに保存する処理をします。
where 検索する対象に条件を設定して絞り込む
fetch 最初の一つだけレコードを取り出す。
fetchPage 得られたページ番号を元にレコードを取り出します。
orderBy レコードを並べ変える。
query 複数項目をチェックすする

レコードを取り出す

全レコードを取り出す

new Mydata().fetchAll().then((collection) => {
  -----取得できた場合の処理-----
}).catch((err) => {
  -----エラー発生時の処理-----
});

レコードを保存する

新しいレコードの追加をしていきます。

router.post('/add', (req, res, next) => {
  new Mydata(req.body).save().then((model) => {
    ー追加した後の操作ー
  });
});

検索

router.post('/', (req, res, next) => {
  nex Mydata().where('id', '=', req.body.fstr).fetch().then((collection) => {
    取得後の操作
  }
}

レコードを並べかえる

router.get('/:page', (req, res, next) => {
  nex Message().orderBy('created_at', 'DESC').fetchAll().then((collection) => {
    取得後の操作
  });
})

orderByについて

第一引数にフィールド名、第二引数には「ABC」「DESC」の何かを指定します。
(DESCなら降順、ABCなら逆順)

複数項目をチェックする

router.post('/', (req, res, next) => {
  var nm = req.body.name;
  var pw = req.body.password;
  Mydata.query({where: {name: nm}, andWhere: {password: pw}})
    .fetch()
    .then((model) => {
      取得後の操作
    }
}

関数query()に関して

where:{name: nm} nameの値が変数nmである
andWhere:{password: pw} それに加えて、passwordの値が変数pwである

ページネーション

Bookshelfを使う事で、ページネーションも使えるようになります。

router.get('/:page', (req, res, next) => {
  var pg = req.params.page;
  pg *= 1;
  if(pg < 1){pg = 1; }
  new MyData().fetchPage({page:pg, pageSize:3}).then((collection) => {
    取得した後の操作
  })
  .catch((err) => {
    エラーを取得した後の操作
  }
}

関数.fetchPageに関して

page 現在のページ番号
pageCount ページ数(最後のページのページ番号)
pageSize 1ページ辺りのレコード数
rawCount レコードの総数

参考

node.js超入門第2版

Bookshelfとは
https://bookshelfjs.org/

paginationプラグイン
https://github.com/bookshelf/bookshelf/wiki/Plugin:-Pagination

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

PHPでMySQLと接続するために行ったこと

こんにちは、現在研修でPHP+DBでCRUD機能をつけた掲示板を作成しているのですがPHPとDBでうまく接続ができなかった為、共有したいと思います。なんかの参考になれば幸いです。

QそもそもなぜなかなかDB接続できなかったのか。

try{
    $db = new PDO('mysql:dbname=php_db;host=localhost;charset=utf8', 'root', 'root');
  } catch (PDOException $e) {
    echo 'DB接続エラー'. $e -> getMessage();
  }

上記のコードがMySQLと接続する際のコードになるのですが、PDOというPHPに接続するための関数の第一引数にデーターベース名とhost名、文字コードなどを指定でき、第二引数にユーザーの権限、第三引数にパスワードを入力しないといけないとのことですが、XAMPPを使用している方なら第三引数を特に指定せず ' ' だけでいいらしいのですがMAMP環境下だと第三引数にパスワードを指定しないといけなく、私は省略していいものだと思ってずっと接続できずにいました。アホでした。笑

Qどうやってテーブルにユーザー情報を格納したのか

これ、他のエンジニア様のコードや参考書に記載されているコード色々拝見したのですが、どれもわかりずらくそのままコピペしてもうまくいかなったんですよね。もしかしたら私のコードを他のエンジニア様がご覧になった際には怒られてしまうかもしれませんが一応うまくいったので共有します。

<?php 
  session_start();
  require('../db/connect.php');
//HTMLのコードが並ぶ
 $statement = $db->prepare('INSERT INTO users SET name=?, email=?, password=?');
  $statement -> execute(array(
    $_POST['name'],
    $_POST['email'],
    password_hash($_POST['password'], PASSWORD_DEFAULT)
  ));
?>

session_startと記載することでpostした情報を取得することができます。それを利用してテーブルに情報を格納していく形になります。

requireは先ほどのDB接続しているファイルを読み込んでいます。何回も同じ文を書きたくないですからね。

次にprepareと記載することでより安全にDBに情報を格納できるとのことだったので記載しております。引数にSQL文を記載していく形になります。INSERT INTOでユーザー情報を格納しています。

name = ?というのが下の文に書いてある$_POST['name']に入っている値が?の情報になります。
?に置き換わっているカラムの数だけ記載してあります。
最後にパスワードをハッシュ化してDBに格納します。

最後に

自分はWeb系の企業に就職して初めてPHPを書いています。
PHPだけで掲示板サイト作るのとか勉強していないし無理ーーーー?とか思ってました。意外となんとかなっているというのが今の現状です。
今までは独学でRuby on Railsの勉強をしていました。
フレームワークってあんなにも便利だったんだなと改めて実感しています。
早く先輩方に追いつけるように日々頑張っていかないといけませんね。

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

MySQLで複数件のINSERTを実行する

自分用。プロシージャを初めて使ったので

DELIMITER //
CREATE PROCEDURE bulk_inserter(IN dt VARCHAR(128), IN x INT)
BEGIN
  DECLARE i INT;
  DECLARE dy VARCHAR(128);
  DECLARE hr VARCHAR(128);
  DECLARE tbl_name VARCHAR(128);

  SET i = 0;
  SET dy = DATE_FORMAT(dt, '%d');
  SET hr = TIME_FORMAT(dt, '%H');
  SET tbl_name = 'my_table_name';

  WHILE i < x do
    set i = i + 1;
    INSERT INTO tbl_name (created_at) VALUES (dt);
  END WHILE;
END
//

DELIMITER ;

BEGIN;
CALL bulk_inserter('2020-04-04 09:25:00', 100);
COMMIT;

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

MySQLで特定のカラム名を持つテーブルを検索

今回はメールアドレスがありそうなカラムを調べたかったので、likeで検索しました。
column_nameのところに検索したいカラムの名前、table_schemaはDB名です。

SELECT table_name, column_name FROM information_schema.columns WHERE column_name LIKE '%mail%' AND table_schema = 'hoge';
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

Elastic Beanstalkでrails on Docker した時のmysqlのアクセスエラー

mysqlへの接続エラー

Elastic Beanstalk(EB)で環境を作成する時にmysql(RDS)も一緒に作成した。

この時にmysqlのpassword(8文字以上)の設定をしたのだが、適当に数字(00000000)を入力しただけでは、Railsがmysqlに接続できない。

Mysql2::Error: Access denied for user 'username'@'host' (using password: YES)

ここで設定したpasswordは環境変数(RDS_PASSWORD)で定義されているので、Railsのdatabase.ymlで以下のように使える。

password: <%= ENV["RDS_PASSWORD"] %>

エラーの原因を探ろうと、アプリケーションに直接潜入してみることに。

ローカルからsshでEBのEC2に入って、そこで
$ sudo docker run -i -t コンテナid bash
でdockerコンテナに入り、以下を入力しコンソールからmysqlへ接続。

$ mysql -h $RDS_HOSTNAME -u $RDS_USERNAME -p $RDS_DB_NAME
でEnter、passwordの入力を求めれ、EBで設定した先ほどのpasswordをベタ打ち、最後にEnterしてみると......

繋がった。

この結果から考えれる原因は
1. セキュリティーグループやサブネット周り
2. 環境変数が正しく定義できていない

最初はセキュリティーグループやサブネット周りの問題かと思って色々調べて試してみたが、繋がらなかった。

憔悴しきったところでまさかと思いEBのコンソールからmysqlのpasswordを変更してみると...

繋がった。

解決策

mysqlのpasswordに00000000や00000001は設定できないようだ。
22222222に変えたら通った。

考えられる原因

おそらく、Railsがmysqlへ接続する時に使う環境変数が不適切な型にconvertされてしまっているのだろう。

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

Elastic Beanstalkでrails on Docker した時のメモ

mysqlへの接続エラー

Elastic Beanstalk(EB)で環境を作成する時にmysql(RDS)も一緒に作成した。

この時にmysqlのpassword(8文字以上)の設定をしたのだが、適当に数字を入力しただけでは、Railsがmysqlに接続できない。

Mysql2::Error: Access denied for user 'username'@'host' (using password: YES)

ここで設定したpasswordは環境変数(RDS_PASSWORD)で定義されているので、Railsのdatabase.ymlで以下のように使える。

password: <%= ENV["RDS_PASSWORD"] %>

エラーの原因を探ろうと、アプリケーションに直接潜入してみることに。

ローカルからsshでEBのEC2に入って、そこで
$ sudo docker run -i -t コンテナid bash
でdockerコンテナに入り、以下を入力しコンソールからmysqlへ接続。

$ mysql -h $RDS_HOSTNAME -u $RDS_USERNAME -p $RDS_DB_NAME
でEnter、passwordの入力を求めれ、EBで設定した先ほどのpasswordをベタ打ち、最後にEnterしてみると......

繋がった。

この結果から考えれる原因は
1. セキュリティーグループやサブネット周り
2. 環境変数が正しく定義できていない

最初はセキュリティーグループやサブネット周りの問題かと思って色々調べて試してみたが、繋がらなかった。

憔悴しきったところでまさかと思いEBのコンソールからmysqlのpasswordを変更してみると...

繋がった。

解決策

mysqlのpasswordの設定で一文字でも文字列を入れてあげると問題なく繋がるようだ。数字だけ では、繋がらない。

考えられる原因

おそらく、Railsがmysqlへ接続する時に使う環境変数が文字列に変換されてしまっているのだろう。

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

MySQL SQL文の基礎をまとめる

目的

  • MySQLを用いてSQL文を学んでいるのでまとめる(SQL文は小文字で記載するがスペルがあっていれば大文字でも小文字でも問題ない)

実施環境

  • ハードウェア環境
項目 情報
OS macOS Catalina(10.15.3)
PC機種 MacBook Pro (16-inch ,2019)
プロセッサ 2.6 GHz 6コアIntel Core i7
メモリ 16 GB 2667 MHz DDR4
グラフィックス AMD Radeon Pro 5300M 4 GB Intel UHD Graphics 630 1536 MB
  • ソフトウェア環境
項目 情報 備考
MySQLバージョン 8.0.19 for osx10.13 on x86_64 Homwbrewを用いて導入

前提環境

準備

  1. 下記コマンドを実行してMySQLのターミナルを起動する。(MySQLのルートユーザのパスワードを忘れてしまった方はこちら→MySQL 8.0.18 のrootパスワードを忘れた時のリセット方法)

    $ mysql -u root -p
    
  2. MySQLにターミナルからログインできる事を確認する。(ターミナルにmysql>と表示されていればOK)

  3. use文を使ってデータベースを指定する。(データベース名一覧の出力方法はこちら→MySQL データベース作成 テーブル作成からデータの格納 取り出し)

    mysql> use データベース名;
    

コメントアウト

  • --の後に半角スペースを開けて記載した文字はコメントとして扱われる。
  • *//*で囲んだ部分もコメントとして扱われる。

テーブル内の特定のカラムに格納されている値を出力する

  • 下記を実行する。

    mysql> select カラム名
        -> from テーブル名;
    
  • 「users」テーブルの「id」カラムを出力したい場合は下記を実行する。

    mysql> select id
        -> from users;
    
  • 「users」テーブルの全てのカラムを出力したい場合は下記を実行する。

    mysql> select *
        -> from users;
    

カラムの別名定義

  • 予約語(selectなど)を使用する際に、テーブル名やカラム名を別名として定義することができる。
  • 現状基礎では必要ないように思えるが後々使用する事になるので別名定義の存在と記載方法だけ紹介する。
  • 下記の二つの構文をそれぞれの予約後と絡めて実行する。
    • テーブル名の別名を定義したい場合は本来のテーブル名 as 定義したいテーブル名となる。
    • カラム名の別名を定義したい場合は本来のカラム名 as 定義したいカラム名となる。
  • 「user」テーブルの別名を「people」と定義し、全てのカラムを出力したい場合は下記を実行する。

    mysql> select *
        -> from user as people;
    
  • 「user」テーブルの「id」カラムの別名を「user_id」と定義して「id」カラムを出力したい場合は下記を実行する。

    mysql> select id as user_id
        -> from user;
    

新しくレコードを作ってデータを格納する

  • 下記を実行する。

    mysql> insert into テーブル名
        -> (カラム名1, カラム名2, カラム名3)
        -> value ('カラム名1に追加するデータ', 'カラム名2に追加するデータ', 'カラム名3に追加するデータ');
    
  • すべてのカラムに対してデータを追加する場合、データを格納する先のカラムは指定しなくて良い

  • 下記のカラムとデータが存在するuserテーブルにidが「2」、dateが「2020-04-02」、memoが「idが2のユーザです」という情報のレコードを追加する場合は下記を実行する。

    • 追加前のテーブルの状態を下記に記載する。

      id date memo
      1 2020-04-01 idが1のユーザです
    • 下記を実行する。

      mysql> insert into user
          -> (id, date, memo)
          -> value ('2','2020-04-02', 'idが2のユーザです。');
      
    • 実行後userテーブルは下記のようにデータが追加された状態になる。

      id date memo
      1 2020-04-01 idが1のユーザです
      2 2020-04-02 idが2のユーザです

指定カラムのデータを更新する

  • テーブル内の指定カラム全てを同じ値で更新したい場合は下記を実行する。

    mysql> update テーブル名
        -> set カラム名1 = 上書きしたいデータ;
    
  • 条件付けを行い一致したレコードのカラムのデータを書き換える場合は下記を実行する。

    mysql> update テーブル名
        -> set カラム名1 = 上書きしたいデータ
        -> while 条件
    
  • 下記のカラムとデータが存在するuserテーブルのidが2のユーザのdateを「2020-04-03」に更新したい場合は下記を実行する。

    • データ更新前のテーブルの状態を下記に記載する。

      id date memo
      1 2020-04-01 idが1のユーザです
      2 2020-04-02 idが2のユーザです
    • 下記を実行する。

      mysql> update user 
          -> set date = '2020-04-03'
          -> where id = '2';
      
    • 実行後userテーブルは下記のようにデータが更新された状態になる。

      id date memo
      1 2020-04-01 idが1のユーザです
      2 2020-04-03 idが2のユーザです

指定カラムのデータを削除する

  • テーブル内の全てのカラムのデータを削除する場合は下記を実行する。(基本これは実行しない。本能的にこれは実行を禁止するレベルで覚える)

    mysql> delete from テーブル名;
    
  • 特定のレコードのカラムないのデータを削除する場合は下記を実行する。

    mysql> delete from テーブル名
        -> where カラム名 = データ;
    
  • 下記のカラムとデータが存在するuserテーブルのidが2のレコードのデータを削除する場合下記を実行する。

    • データ更新前のテーブルの状態を下記に記載する。

      id date memo
      1 2020-04-01 idが1のユーザです
      2 2020-04-03 idが2のユーザです
    • 下記を実行する。

      mysql> delete from user
          -> where id = 2;
      
    • 実行後userテーブルは下記のようにデータが更新された状態になる。

      id date memo
      1 2020-04-01 idが1のユーザです

テーブルを作成する

  • 下記を実行する。

    mysql> create table テーブル名 (初回作成カラム名1 データ型(オプション), 初回作成カラム名2 データ型(オプション));
    

テーブルを削除する

  • 下記を実行する。(文字通りそっくりそのままテーブルを削除するので実行には注意する。)

    mysql> drop table テーブル名;
    

特定のカラムを追加する

  • 新規作成されたカラムのデータはすでにいくつかのレコードが存在している場合、NULLが格納される。
  • 下記を実行する。

    mysql> alter table カラムを追加したいテーブル名
        -> add 追加したいカラム名 データ型;
    
  • 下記のカラムとデータが存在するuserテーブルのidカラムの隣にデータ型がtinyint型のnameカラムを追加したい場合は下記を実行する。

    • カラム追加前のテーブルの状態を下記に記載する。

      id date memo
      1 2020-04-01 idが1のユーザです
    • 下記を実行する。

      mysql> alter table user
          -> add name tinyint
          -> after id;
      
    • カラム追加後のテーブルの状態を下記に記載する。

      id name date memo
      1 NULL 2020-04-01 idが1のユーザです

特定のカラムを削除する

  • 下記を実行する。(文字通りそっくりそのままカラムを削除するので実行には注意する。)

    mysql> alter table users
        -> drop カラム名;
    

テーブル内のデータをターミナル上に出力する

  • 下記を実行する。

    mysql> select *
        -> from テーブル名;
    

テーブル作成時、カラム追加時に自動インクリメント(連番付与)してくれるカラムを定義する

  • テーブル作成時のカラム設定を記述する場合は下記を実行する。

    mysql> create table テーブル名
        -> 自動インクリメントを行たいカラム名 データ型 auto_incrment;
    
  • カラム追加時のカラム設定を記述する場合は下記を実行する。

    mysql> alter table テーブル名
        -> add 自動インクリメントを行たいカラム名 データ型 auto_incrment;
    

既存のカラム名を変更する

  • 下記を実行する。(データ型の記載までが必須である。)

    mysql> alter table テーブル名
        -> change 現在のカラム名 変更後のカラム名 データ型 その他の設定;
    
  • userテーブルのdateカラムのカラム名をcreate_atカラムでデータ型をdateに修正したい場合は下記を実行する。(先に記載されているdateは現在のカラム名、後に記載されているdateはカラム名をcreate_atに変更した後のデータ型)

    mysql> alter table user
        -> -- change 現在のカラム名 変更後のカラム名 データ型と記載する
        -> change date create_at date
    

既存のカラムのデータ型や設定を変更する

  • 下記を実行する。(データ型までの記載が必須である。)

    mysql> alter table テーブル名
        -> modify カラム名 変更後のデータ型 変更後のその他の設定
    
  • userテーブルのmemoカラムのデータ型をvarchar型で最大文字数を20文字に変更したい場合は下記を実行する。

    mysql> alter table user
        -> -- modify データ型などを変更したいカラム名 データ型の順に記載する。
        -> modify memo varchar(20);
    

既存カラムのデータ型、NULL制約、初期値、キー設定を表示する。

  • 下記を実行する。

    mysql> show columns from テーブル名;
    
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

Smartyを使ってみる

1 インストール

1 download
 以下のサイトよりダウンロードします。
 http://www.smarty.net/

2 インストール
 ダウンロードしたzipを解凍します。使うのはlibsフォルダのみです。
 DocumentRootにsampleフォルダを作成しサンプルアプリを置くものとして

 htdocs + sample
      └ libs      <- ダウンロードしたsmartyのlibs

 ※libsを複数プロジェクト共通で利用する場合は、
  c:\smarty3\libs 等適当な場所へ配置しましょう。

3 設定
 smartyのlibsを共通で使う場合は、php.iniのinclude_pathの設定を行います。
";"を削除し、";c:\smarty3\libs"等と追記します。

php.ini
; UNIX: "/path1:/path2"
;include_path = ".:/php/includes"
 ↓
include_path = ".:/php/includes:/usr/local/lib/smarty3/libs"
;
; Windows: "\path1;\path2"
;include_path = ".;c:\php\includes"
 ↓
include_path = ".;c:\php\includes;c:\smarty3\libs"

 その他フォルダを作成します。
 htdocs + sample
      ├ libs ← ダウンロードしたsmartyのlibs
      ├ templates ← 空のフォルダを作成
      ├ templates_c ← 空のフォルダを作成
      ├ cache ← 空のフォルダを作成
      └ configs ← 空のフォルダを作成

2 sampleアプリケーション作成

 sampleフォルダにテンプレートとプログラムを作成します。

sample.tpl
<html>
<head>
<title>Smarty Test</title>
</head>
<body>

<h1>{$msg}</h2>

</body>
</html>
sample.php
<?php
require_once('Smarty.class.php');

$smarty = new Smarty();

$smarty->template_dir = dirname(__FILE__).'/templates';
$smarty->compile_dir  = dirname(__FILE__).'/templates_c';
$smarty->config_dir   = dirname(__FILE__).'/configs';
$smarty->cache_dir    = dirname(__FILE__).'/cache';

$smarty->assign('msg','Hello World!');
$smarty->display('sample.tpl');

?>

3 設定ファイルを使う(Smarty3)

 プログラムから設定ファイルを読み込んでみます。
 まずは、configs/sample.confを作り定義します。

sample.conf
# global
url = "www.hoge.com"
title = "Smarty"

[mysql]
DSN = "mysql:dbname=sample_db; host=localhost; charset=utf8"
USER = "user1"
PASS = "user1pass"

 そして、呼出側しは

sample.php
 :
//設定ファイル読込み
$smarty->configLoad('sample.conf');
//取得
$url = $smarty->getConfigVars('url');
//テスト表示
echo "url = ".$url."<br />";

//設定ファイル読込み(セクション)
$smarty->configLoad('sample.conf', 'mysql');
//取得
$dsn = $smarty->getConfigVars('DSN');
//テスト表示
echo "dsn = ".$dsn."<br />";

$smarty->display('sample.tpl');

4 DBからの一覧表示(PDO)

 DBのm_syainテーブルを全件取得し一覧表示してましょう。
 まずは、DBまわり用のクラス

CDbAccess.php
<?php

class DbAccess {
    private $pdo;

    /**
    * コンストラクタ

    * @param $smarty smartyオブジェクト
    */
    public function __construct($smarty){
        try {
            //configs/sample.confより設定取得
            $smarty->configLoad('sample.conf', 'mysql');
            $dsn = $smarty->getConfigVars('DSN');
            $user = $smarty->getConfigVars('USER');
            $pass = $smarty->getConfigVars('PASS');

            //PDOインスタンス生成
            $this->pdo = new PDO($dsn, $user, $pass);
            //接続語にオプション指定
            //(エラー発生時に例外をスローする指定)
            $this->pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
        }

        catch(PDOException $Exception) {
            self::abort('エラー:' . $Exception->getMessage());
        }
    }

    /**
    * クローズ処理
    */
    public function close(){
        try {
            $this->pdo = null;
        }

        catch(PDOException $Exception) {
            //エラーは無視
        }
    }

    /**
    * テーブルデータ取得
    * 
    * @return テーブルデータ一覧
    */
    public function get_list(){
        try {
            //m_syainテーブルより全件取得
            $sql = "select * from m_syain where del_flg <> :delflg";
            $stt = $this->pdo->prepare($sql);
            $stt->execute(array(':delflg'=>'1'));
            //$sql = "select * from m_syain where del_flg <> ?";
            //$stt = $this->pdo->prepare($sql);
            //$stt->execute(array('1'));

            if ($list = $stt->fetchAll(PDO::FETCH_ASSOC) ){
                return $list;
            }
        }

        catch(PDOException $Exception) {
            self::abort('エラー:' . $Exception->getMessage());
        }
    }

    /**
    * フィールド名一覧取得
    * 
    * @return フィールド名一覧
    */
    public function get_keys(){
        try {
            $sql = 'show columns from m_syain';
            $stt = $this->pdo->prepare($sql);
            $stt->execute();

            while ($column = $stt->fetch(PDO::FETCH_ASSOC) ){
                $keys[] = $column['Field'];
            }
        }

        catch(PDOException $Exception) {
            self::abort('エラー:' . $Exception->getMessage());
        }
        finally {
            return $keys;
        }
    }

    /**
    * die()文字化け対策
    */
    private function abort($status=0) {
        if (is_string($status) && !headers_sent()) {
            //ヘッダにcharset追加
            header('Content-Type: text/plain; charset=UTF-8');
        }
        die($status);
    }
}

 呼出し側は

CDbAccess.php
<?php
 :
require_once ("CDbAccess.php");
 :
$smarty = new Smarty();
 :
$testdb = new DbAccess($smarty);
$keys = $testdb->get_keys();
$list = $testdb->get_list();
$values = [
       'title' => 'test',
       'head' => 'テスト',
       'keys' => $keys,
       'list' => $list
];

$smarty->assign ('values', $values);

//データベース接続終了
$testdb->close();
 :
$smarty->display('sample.tpl');
?>

 あとテンプレートは

template/sample.tpl
 :
    <h4>{$values.head}</h4>
    <table border=1 >
        {foreach $values.keys as $key}<th>{$key}</th>{/foreach}
        {foreach $values.list as $row}
            <tr>{foreach $row as $val}<td>{$val}</td>{/foreach}</tr>
        {/foreach}
    </table>
 :

5 エラー情報出力

 とりあえずphpファイルの先頭に以下の2行を入れる。

sample.php
<?php
ini_set('display_errors',1);        //1:エラー表示、0:非表示
error_reporting(E_ALL);         //エラー表示レベル(E_ALL & ~E_NOTICE等々指定)
 :

6 デバッグ

<?php
:
//デバッグコンソールを出す
$smarty->debugging = true;
:
//var_dumpで出力
var_dump($変数);
:
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

Laravelで作ったAPIを外部サーバーにおいて公開する話

はじめに

なぜ開発中のAPI外部サーバーにおいて公開することにしたのか。
なぜなら遠隔でフロントとバックの開発を同時並行で円滑に進めていくためです。

しかし、外部サーバーなど一度も使ったことがなかったのでいろいろ大変でした。

welcome画面を表示させるまで

Procfileを作成します。

Procfile
web: vendor/bin/heroku-php-apache2 public/

intlを有効化します。

アプリのホームディレクトリ
$ composer require ext-intl:*

ここからherokuの環境変数を設定していくわけなんですが、ここでまず詰まりました。

$ heroku config:set
 ›   Error: Missing required flag:
 ›     -a, --app APP  app to run command against
 ›   See more help with --help

はい、configを開こうとするとエラーが出ました。

$ heroku git:remote -a アプリ名

今までgithubと連携してそこからデプロイをしていたのですが、それが原因だったみたいです。herokuに直接デプロイすることで解決しました。
(他にも解決法はあると思います)

さあ、これでやっとwelcome画面が表示されるようになりました。

DB問題

ローカルではsqliteを使って開発していました。
herokuについて何も知らなかったのでそのままデプロイしたら使えるのだろう、と甘くみていました。
しかーし、何を試してもAPIを使おうとするとエラーを吐かれてしまいます。

なぜなら、答えは簡単「herokuはsqliteに対応していない」
herokuのDBはpgsqlだということです。
pgsqlは触ったことがなかったので、変更するならせめて触ったことのあるmysqlが精一杯でした。

どうやらherokuでもadd-onをインストールすればmysqlが使えるようになるらしいとの情報を入手。
それがこちらのClearDB
スクリーンショット 2020-04-06 0.27.37.png
このコマンドで無料版をインストールします。

$  heroku addons:create cleardb:ignite

ここでもエラーが出ました。

$ heroku addons:create cleardb:ignite
Creating cleardb:ignite on ⬢ アプリ名... !
 ▸    Please verify your account to install this add-on plan (please enter a credit card) For more information, see
 ▸    https://devcenter.heroku.com/categories/billing Verify now at https://heroku.com/verify

クレジットカード情報を入力することでこのエラーは解決します。

次にホスト名などを取得します

$ heroku config:get CLEARDB_DATABASE_URL

ここで返される値の内訳は以下の通りです。

mysql://[ユーザ名]:[パスワード]@[ホスト]/[DB名]?reconnect=true

ここで得た値をもとに環境変数を設定していきます。

$ heroku config:set \
> DB_CONNECTION=mysql \
> DB_HOST=[ホスト] \
> DB_DATABASE=[DB名] \
> DB_USERNAME=[ユーザー名] \
> DB_PASSWORD=[パスワード]

それではmigrate&seedをしていきます。

$ heroku run php artisan migrate --seed

ここでエラーが頻発しました。

  • uesrsテーブルのmigrateで問題発生

今回のAPIではusersテーブルは使用しなかったので、migrationファイルをコメントアウトして無効化するという強行策で解決。

  • どうやらmigrationの宣言の部分で問題発生

こちらも強行策で解決させました。

MySQLWorkbenchをインストールして、手動でテーブルを作成していきました。笑
スクリーンショット 2020-04-06 0.44.29.png
そして最後にseedでテストデータを入れます。

$ heroku run php artisan db:seed

これでやっとAPIが使えるようになりましたー!

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