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

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

ただいまの
回答率

87.37%

php sql 更新

受付中

回答 2

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 634

score 21

sqlのupdate文について解決できない問題があります。
form.phpで変更したいブランド、メーカー名をセレクトボックスで選び変更を押すと

update.phpで
まず、その変更予定の組み合わせが重複しているか調べ
重複していれば変更させずに戻します。
重複がなければ、変更を完了する。の流れをしたいのですが
変更をすると、名前は変わるのですがIDはそのままになってしまっています。
下記が動作の例です


変更点以下

データはデータベースに登録しております
brandTable

updateの時に起こってしまうことは maker tableに下記の情報が入っているとして
maker_id /maker_name
1 aaa
2 bbb
3 ccc

ブランドテーブルには下記の一件のデータが登録されてるとし
主キー          外部キー
ブランドID ブランド名前 メーカーid メーカー名前
1               aaa              1             aaa

メーカー名を登録されている3 cccに変更しようとすると
1               aaa              1             ccc

登録後のmaker tableを見ると
maker_id /maker_name
1 ccc
2 bbb
3 ccc
このように、名前が変更されて名前の登録の重複が起きてしまいます。

理想は
maker_id /maker_name
1 aaa
2 bbb
3 ccc

のままで、登録後を
1 cccではなく
3 cccにするようにしたいです。

どのようにupdate文を変えると正常に動作しますでしょうか?
すいませんが、よろしくお願いします。

form.php


<!DOCTYPE html>
<html>
<head>
    <title></title>
</head>
<body>
    <form method="POST">
          <div id="categories">
            <tr>
              <td><input type="checkbox" value=""></td>
              <td><input type="text" name="edit_brand_id" value="ぶらんどID" readonly="readonly"></td>
              <td><select name="edit_brand_name">
                    <option>現在選択中</option>
                    <option>選択候補</option>
                  </select>
              </td>
              <td><input type="text" name="edit_maker_id" value="めーかーID" readonly="readonly"></td>
              <td><select name="edit_maker_name">
                    <option>現在選択中</option>
                    <option>選択候補</option>
                  </select>
              </td>
              <td><input type="submit" name="change" value="変更">
              </td>
          </tr>
      </div>
  </form>
</body>
</html>
update.php

if(isset($_POST['update']) === TRUE){
        $edit_brand_id = $_POST['edit_brand_id'];
        $edit_brand_name = $_POST['edit_brand_name'];
        $edit_maker_id = $_POST['edit_maker_id'];
        $edit_maker_name = $_POST['edit_maker_name'];

      try{
        //変更入力の組み合わせがすでに存在しているか判定
        $pdo -> beginTransaction();
        $sql = 'SELECT brand_id, brand.maker_id FROM brand INNER JOIN maker ON brand.maker_id = maker.maker_id WHERE brand_name = :brand_name AND maker_name = :maker_name';
        $stmt = $pdo -> prepare($sql);
        $stmt -> bindValue(':brand_name', $edit_brand_name, PDO::PARAM_STR);
        $stmt -> bindValue(':maker_name', $edit_maker_name, PDO::PARAM_STR);
        $stmt -> execute();
        $count = $stmt -> rowCOunt();
        if($count > 0){
          header('Location: ./brand.php');
          exit();
        }

        //存在していなければ更新
        $sql = 'UPDATE brand INNER JOIN maker ON brand.maker_id = maker.maker_id SET brand_name = :brand_name, maker.maker_name = :maker_name WHERE brand_id = :brand_id AND brand.maker_id = :maker_id ';
        $sth = $pdo -> prepare($sql);
        $sth -> bindValue(':brand_id', $edit_brand_id, PDO::PARAM_INT);
        $sth -> bindValue(':brand_name', $edit_brand_name, PDO::PARAM_STR);
        $sth -> bindValue(':maker_id', $edit_maker_id, PDO::PARAM_INT);
        $sth -> bindValue(':maker_name', $edit_maker_name, PDO::PARAM_STR);
        $sth -> execute();
        $pdo -> commit();
        var_dump($sth);
      }catch(PDOException $e){
        $pdo -> rollBack();
        echo $e -> getMessage();
      }
    }
  • 気になる質問をクリップする

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 2

0

質問主旨が理解できなかったのですが、コード上の怪しげなところが気になったので回答します

PDOStatement::rowCount の解釈に誤りがあります。

また、if($count > 0) の条件分岐で true になってしまうと、Transaction の途中で別ページに飛ぶことになります。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2019/09/08 10:09

    ご回答ありがとうございます。

    sql文の修正いたしました。
    あとすいません本文で誤りがあった部分も変更しました。

    キャンセル

0

maker_nameにunique属性をつけるのではダメですか?

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

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

  • ただいまの回答率 87.37%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る