SHINYA TECH

公務員(行政職)から34歳でエンジニア転職した人

#8 PHPからMySQLにデータを追加する方法

f:id:kshinya-tech:20220211120815p:plain

今回はPHPからMySQLに対してSQL文を実行する方法を学びました。

SQLのINSERT文でテーブルにデータを登録する

  • INSERT分を使うと、テーブルに一行のデータを挿入する
    • $link : mysqli_connect() が返すリンクID
    • $query : SQL文の文字列 `mysqli_query ($link, $query)

SQL分実行時にエラーがあった場合、エラーメッセージを表示するようにしておく

  • mysqli_query() は実行に失敗した場合にFALSEを返すことを利用して、エラーメッセージを表示する。

複数行にまたがる文字列はヒアドキュメントで表記する

  • ヒアドキュメントを使うと、複数行の文字列をそのままコード中に記述できるので、SQL文を書くときなどに見やすくなり便利。
$sql = <<<EOT    // <<<IDをつける
INSERT INTO テーブル名 (
    カラム名1,
    カラム名2,
    ・・・
) VALUES (
    カラム1に入力する値,
    カラム2に入力する値,
    ・・・
)
EOT;    // ID。インデントしてはいけないので注意。

サンプルコード

<?php

$link = mysqli_connect('db', 'book_log', 'pass', 'book_log');

if (!$link) {
    echo 'Error: データベースに接続できませんでした' . PHP_EOL;
    echo 'Debugging error:' . mysqli_connect_error() . PHP_EOL;
    exit;
}

echo 'データベースに接続できました' . PHP_EOL;

$sql = <<<EOT
INSERT INTO companies (
    name,
    establishment_date,
    founder
) VALUES (
    'SmartHR Inc',
    '2013-01-23',
    'Shoji Miyata'
)
EOT;

$result = mysqli_query($link, $sql);
if ($result) {
    echo 'データを追加しました' . PHP_EOL;
} else {
    echo 'Error: データの追加に失敗しました' . PHP_EOL;
    echo 'Debugging error:' . mysqli_error($link) . PHP_EOL;
}

mysqli_close($link);

echo 'データベースとの接続を切断しました' . PHP_EOL;

読書ログサービスへの実装

<?php

// MySQLへの接続処理を関数として定義
function dbConnect()
{
    $link = mysqli_connect('db', 'book_log', 'pass', 'book_log');

    if (!$link) {
        echo 'Error: データベースに接続できませんでした' . PHP_EOL;
        echo 'Debugging error:' . mysqli_connect_error() . PHP_EOL;
        exit;
    }

    echo 'データベースに接続できました' . PHP_EOL;

    // データベースと切断する際に、接続情報を使用するため、returnで返す
    return $link;
}

// 読書ログ登録の関数を定義
function createReview($link)    // 引数で $link を受け取る
{
    echo '読書ログを登録してください' . PHP_EOL;
    echo '書籍名:';
    $title = trim(fgets(STDIN));

    echo '著者名:';
    $author = trim(fgets(STDIN));

    echo '読書状況(未読、読んでいる、読了):';
    $status = trim(fgets(STDIN));

    echo '評価(5点満点の整数):';
    $score = (int) trim(fgets(STDIN));  //整数として変数に格納

    echo '感想:';
    $summary = trim(fgets(STDIN));

    $sql = <<<EOT
INSERT INTO reviews (
    title,
    author,
    status,
    score,
    summary
) VALUES (
    "{$title}",
    "{$author}",
    "{$status}",
    $score,
    "{$summary}"
);      // ;で終わる。
EOT;    // EOT; の前にスペースやインデントをつけてはいけない。

    $result = mysqli_query($link, $sql);
    if ($result) {
        echo '登録が完了しました' . PHP_EOL . PHP_EOL;
    } else {
        echo 'Error: データの追加に失敗しました' . PHP_EOL;
        echo 'Debugging error:' . mysqli_error($link) . PHP_EOL . PHP_EOL;
    }
}


/* ログの表示については、あとで修正
// 読書ログ表示の関数を定義
function getReviews($reviews)
{
    echo '読書ログを表示します' . PHP_EOL;

    foreach ($reviews as $review) {
        echo '書籍名:' . $review['title'] . PHP_EOL;
        echo '著者名:' . $review['author'] . PHP_EOL;
        echo '読書状況:' . $review['status'] . PHP_EOL;
        echo '評価:' . $review['score'] . PHP_EOL;
        echo '感想:' . $review['summary'] . PHP_EOL;
        echo '-----------------' . PHP_EOL;
    }
}
*/

// MySQLとの接続処理
// 切断処理をする際に接続情報が必要なため、別途$link変数に格納している
$link = dbConnect();


while (true) {
    echo '1. 読書ログを登録' . PHP_EOL;
    echo '2. 読書ログを表示' . PHP_EOL;
    echo '9. アプリケーションを終了' . PHP_EOL;
    echo '実行したい番号(1,2,9)を入力してください:';
    $i = trim(fgets(STDIN));

    if ($i === '1') {
        // 読書ログを登録する
        createReview($link);   // 引数で $link を渡す
        /*
    } elseif ($i === '2') {
        // 読書ログを表示する
        getReviews($reviews);
        */
    } elseif ($i === '9') {
        // MySQLとの切断処理
        mysqli_close($link);
        break;
    }
}

備忘録(つまずいた点)

Debugging error:You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '��a",
    ”a",
    ”a",
    5,
    ”a"
)' at line 8

のエラーが取れないため、

echo $sql . PHP_EOL;

$sqlの中身を確認したら、

INSERT INTO reviews (
    title,
    author,
    status,
    score,
    summary
) VALUES (
    "a",
    "a",
    "a",
    5,
    "a"
)  

となっていたため、「最後に;つけないといけないのでは?」と推測し、

;を付けたら、エラーが直りました。