- SQLのINSERT文でテーブルにデータを登録する
- SQL分実行時にエラーがあった場合、エラーメッセージを表示するようにしておく
- 複数行にまたがる文字列はヒアドキュメントで表記する
- サンプルコード
- 読書ログサービスへの実装
- 備忘録(つまずいた点)
今回は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" )
となっていたため、「最後に;
つけないといけないのでは?」と推測し、
;
を付けたら、エラーが直りました。