PHPでMySQLにデータを突っ込もうぜ

関連記事： http://qiita.com/muzudho1/items/51f2ec976377625ff0f1

LAMP という言葉があるように、 Linux、Apache、MySQL、PHP は　よく使われる組み合わせのようだ。
ここで、MySQL と PHP を実際に使ってみたい。

# やりたいこと

データベースを用意する。

テーブル名: TAMESI1

|NAME|AGE|WEIGHT|
|---|---|---|
|太郎|14|50|
|二郎|13|49|
|三郎|12|48|

これぐらい　つまらないデータでいいだろう。

ここに　追加で１行

|NAME|AGE|WEIGHT|
|---|---|---|
|四郎|11|47|

ぐらい加えられたら　御の字だ。
データは　どこかのページで HTML出力して見れるようにしたい。

# データベースを作る

![Gazo](https://github.com/muzudho/HowToMakeGame/blob/master/img/2017-04/20170408a1.png?raw=true)

CORE SERVER で用意しておく。

さて……、テーブルも作っておく必要があるか。

phpMyAdmin にアクセスしようと思ったんだが、パスワードを忘れた。

とりあえず phpMyAdmin を削除して　インストールし直してみる。
入れない。

「コアサーバーでphpMyAdminにログインできない時にチェックする3つのこと」Design Color
http://designcolor-web.com/2012/04/23/coreserver-phpmyadmin/

１つ前の画面で確認できたのか。

phpMyAdmin 画面に入った。

![Gazo](https://github.com/muzudho/HowToMakeGame/blob/master/img/2017-04/20170408a2.png?raw=true)

![Gazo](https://github.com/muzudho/HowToMakeGame/blob/master/img/2017-04/20170408a3.png?raw=true)

適当にテーブルを作って、適当にデータを入れていく。

![Gazo](https://github.com/muzudho/HowToMakeGame/blob/master/img/2017-04/20170408a4.png?raw=true)

テーブルを用意したものの、次は　どうするのか。

# PHP

「[PHP] mysqli使い方まとめ（MySQL接続～SELECT実行まで）」Qiita
http://qiita.com/yasumodev/items/bd2ba476f31804d527d3

ベンキョウしよう……。

index.php

```php
<?php
// 参考: http://qiita.com/yasumodev/items/bd2ba476f31804d527d3

// mysqliクラスのオブジェクトを作成
$mysqli = new mysqli('localhost', '★DBユーザー名', '★パスワード', '★DB名');
if ($mysqli->connect_error) {
    echo $mysqli->connect_error;
    exit();
} else {
    $mysqli->set_charset("utf8");
}

// ここにDB処理いろいろ書く（後述）

// 完成済みのSELECT文を実行する
$sql = 'SELECT NAME, AGE, WEIGHT FROM TAMESI1';
if ($result = $mysqli->query($sql)) {
    // 連想配列を取得
    while ($row = $result->fetch_assoc()) {
        echo $row['NAME'] . ', ' . $row['AGE'] . ', ' . $row['WEIGHT'] . '<br />';
    }
    // 結果セットを閉じる
    $result->close();
}

// DB接続を閉じる
$mysqli->close();
```

「localhost」とそのまま書くことに　気づきにくかったが　サンプル・プログラムほとんど　そのまんまで　動いた。

![Gazo](https://github.com/muzudho/HowToMakeGame/blob/master/img/2017-04/20170408a5.png?raw=true)

# データの追加

```php
<?php
// ヒント: このファイルのエンコーディングを UTF-8 BOM有り にすること。
// 参考  : http://qiita.com/yasumodev/items/bd2ba476f31804d527d3

// mysqliクラスのオブジェクトを作成
$mysqli = new mysqli('localhost', '★DBユーザー名', '★パスワード', '★DB名');
if ($mysqli->connect_error) {
    echo $mysqli->connect_error;
    exit();
} else {
    $mysqli->set_charset("utf8");
}

// ここにDB処理いろいろ書く（後述）

// 完成済みのSELECT文を実行する
$sql = "INSERT INTO TAMESI1 (NAME, AGE, WEIGHT) VALUES ('四郎', '11', '47')";
if ($result = $mysqli->query($sql)) {
    // 成功時
    // 結果セットを閉じる
    $result->close();
}

// DB接続を閉じる
$mysqli->close();
```

![Gazo](https://github.com/muzudho/HowToMakeGame/blob/master/img/2017-04/20170408a6.png?raw=true)

テキストファイルのエンコーディングを UTF-8 BOM有り　にしたら　文字化けが直った。
$mysqli->set_charset("utf8"); のところは、 utf8mb4 だと文字化けした。

ただ、このままだと　固定データしか挿入できないので、POST文字列などを使って可変にしたい。

# 挿入するフィールド・データを可変にしたい

```php
<?php
// ヒント: このファイルのエンコーディングを UTF-8 BOM有り にすること。
// 参考  : http://qiita.com/yasumodev/items/bd2ba476f31804d527d3

// mysqliクラスのオブジェクトを作成
$mysqli = new mysqli('localhost', '★DBユーザー名', '★パスワード', '★DB名');
if ($mysqli->connect_error) {
    echo $mysqli->connect_error;
    exit();
} else {
    $mysqli->set_charset("utf8");
}

// ここにDB処理いろいろ書く

// ひな型をもとにステートメントハンドルを取得する
$sql = "INSERT INTO TAMESI1 (NAME, AGE, WEIGHT) VALUES (?, ?, ?)";
if ($stmt = $mysqli->prepare($sql)) {
    // 条件値をSQLにバインドする
    // bind_param の第１引数 "is" は後続のデータ型を表します。
    // i=integer、s=string、d=double、b=blob など。DATE型は s で良いみたいです。
    // また下記のように値を引数内に直書きすることはできません。
    // 誤）$stmt->bind_param("is", 123, "hanako");
    $name = "五郎";
    $age = 10;
    $weight = 46;
    $stmt->bind_param("sii", $name, $age, $weight);

    // 実行
    $stmt->execute();

    $stmt->close();
}

// DB接続を閉じる
$mysqli->close();
```

![Gazo](https://github.com/muzudho/HowToMakeGame/blob/master/img/2017-04/20170408a7.png?raw=true)

なんのメリットがあるのか分からないが　バインドを覚えた。
POST文字列 と対応させるには……。

# JSON も覚えないと

「PHPでJSONデータの取得の仕方」Qiita
http://qiita.com/fantm21/items/603cbabf2e78cb08133e

なかなか　うまくいかない。

グーグル・スプレッドシートの内容を rowData に入れて rensyu.php に投げるとする。

練習.gs

```js
  // JSObject to JSON
  var json = JSON.stringify(rowData);
  Logger.log(json);
  
  // POST送信のテスト
  var formData = {
    'datas': json
  };
  var options = {
   'method' : 'post',
   'payload' : formData
  };
  UrlFetchApp.fetch("http://★サイトアドレス/rensyu.php", options);
```

.gs ファイルに付いては関連記事参照。
関連記事：http://qiita.com/muzudho1/items/51f2ec976377625ff0f1

これを rensyu.php で受け取る。

rensyu.php

```php
<?php
// ヒント: このファイルのエンコーディングを UTF-8 BOM有り にすること。
// 参考  : http://qiita.com/yasumodev/items/bd2ba476f31804d527d3

if(isset($_POST['datas'])){
    $datas =json_decode( $_POST['datas'], true);

    // mysqliクラスのオブジェクトを作成
    $mysqli = new mysqli('localhost', '★DBユーザー名', '★パスワード', '★DB名');
    if ($mysqli->connect_error) {
        echo $mysqli->connect_error;
        exit();
    } else {
        $mysqli->set_charset("utf8");
    }

    // ここにDB処理いろいろ書く

    // ひな型をもとにステートメントハンドルを取得する
    $sql = "INSERT INTO TAMESI1 (NAME, AGE, WEIGHT) VALUES (?, ?, ?)";
    if ($stmt = $mysqli->prepare($sql)) {
        // 条件値をSQLにバインドする
        // bind_param の第１引数 "is" は後続のデータ型を表します。
        // i=integer、s=string、d=double、b=blob など。DATE型は s で良いみたいです。
        // また下記のように値を引数内に直書きすることはできません。
        // 誤）$stmt->bind_param("is", 123, "hanako");
        $name   = $datas[0]['名前'];
        $age    = $datas[0]['年齢(歳)'];
        $weight = $datas[0]['体重(kg)'];
        $stmt->bind_param("sii", $name, $age, $weight);

        // 実行
        $stmt->execute();

        $stmt->close();
    }

    // DB接続を閉じる
    $mysqli->close();

    echo 'insert.';
}
else
{
    echo 'error: post data not found.' . "\n";
}
```

途中　はしょったが、
これで POST文字列　にも対応できた。

やったぜ！