FOR SE

文系の学部から新卒でメーカー系のSIerに就職。技術・スキルがないためブログを通して勉強。その後、IT業界の業界知識が活かせる人材業界に就職

このエントリーをはてなブックマークに追加

【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|
.hatena-module:nth-of-type(10) { background: transparent; } .hatena-module:nth-of-type(10) .hatena-module-title{ display: none; } .hatena-module:nth-of-type(10) .hatena-module-body { padding: 0; }