質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.46%
SQL

SQL(Structured Query Language)は、リレーショナルデータベース管理システム (RDBMS)のデータベース言語です。大きく分けて、データ定義言語(DDL)、データ操作言語(DML)、データ制御言語(DCL)の3つで構成されており、プログラム上でSQL文を生成して、RDBMSに命令を出し、RDBに必要なデータを格納できます。また、格納したデータを引き出すことも可能です。

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

データベース

データベースとは、データの集合体を指します。また、そのデータの集合体の共用を可能にするシステムの意味を含めます

Q&A

解決済

1回答

1572閲覧

phpでDBで重複チェック後、DB追加できない

kou___chan

総合スコア27

SQL

SQL(Structured Query Language)は、リレーショナルデータベース管理システム (RDBMS)のデータベース言語です。大きく分けて、データ定義言語(DDL)、データ操作言語(DML)、データ制御言語(DCL)の3つで構成されており、プログラム上でSQL文を生成して、RDBMSに命令を出し、RDBに必要なデータを格納できます。また、格納したデータを引き出すことも可能です。

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

データベース

データベースとは、データの集合体を指します。また、そのデータの集合体の共用を可能にするシステムの意味を含めます

0グッド

0クリップ

投稿2021/09/04 03:55

編集2021/09/04 05:57
メイン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などで実行すると問題無く追加されます…
宜しくお願いいたします

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

coco_bauer

2021/09/04 04:55

困っている現象は、check_contract_dateを実行後、insert_contract_dateが実行されるが、その結果 $err_msg[] = '契約情報の登録に失敗しました!'; にも、 $msg[] = '契約情報を登録しました!!'; にもならず、 $err_msg=Array() あるいは、$msg=Array() になるという事でしょうか? エラーメッセージとかは出ないのですか?
ishina_yum

2021/09/04 04:58

質問の意図が読み取れないのですが、 ・あるべき結果(どのような結果が得られるはずなのか) ・現在の状態 を具体的に記載していただけるでしょうか。 ※ ここに返信ではなく、質問文の編集でお願いします
kou___chan

2021/09/04 05:58

ありがとうございます。 修正しましたので、今一度ご指導よろしくお願いします。
guest

回答1

0

ベストアンサー

その1.
insert_contract_dateもupdate_contract_dateも

PHP

1return array($msg, $err_msg);

として array に二つの値を入れて返しているので、受け取った$err_msgの中身は成功メッセージとエラーメッセージの二つが入った配列であることになります。
当然、これの要素数は2であり、0ではありえません。
つまり、count($err_msg) === 0は必ずfalseとなります。

※ ここで判定したい値はinsert_contract_dateやupdate_contract_daten内での$err_msgと思われるので、count($err_msg[1]) === 0とすると意図通りになると思います。
($err_msgという名前の変数で受けるのは止めた方が良いと思う。違うものに同じ名前を与えれば混乱するのは必然)

その2.

余計なデータが入ってしまう

エラーの有無を配列に入れられた要素の数で判定しているので、ぜんぜん『余計』ではないと思いますよ。

投稿2021/09/04 06:05

ishina_yum

総合スコア509

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

kou___chan

2021/09/04 07:26

ishina_yumさん ご返信ありがとうございます。 $err_msg[1]にしたところ、同じ状況でしたが、 ishina_yumさんの内容を参考に$msgと$err_msgの配列変数を通常の変数にしたところ、 追加できました。 次回、投稿する際はわかり易く記載しますので、 引き続きよろしくお願いいたします。 ありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.46%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問