HerokuとPHPでLineのDB接続されたチャットボットを作る3(DB接続"接続"編-PDO, prepare, fetch-)
前回:
1. 簡単なBotの作成(おうむ返し)
2. データベース接続(準備)
3. データベース接続(接続)
4. 曖昧検索等の処理
5. 返信処理
DBへ実際に接続する。
Workbenchにテスト用データの追加
とりあえずDBにテスト用のデータを登録する。
Workbenchを開き、前回接続したConnectionsをクリックして接続。
タブのSchemasへ移動して、Tableを右クリック→Create Table
テーブル名を適当につけて、カラムも適当に2行ぐらい追加。
そして、右下のApplyを押して実行することで新しくテーブルが作成される。
次はとりあえずデータの挿入。
左メニューから該当のテーブルを右クリック→Send to SQL Editor→Insert Statementを選択。
デフォルトでInsert文が入っているので、Valuesに入れたい内容を入力して、左上の赤丸部分を押して実行。
成功すると下のAction Outputに緑色のアイコンのメッセージが表示される。(エラーの場合は赤。)
ただ、正直ちょっとめんどくさいので直接表いじって編集できる方法あったら知りたい。
テストデータへアクセス(関数の呼び出し、PDO)
次、とりあえずテストデータにアクセスする。
前回書いた
function dbConnect(){
$db = parse_url($_SERVER['CLEARDB_DATABASE_URL']);
$db['dbname'] = ltrim($db['path'], '/');
$dsn = "mysql:host={$db['host']};dbname={$db['dbname']};charset=utf8";
$user = $db['user'];
$password = $db['pass'];
$options = array(
PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION,
PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC,
PDO::MYSQL_ATTR_USE_BUFFERED_QUERY =>true,
);
$dbh = new PDO($dsn,$user,$password,$options);
return $dbh;
}
この関数を呼び出す。
$dbh = dbConnect();
これで$dbhにインスタンス化されたPDOクラスが入った。(表現あってる?)
記述の場所は呼び出される場所であればどこでも。今回は、
require_once('./LINEBotTiny.php');
の下に書いた。
次にデータの呼び出し。
下記のコードを関数を呼び出した下あたりに追加。今回は接続が確認できればOKとするので場所は気にせず。
$sql = $dbh->prepare("SELECT * FROM test_table");
$sql->execute();
$result = $sql->fetch();
1行目:$dbhからprepareメソッドを呼び出し、データ呼び出しのSQL文を引数として$sqlに格納。
prepareメソッドは名前の通り準備するやつ。今回はないけれど変数を含んだSQL文を扱える。
2行目:executeメソッドで先ほどのSQL文を実行
3行目:結果をfetchを使い$resultに格納。
fetchとfetchAllの違いがいまいちわかってないけど、とりあえずfetchは1行だけ取得で、fetchAllは該当したものすべて取得、の認識。
その他参考
取得した値を変数に格納
これで値は$resultに格納したので、いよいよ返信として設定する。
配列をそのまま返信にしても中身が表示されないので、とりあえず
$res = print_r($result, TRUE);
$resにprint_r使って出した中身を格納。
因みにprint_rは引数にTRUEを入れないと中身を表示してくれない。(知らなくてめっちゃここハマった。)
Botがデータの内容を返信するように編集
そして$resは、
$client->replyMessage([
'replyToken' => $event['replyToken'],
'messages' => [
[
'type' => 'text',
'text' => $res
]
]
]);
6行目の'text' => に記述。
これで返信が取得したデータになる。
Botにメッセージを送ると
と、さっき登録した内容が表示。
(因みにprint_rにTRUE入れてないとこうなる)
これで接続が確認された。
この次はChatbotの処理を作ってく。
まずは、曖昧検索の実装。
例えば、”マグドナルド”のデータに”マクド”、”マック”と入れても出てくるようにする。
処理の仕方等、この先は完全に自分で考えて作ったので、こっちの方が効率いいとかあったらお願いします。