メインphpで // 更新系の処理を行う前にトランザクション開始(オートコミットをオフ) mysqli_autocommit($link, false); //重複データチェック*************************************************************************************************************** list ($check_contract_flg, $err_msg) = check_contract_date($link, $id, $name, $err_msg); //更新処理*************************************************************************************************************** if ($check_contract_flg) { //contract_dateへ更新処理 $err_msg = update_contract_date($link, $id, $name, $mail, $fusaick, $created_date, $corporation, $department, $hire_date, $manager, $telephone, $bring1, $bring2, $bring3, $login_name, $err_msg); }else{ //contract_dateへ登録処理 $err_msg = insert_contract_date($link, $today, $id, $name, $mail, $fusaick, $created_date, $corporation, $department, $hire_date, $manager, $telephone, $bring1, $bring2, $bring3, $login_name, $err_msg); } // トランザクション成否判定 if (count($err_msg) === 0) { // 処理確定 mysqli_commit($link); } else { // 処理取消 mysqli_rollback($link); } modelphpで //重複データチェック function check_contract_date($link, $id, $name, $err_msg) { $flg = FALSE; $data[] = ""; $count_rows = ""; $sql = "SELECT * FROM contract_date WHERE id = '$id' AND name = '$name'"; $result = mysqli_query($link, $sql); if ($result === false) { $err_msg[] = 'SQLに失敗しました!'; } else { $count_rows = mysqli_num_rows($result); while ($row = mysqli_fetch_assoc($result)) { $data[] = $row; } if ($count_rows > 0) { $flg = TRUE; } else { $flg = FALSE; } } return array($flg, $err_msg); } //contract_date用登録処理---------------------------------------------------------------------- function insert_contract_date($link, $today, $id, $name, $mail, $fusaick, $created_date, $corporation, $department, $hire_date, $manager, $telephone, $bring1, $bring2, $bring3, $login_name, $err_msg) { $err_msg= []; $msg= []; $sql = "INSERT INTO contract_date (add_day, id, name, mail, fusaick, created_date, corporation, department, hire_date, manager, telephone, bring1, bring2, bring3, changer, updated) VALUES ('$today', '$id', '$name', '$mail', '$fusaick', '$created_date', '$corporation', '$department', '$hire_date', '$manager', '$telephone' , '$bring1', '$bring2', '$bring3', '$login_name', NOW())"; $result = mysqli_query($link, $sql); var_dump($msg); var_dump($err_msg); if ($result === false) { $err_msg[] = '契約情報の登録に失敗しました!'; } else { $msg[] = '契約情報を登録しました!!'; } return array($msg, $err_msg); } //contract_date用更新処理---------------------------------------------------------------------- function update_contract_date($link, $id, $name, $mail, $fusaick, $created_date, $corporation, $department, $hire_date, $manager, $telephone, $bring1, $bring2, $bring3, $login_name, $err_msg) { $sql = "UPDATE contract_date SET mail='$mail', fusaick = '$fusaick', created_date = '$created_date', corporation = '$corporation', department = '$department', hire_date = '$hire_date', manager = '$manager', telephone = '$telephone', bring1 = '$bring1', bring2 = '$bring2', bring3 = '$bring3', changer = '$login_name', updated = NOW() WHERE id = '$id' AND name = '$name'"; $result = mysqli_query($link, $sql); var_dump($msg); var_dump($err_msg); if ($result === false) { $err_msg[] = '契約情報の更新に失敗しました・・・'; } else { $msg[] = '契約情報を更新しました!!'; } var_dump('$sql'. $sql); return array($msg, $err_msg); } 上記を実行するとメインの最終トランザクション確定部分で$err_msgにArray()…みたいなのが必ず入ってしまう ちなみに$msgにもArray()が入ってしまいます。 // トランザクション成否判定 if (count($err_msg) === 0) { // 処理確定 mysqli_commit($link); } else { // 処理取消 mysqli_rollback($link); }
追記:phpは7、mysqlは5.5、model.phpにてSQL処理後のチェック$result===falseについては他のブックでも使っており特に問題ありません
上のArray([0]=>は$msgに入り、下のArray()は$err_msgに入ってしまいます
追記2:返信まことにありがとうございます。
分かりにくい記載になり大変申し訳ありません。
やりたい事:
①DBに同ID同氏名のキーを使い重複があるかチェックをします
②重複データがある場合、update処理、ない場合insert処理をおこないたい
③その際、model.phpにてSQLの処理をおこないエラーが無く実行されれば$msgへ完了メッセージ代入
④メイン.phpにもどりSQL処理にてエラーが無い($err_msgが空)の場合、トランザクション確定
⑤最後に完了処理のためview.phpに戻り$msgのメッセージを表示して完了を予定しております
問題:
①$err_msgにArray()というデータが入ってしまうため、トランザクションが実行されない
②$msgにも…に登録しました!!というメッセージが入ることは良いのですが、Array([0])=>という余計なデータが入ってしまう
③$msgも$err_msgどちらも配列となります。またSQL実行する際に初期化しておりますが、
これらの変数に余計なデータがいったいどこで入るのかわからない状況です。
④var_dumpにて初期化した時点ですでに入っている様に思います。
※SQLのinsertとupdate文についてはphpmyadminなどで実行すると問題無く追加されます…
宜しくお願いいたします
回答1件
あなたの回答
tips
プレビュー