### PHPによるデータベースのupdate文について

こんばんは。PHP初心者です。  
現在、学生の登録システムを作成していますが、生徒情報をupdateする作業が上手くいきません。  
こちらのサイトを元にphpを作成していますが、現在名前だけは更新できるものの、他の情報の更新ができません。  
<https://noumenon-th.net/programming/2016/01/20/mysql-3/>

生徒情報を表示したページから、編集をクリックすると編集画面になり、編集画面では、前ページから引っ張ってきた情報を予めValueに入れ、変更の為の入力があった場合は変更された文字をValueに入れてデータベースの情報を更新したいと考えています。

現在、試行錯誤している為、名前と性別のupdateのみとなっております。  
update2sample.phpの49行目に「$Gender」を記入し、`UPDATE studentinfo SET Name=?, Gender=?
WHERE id=?`や`UPDATE studentinfo SET Name=:Name, Gender=:Gender WHERE
id=?`なども試しましたが、うまくいきません。

また、テストの為、色々作業を試しているのですが、実際にはデータベースの更新がされていないにも関わらず、「更新が完了しました」と表示されてしまう為、エラー表記につきましてもご教授ください。

初めての質問の為、不明点などあるかと思いますが、お力添えのほどよろしくお願いいたします。

### 発生している問題・エラーメッセージ

現在、名前は更新できるのですが、その他の内容が更新できません。  
現在は、途中の為、名前と性別のupdateを試しています。

### 該当のソースコード

**SELECT文にて下記表示**

```

    <div class="button">
    <form action="update1sample.php" method="post">
    
    
    <input type="hidden" name="id" value="<?=$row['id']?>">
    <input type="hidden" name="Name" value="<?=htmlspecialchars($row['Name'], ENT_QUOTES, 'UTF-8')?>">
    <input type="hidden" name="Gender" value="<?=htmlspecialchars($row['Gender'],ENT_QUOTES,'UTF-8')?>">
    <input type="submit" value="編集">
    </form>
    
    </div>
    
```

**updatesample1.phpの記載**

```

    require_once("db_studentinfo.php");
    $mysqli = db_connect();
    
    if(empty($_POST)) {
        echo "<a href='update1.php'>update1.php</a>←こちらのページからどうぞ";
        exit();
    }else{
        if (!isset($_POST['id'])  || !is_numeric($_POST['id']) ){
            echo "IDエラー";
            exit();
        }else{
            //プリペアドステートメント
            $stmt = $mysqli->prepare("SELECT * FROM studentinfo WHERE id=?");
            if ($stmt) {
                //プレースホルダへ実際の値を設定する
                $stmt->bind_param('i', $id, $Name, $Gender);
                $id = $_POST['id'];
                $Name = $_POST['Name'];
                $Gender = $_POST['Gender'];
    
                //クエリ実行
                $stmt->execute();
    
                //結果変数のバインド
                $stmt->bind_result($id,$Name,$Gender);
                // 値の取得
                $stmt->fetch();
    
                //ステートメント切断
                $stmt->close();
            }else{
                echo $mysqli->errno . $mysqli->error;
            }
        }
    }
    
    <body>
    <h1>変更画面</h1>
    
    <p>変更箇所を入力してください</p>
    <form action="update2sample.php" method="post">
    <p>名前：<input type="text" name="Name" placeholder="" value="<?=htmlspecialchars($Name, ENT_QUOTES, 'UTF-8')?>"></P>
    <p>性別：<input type="text" name="Gender" placeholder="" value="<?=htmlspecialchars($Gender, ENT_QUOTES, 'UTF-8')?>"></P>
    
    
    <input type="hidden" name="id" value="<?=$id?>">
    <input type="submit" value="変更する">
    </form>
    
    </body>
    
```

**updatesample2.phpの記載**

```

    header("Content-type: text/html; charset=utf-8");
    
    require_once("db_studentinfo.php");
    $mysqli = db_connect();
    
    if(empty($_POST)) {
        echo "<a href='update1.php'>update1.php</a>←こちらのページからどうぞ";
        exit();
    }else{
        //名前入力チェック
        if (!isset($_POST['Name'])  || $_POST['Name'] === "" ){
            $errors['Name'] = "名前が入力されていません。";
        }
    
        if(count($errors) === 0){
            //プリペアドステートメント
            $stmt = $mysqli->prepare("UPDATE studentinfo SET Name=? WHERE id=?");
            if ($stmt) {
                //プレースホルダへ実際の値を設定する
                $stmt->bind_param('si', $Name, $id);
                $Name = $_POST['Name'];
                $id = $_POST['id'];
                $Gender = $_POST['Gender'];
    
    
    
                //クエリ実行
                $stmt->execute();
                //ステートメント切断
                $stmt->close();
            }else{
                echo $mysqli->errno . $mysqli->error;
            }
        }
    }
    <h1>変更画面</h1>
    
    <?php if (count($errors) === 0): ?>
    <p>変更完了しました。</p>
    <?php elseif(count($errors) > 0): ?>
    <?php
    foreach($errors as $value){
        echo "<p>".$value."</p>";
    }
    ?>
    <?php endif; ?>
    
    </body>
    
```

### 試したこと

`update2sample.php`の49行目に`$Gender`を記入し、`UPDATE studentinfo SET Name=?,
Gender=? WHERE id=?」や「UPDATE studentinfo SET Name=:Name, Gender=:Gender WHERE
id=?`なども試しましたが、うまくいきません。
CC BY-SA 4.0
2019-06-12T11:35:48.783
55724
2023-05-13T09:04:35.653
2019-12-09T00:19:05.267
32986
34682
question
php sql
PHPによるデータベースのupdate文について
updatesample1.php

  * SELECT文で取得した内容を表示しているので POST で $Name, $Gender を与える必要な無いと思います。

```

       if ($stmt) {
            //プレースホルダへ実際の値を設定する
            $stmt->bind_param('i', $id);
            //$Name = $_POST['Name'];               <-この行は不要
            $id = $_POST['id'];
            //$Gender = $_POST['Gender'];           <-この行は不要
    
```

updatesample1.php

  * UPDATE 文は `UPDATE studentinfo SET Name=?, Gender=? WHERE id=?` で大丈夫です。
  * `bind_param()` で `$Name`, `$Gender`, `$id` を UPDATE文 のパラメータにバインドしてください。
  * 最初の引数は バインド変数の型を表します。Genderの型が文字列であれば `ssi` です。

```

            // SET句に Gender を追加
            $stmt = $mysqli->prepare("UPDATE studentinfo SET Name=?, Gender=? WHERE id=?"); 
            if ($stmt) {
                // SQLパラメータに変数をバインド。? の出現順にそれぞれ次をバインドする
                //  1. 値：$Name    型:s(文字列)
                //  2. 値：$Gender  型:s(文字列)
                //  3. 値：$id      型:i(整数)
                $stmt->bind_param('ssi', $Name, $Gender, $id);
    
```

こんな感じではないでしょうか。

ご参考までに、マニュアルを見るなどして、SQLとbind_param() の関係を 一度整理してみると
理解が早くなるかと思います。<https://www.php.net/manual/ja/mysqli-stmt.bind-param.php>
CC BY-SA 4.0
2019-06-13T06:21:11.383
55748
2019-06-13T06:21:11.383
5008
55724
answer