【php・mysql・javascript】DB連携メモ~現在のレコードの値から発行するsqlを変える・動的に追加するリストidの整合性を保つ~
【今回の紹介】
前回はDBとWebtodoリストを連携する過程で勉強になったことを紹介しました。
勉強になったことは全体としては、
①CUIでテーブルを定義する
②複数の値をPOSTし、DBへ登録する
③現在のデータを見て、SQLを発行する
④再度リクエストしても整合性のあるidが発行される
がありました。
前回は、
①CUIでテーブルを定義する
②複数の値をPOSTし、DBへ登録する
を紹介したので、
今回は
③現在のデータを見て、発行するsqlを変える
④再度リクエストしても整合性のあるidが発行される
を紹介したいと思います。
【内容】
まずは、
③現在のデータを見て、発行するsqlを変える
紹介したいと思います。
※自分が紹介する処理の流れ以外で、もっと効率的な書き方が絶対あると思いますが、
現在のレコードを取得し、そのカラムの値に応じて
発行する発行するsqlを変えるということができるということが発見がうれしかったので
紹介します。
実装した時の処理の流れとしては
①指定したリストの情報を引数(IDとカテゴリー)としてをphpに渡す
②php側で受け取った引数をもとに特定のレコードを取得(sqlを発行)
③取得したレコードのカラムの値をもとに以下のような条件分岐を行う
・取得した値が指定したカテゴリーであれば、引数のカテゴリの値で更新sqlを発行
・指定のカテゴリーでなければ、更新sqlを発行し、削除フラグを立てる。
<抜粋ソース>
①指定したリストの情報を引数(IDとカテゴリー)としてをphpに渡す
$input=$_POST['send_value']; $inputs=explode(",",$input);
②php側で受け取った引数をもとに特定のレコードを取得(sqlを発行)
$mysqli=new mysqli('localhost','sa','qwertyuiop@1','db_01'); if($mysqli->connect_error){echo "DB接続できませーん";} $stmt=$mysqli->prepare("SET NAMES utf8"); $stmt->execute(); $stmt=$mysqli->prepare("select category from t_01 where id='$inputs[0]'") or exit("セレクト文失敗"); $stmt->execute();
③取得したレコードのカラムの値をもとに以下のような条件分岐を行う
・取得した値が指定したカテゴリーであれば、引数のカテゴリの値で更新sqlを発行
・指定のカテゴリーでなければ、削除フラグを立てる更新sql発行。
if($result_category=='frame_toDo' || $result_category=='frame_Doing'){ $mysqli=new mysqli('localhost','sa','qwertyuiop@1','db_01'); if($mysqli->connect_error){echo "DB接続できませーん";} $stmt=$mysqli->prepare("SET NAMES utf8"); $stmt->execute(); $stmt=$mysqli->prepare("update t_01 set category='$inputs[2]',update_time='$time' where id='$inputs[0]'") or exit("変更文に問題ありー"); $stmt->execute(); $mysqli->close(); }else{ $mysqli=new mysqli('localhost','sa','qwertyuiop@1','db_01'); if($mysqli->connect_error){echo "DB接続できませーん";} $stmt=$mysqli->prepare("SET NAMES utf8"); $stmt->execute(); $stmt=$mysqli->prepare("update t_01 set delflg='1' where id='$inputs[0]'") or exit("削除分に問題ありー"); $stmt->execute(); $mysqli->close(); }
<全体ソース>
<?php header('Content-Type: text/html; charset=UTF-8'); $input=$_POST['send_value']; $inputs=explode(",",$input); $time=date("Y-m-d H:i:s"); $mysqli=new mysqli('localhost','sa','qwertyuiop@1','db_01'); if($mysqli->connect_error){echo "DB接続できませーん";} $stmt=$mysqli->prepare("SET NAMES utf8"); $stmt->execute(); $stmt=$mysqli->prepare("select category from t_01 where id='$inputs[0]'") or exit("セレクト文失敗"); $stmt->execute(); $stmt->bind_result($result_category); $stmt->fetch(); $mysqli->close(); if($result_category=='frame_toDo' || $result_category=='frame_Doing'){ $mysqli=new mysqli('localhost','sa','qwertyuiop@1','db_01'); if($mysqli->connect_error){echo "DB接続できませーん";} $stmt=$mysqli->prepare("SET NAMES utf8"); $stmt->execute(); $stmt=$mysqli->prepare("update t_01 set category='$inputs[2]',update_time='$time' where id='$inputs[0]'") or exit("変更文に問題ありー"); $stmt->execute(); $mysqli->close(); }else{ $mysqli=new mysqli('localhost','sa','qwertyuiop@1','db_01'); if($mysqli->connect_error){echo "DB接続できませーん";} $stmt=$mysqli->prepare("SET NAMES utf8"); $stmt->execute(); $stmt=$mysqli->prepare("update t_01 set delflg='1' where id='$inputs[0]'") or exit("削除分に問題ありー"); $stmt->execute(); $mysqli->close(); } ?>
次に
④再度リクエストしても整合性のあるidが発行される
を紹介します。
どういう場面でこの処理が必要になったのか少し説明します。
Todoリストなので、リストの追加(html要素の生成)を行うんですね。
以下の作業を行うと、IDの整合性がなくなってしまいました。
ページを開き直すたびにIDが1から始まってしまいます。
①その際、一度画面を開いて追加する。
②一度閉じ、もう一度ページを開き直し、リストを追加する
なので、前回いくつまでリストを追加したのかという情報を
画面を開いたときに取得し、htnl要素を追加するjsにパラメータとして
渡しておくという処理が必要になったんです。
実装したのは以下のような処理の流れの
プログラムです。
①DBから最もIDの大きいレコードを取得
②取得したレコードのIDに+1をする
③IDに+1の値をjs側に渡す
【抜粋ソース】
①DBから最もIDの大きいレコードを取得
②取得したレコードのIDに+1をする
<?php $mysqli=new mysqli('localhost','sa','qwertyuiop@1','db_01'); if($mysqli->connect_error){echo "DB接続できませーん";} $stmt=$mysqli->prepare("SET NAMES utf8"); $stmt->execute(); $stmt=$mysqli->prepare("select id from t_01 order by id desc limit 1 ") or exit("error"); $stmt->execute(); $stmt->bind_result($result_id); $stmt->fetch(); $last_id=$result_id; $last_id=$last_id+1; ?>
③IDに+1の値をjs側に渡す
※jsに関しては、phpファイルに
の形で埋め込んでいるので、jsの変数に値を渡す際にも
「$last_id」で受け渡すことができました。
count=$last_id;
||<>|php|