イントロダクション
現在、GoogleMapを使用したブラウザアプリの作成中です(2019-07-11)。
実装中につまづいたのでメモがてらに記載します。
やることとしては、PHPでMySQLにアクセス、つまりコネクションを取得して、SQLを実行するというところです。
作成プログラム概要
- JSでのGoogleMap表示
- PHPでの入力データをDBに登録
PDO to MySql
参考サイト: PHPマニュアル
確認するポイント
- phpinfo()でPDOの使用が可能か確認
そして確認ができたらMySQLでのPDOのインストール方法(使用可能か確かめる)とDPDO使用方法を参照して使い方を理解する。
行うこと
DB接続のための情報を用意する、必要になる情報は次の通りです。
- DB接続URL
- DBのユーザー名
- DBのパスワード
- 接続ドライバーの文字列
DB接続処理
-
DBコネクションの取得
$pdo = new PDO($dns, $username, $password, $driver_options);
-
PreparedStatementのセット、これで実行するSQLに値をセットする前のものを準備する
下のSQL内の「?」部分に値をセットして実行する「bind(?の順番, 値)」でセットするINSERT INTO AREA_INFO(AREA_ID, INFO_NAME, INFO_URL, INFO_IMAGE, INFO_LAT, INFO_LNG, OWNER_ID, UPDATE_DATE) VALUES(?, ?, ?, ?, ?, ?, ?, ?)
作成したコード
// DBアクセス $dns = 'mysql:host=localhost;dbname=test_dbname'; $username = DB_USER; $password = DB_PASS; $driver_options = [ PDO::MYSQL_ATTR_INIT_COMMAND => 'SET NAMES utf8', PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION, PDO::ATTR_EMULATE_PREPARES => false, ]; $insertQuery = "INSERT INTO AREA_INFO(AREA_ID, INFO_NAME, INFO_URL, INFO_IMAGE, INFO_LAT, INFO_LNG, OWNER_ID, UPDATE_DATE) VALUES(?, ?, ?, ?, ?, ?, ?, ?)"; try { $pdo = new PDO($dns, $username, $password, $driver_options); echo "tee"; $pdo->prepare($insertQuery); $pdo->bind(1, 1); $pdo->bind(2, $name); $pdo->bind(3, $url); $pdo->bind(4, $lat); $pdo->bind(5, $lng); $pdo->bind(6, $imgTmp, PDO::PARAM_LOB); $pdo->bind(7, 1); } catch(Exception $e) { print($e->getTraceAsString()); }
PreparedStatement
SQLを実行するときによく使うのがプリペアードステートメント(PreparedStatement)です。
早い話が、SQLの値部分(?)にパラメータを渡してやるものです。
Sample
- INSERT INTO A_TBL(COL_A, COL_B) VALUES(?, ?);
というSQLクエリを実行(execute)しようとしたときに下のようにコードを書きました。
$pdo->prepare($insertQuery); $pdo->bind(1, 1); $pdo->bind(2, $name); $pdo->bind(3, $url); $pdo->bind(4, $lat); $pdo->bind(5, $lng); $pdo->bind(6, $imgTmp, PDO::PARAM_LOB); $pdo->bind(7, 1);
エラリました。。。
マニュアルを見ると「bind」なんてメソッドはありませんでした。。。
なのでマニュアルに習い以下のように書き換えました。
try { $pdo = new PDO($dns, $username, $password, $driver_options); echo "tee"; $statement = $pdo->prepare($insertQuery); $statement->bindParam(":id", $id); $statement->bindParam(":name", $name); $statement->bindParam(":url", $url); $statement->bindParam(":img", $imgTmp, PDO::PARAM_LOB); $statement->bindParam(":lat", $lat); $statement->bindParam(":lng", $lng); $statement->bindParam(":owner", $ownerId); $statement->execute(); } catch(Exception $e) { print($e->getTraceAsString()); }
これでDBにデータの登録ができるようになりました。作成した画面はこちらです。
ちなみにSELECT文などは「query()」が使える。
try { $pdo = new PDO($dns, $username, $password, $driver_options); foreach ($pdo->query($selectQuery) as $row) { $tags = $tags . '<div visible="hidden" data-name="' . $row['NFO_NAME'] . '" ' . 'data-url="' . $row['INFO_URL'] . '"' . 'data-url="' . $row['INFO_LAT'] . '"' . 'data-url="' . $row['INFO_LNG'] . '">' . 'img src="data:image/jpg;base64,' . $row['INFO_IMAGE'] . '" alt="写真"' . '/div'; } // コネクションの解放 $pdo = null; } catch(Exception $e) { print($e->getTraceAsString()); } // レスポンスに出力 print($tags);
でわでわ。。。
WordPress Pluginを作った時の動画です。