(PHP)エックスサーバーでDB作成・DB接続

データベースを作成し、PHPで接続する方法をメモ。

今日はエックスサーバーというレンタルサーバーで行います。

私の普段のPHPの学習は侍エンジニア塾で使ってるAWS Cloud9で行っているのですが、将来的にエックスサーバーでアプリを公開したいなと思っているのでこの段階で確認しようと思いました。

以下の手順でエックスサーバーでPHPによるDB接続までをやりたいと思います。

エックスサーバーにデータベースとユーザーを作成

エックスサーバーにログインしてデータベースの項目からMySQL設定をクリック

「MySQL追加」をクリック
MySQL設定画面にてデータベース名と文字コードを設定、MySQLを追加しておきます。

「次にMySQLユーザ追加」をクリック
MySQLユーザID、パスワードを設定してユーザーを作成します。

データベースとユーザーを作成した直後は以下のようになっているので、作成したデータベースに作成したユーザーを追加します。


phpMyAdminでテーブルを作成、データを手入力

エックスサーバーログイン後のトップページから、phpmyadminをクリックします。

こんな画面が出てくるので「テーブルを新規作成」します。

カラム情報を入力します。以下のような項目を入力しました。

名前 データ型 長さ デフォルト インデックス
id INT PRIMARY
自動振番
usr VARCHAR 100
tweet TEXT 256
time DATETIME CURRENT_TIMESET

ツイッターのような簡易ブログをイメージしてみました。
IDがあって、あとはユーザー名(usr)とツイート内容(tweet)、そして投稿日時(time)が入るカラムのみです。

IDは主キーにして自動で番号が追加されていく設定(A_Iにチェック)にしています。
投稿日時も自動的に現在日時が入るようになります。

この時エラーが出たりしたんですけど
Incorrect table definition: there can be only one auto column and it must be defined as a key.

翻訳すると
不正な表定義:自動列は1つしかなく、キーとして定義する必要があります。

ちょっと意味がわからない。自動連番の列は主キーとして定義しなきゃいけないと読み取れますが、ID列はすでにそうなってるんですけど。。

よくわからないのでインデックスのPRIMARYのところをいったん外して再設定したらエラーが出なくなりました。

とりあえずこれでデータベースが作成されました。
私たちは画面上のUI操作で簡単にデータベースを作れましたけど、裏では自動生成されたSQL文が走っています。

「構造」タブをクリックすれば作成したテーブルの構造が見れます。

テストデータを入力しておきます

「挿入」タブをクリックして、以下のように入力しました。

IDは自動発番なので手入力しません。
usrには「高杉晋作」と入れて、tweetには「おもしろきこともなきよをおもしろく」と入れました。
time列は自動で日付がはいります。

SQL文を見ることができるのでみておくと

INSERT INTO DB名.テーブル名 (id, usr, tweet, time) VALUES (NULL, '高杉晋作', 'おもしろきこともなきよをおもしろく', CURRENT_TIMESTAMP);

となってました。

同様に坂本龍馬も作りました。

「表示」タブをクリックすれば。

いましがた手入力したデータがちゃんとテーブルに入っている事がわかります。

次にPHPを作成してエックスサーバーのDBへ接続してデータを読み込むのをやります。

PHPファイルを作成、DB接続して読み込んでみる

DB情報を入れた外部iniファイルを用意しておきます。

db.ini

[dbinfo]
host = 'サーバー番号.xserver.jp'
dbname = 'さっき作ったDB名'
dbusr = 'さっき作ったDBユーザ名'
dbpass = 'パスワード'

次にtweet_read.phpファイルを作成。db.iniファイルとtweet_read.phpファイルは同階層にしています。

<?php
try {
  $ini = parse_ini_file('./db.ini', FALSE);
  $db = new PDO('mysql:host='.$ini&#91;'host'&#93;.';dbname='.$ini&#91;'dbname'&#93;.';charset=utf8', $ini&#91;'dbusr'&#93;, $ini&#91;'dbpass'&#93;);

  $sql = $db->prepare('SELECT * FROM blog');
  $sql->execute();
} catch(PDOException $e) {
  die('エラーメッセージ:'.$e->getMessage());
}
?>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8" />
<title>偉人のツイート集</title>
</head>
<body>
  <h1>偉人のツイート集</h1>
  <table border="1">
  <tr>
    <th>日付</th><th>名前</th><th>ツイート</th>
  </tr>
  <?php while ($row = $sql->fetch()) { ?>
    <tr>
      <td><?php print($row&#91;'time'&#93;); ?></td>
      <td><?php print($row&#91;'usr'&#93;); ?></td>
      <td><?php print($row&#91;'tweet'&#93;); ?></td>
    </tr>
  <?php } ?>
  </table>
</body>
</html>

これをエックスサーバーにアップロードしてブラウザでアクセスすると‥結果がでました。