コードを書いてくらす

プログラミングについて書いてます。

データベースを使ってみる

前回、php内に配列で作った祝日リストをデータベースにしてみます。
まずはCloud9でmySQLのセットアップ。インストールは済んでいるようだったのでそのままsandboxというデータベースとholidaysというテーブルを作成しました。

docs.c9.io

ここで大変だったのは、テキストファイルから直接読み込ませたかったのですが、どうもコマンドを受け付けてくれませんでした。ログイン時のオプションで許可してあげなければならないようなんですが、オプションの指定の仕方が調べきれませんでした。なのでちまちまとINSERT文を作ってデータを登録。ところが、データベースの文字コードがデフォルトでlatin1になっているために見事に文字化けというありがちなパターン。本当はデータベース本体の文字コードをutf8に変更してやらなければならないのですが、うまく調べられなくてとりあえずはalter tableで列の文字コードをutf8に変更しました。さらに登録済みの文字化けデータをまたUPDATE文でちまちまと修正…。
そんなこんなでようやく日本語が表示されました。

f:id:matildatilda:20150618151700p:plain


次にphpから接続してみます。docs.c9.io

ここを見るとphpで接続するサンプルコードがあるのでこれをコピペして、処理を追加します。

<?php
    //https://docs.c9.io/v1.0/docs/setting-up-mysql
    
    // A simple PHP script demonstrating how to connect to MySQL.
    // Press the 'Run' button on the top to start the web server,
    // then click the URL that is emitted to the Output tab of the console.

    $servername = getenv('IP');
    $username = getenv('C9_USER');
    $password = "";
    $database = "sandbox";
    $dbport = 3306;

    // Create connection
    $mysqli = new mysqli($servername, $username, $password, $database, $dbport);

    // Check connection
    if ($mysqli->connect_error) {
        die("Connection failed: " . $mysqli->connect_error."\n");
    } 
    echo "Connected successfully (".$mysqli->host_info.")\n";

    $mysqli->select_db('sandbox');
    $mysqli->query("SET NAMES utf8");

    $result = $mysqli->query("SELECT * FROM holidays");
    if (!$result) {
        die("Query failed. (" .mysql_error(). ")\n");
    }
    
    header("Content-Type: text/html; charset=UTF-8");
    
    while ($row = $result->fetch_row()) {
        printf ("%s/%s:%s\n", $row[0], $row[1], $row[2]);
    }

    $result->close();
    $mysqli->close();
?>

サーバー名(IP)やユーザー名(C9_USER)は環境変数から取得しているようです。
これはbashタブでechoコマンドを使って表示してみると内容がわかります。

echo $IP

bashコマンドも実はよく知らないのでよくよくは習得していきたいですね。
いろいろと間違えていたのもあるのですが、最初はエラーを吐いて接続できませんでした。が、なぜかいろいろやっているうちに接続できるように…。こうやって試行錯誤していると問題をきちんと把握しないうちに解決してしまって結局原因が分からずじまいのまま、まあいっかとなってしまうことがあります。が、まあいっか。


phpを実行してテーブルの内容を取得するとまた文字化けが発生。まずは、1.出力の文字コードをutf8に設定するheaderを指定する、2. データベース接続にNAMESを設定する(?)でとりあえず回避できました。1は理解できるけど、2がなんなのかよく分かっていません。が、こんな感じで出力できました。

f:id:matildatilda:20150618152635p:plain


いろいろやってみると知識が不足しているのがよく分かります。分からないなりにリストを作ってまとめてみます。

  1. 基本的なbashコマンドを知らない。echo, lsくらい。
  2. phpでのデータベース接続方法には何種類かある。ググると現在(PHP5)は非推奨のものもあるので注意。
  3. php文字コードの確認や設定方法が分からない。どこかにphp.iniがある?
  4. mySQLサービスのオプション付き起動方法が分からない。
  5. mySQデータベースの文字コードの設定方法が分からない。設定ファイルを編集するらしいがどこにあって、どうやってやるのか分からない。


テーブルを作ってデータを登録して、それを出力する。webアプリケーションは、たったそれだけをするのにも、動いているサービスや知っていなければならない知識が多くて驚きます。さらに実用ではセキュリティのことも考えなければいけないので、本当に大変なんですね。


というわけで疲れました。
今日はこの辺で。