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

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

ただいまの
回答率

90.45%

  • PHP

    24625questions

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

  • SQL

    3094questions

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

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

解決済

回答 3

投稿

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

Gatta0921

score 1

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=?」なども試しましたが、うまくいきません。

補足情報(FW/ツールのバージョンなど)

ここにより詳細な情報を記載してください。

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

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

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

    クリップを取り消します

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

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

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

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

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

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

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

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

    質問の評価を下げる

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

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

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

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

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

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

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

    詳細な説明はこちら

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

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

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

質問への追記・修正、ベストアンサー選択の依頼

  • Orlofsky

    2019/06/13 07:56

    URLは https://teratail.com/help#about-markdown の [リンク] に修正してください。

    キャンセル

  • Orlofsky

    2019/06/13 07:57

    同じSQLでもデータベースやそのバージョンによって方言が大きいですから、どのデータベースを使うのかを質問のタグで明示したり、バージョンも明記した方が適切なコメントが付き易いです。SQLの観点から Oracle Database, PostgreSQL, MySQL の特徴を整理しよう! https://www.ashisuto.co.jp/corporate/column/technical-column/detail/1197236_2274.html

    キャンセル

回答 3

checkベストアンサー

+1

bind_paramの公式リファレンスを参照してみることを勧めます
https://www.php.net/manual/ja/mysqli-stmt.bind-param.php

以下では実行できないでしょうか?

    $stmt = $mysqli->prepare("UPDATE studentinfo SET Name=?, Gender=? WHERE id=?");
        if ($stmt) {
            //プレースホルダへ実際の値を設定する
            $stmt->bind_param('ssi', $Name, $Gender, $id);
            $Name = $_POST['Name'];
            $Gender = $_POST['Gender'];
            $id = $_POST['id'];

クエリにgenderを追加して、bind_paramの第一引数のパラメータを調整、
第三引数に$Genderを追加しました。

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2019/06/13 21:59

    ご回答ありがとうございます。
    早速試してみましたが、更新できないようです。

    初心者でして、第一引数などは全く変えていなかったので、それが原因の可能性もあります。
    ありがとうございます。

    キャンセル

  • 2019/06/13 22:22

    私が修正したので問題はなさそうなのですが、まだ何かありそうですね。。。
    ・POSTにGenderが上手くわたっていない
    ・UPDATEクエリに全角スペースが入ったりしていてうまく動かない
    ・DB側のカラム設定が間違っている
    などなど、様々な要因が考えられるので試してみてください。
    それから名前だけのUPDATEでは上手くいっているようなので考え難いですが
    プリペアドステートメントが上手くきいていないのかもしれません。
    プリペアドステートメントなしで一度試してみることを勧めます。

    もちろん、プリペアドステートメントが利いてないとセキュリティ上怖いので、動作確認後は適用しましょう。

    キャンセル

  • 2019/06/14 00:15

    さらなるアドバイスありがとうございます。
    試行錯誤した結果、下記の通り性別のupdateが成功しました。

    ’$stmt = $mysqli->prepare("UPDATE studentinfo SET Name=?,Gender=?WHERE id=?");
    if ($stmt) {
    //プレースホルダへ実際の値を設定する
    $stmt->bind_param('ssi',$Name, $Gender, $id);
    $id = $_POST['id'];
    $Gender = $_POST['Gender'];
    $Name = $_POST['Name'];’

    アドバイス頂いた通り、bind_paramの部分が誤っていたようです。
    ありがとうございます。

    追加で申し訳ございませんが、調べたところ、iが整数、sが文字列となるようですが、1993-09-21というような日付の場合はどのようになりますでしょうか?

    キャンセル

  • 2019/06/14 06:45

    上手く動いたようで何よりです。
    bind_pramのパラメータは実は厳密に判断する必要はなく、
    すべてsにしても問題がなく動くはずです。

    日付の場合、sを使っても問題ありません。
    念のため、単なる数字のみはiにしてその他はsという
    区分けはしておくといいと思います。

    キャンセル

  • 2019/06/14 17:04 編集

    ありがとうございます。
    早速sにて試してみたのですが、また機能しないようです。

    昨日成功した文を下記のようにしたのですが、Birthdayを追加するだけではダメなのでしょうか。
    何度も申し訳ございませんが、何卒お力添えのほどよろしくお願いいたします。

    ```php
    if(count($errors) === 0){
    //プリペアドステートメント
    $stmt = $mysqli->prepare("UPDATE studentinfo SET Name=?,Gender=?,Birthday=? WHERE id=?");



    if ($stmt) {
    //プレースホルダへ実際の値を設定する

    $stmt->bind_param('sssi',$Birthday, $Name, $Gender, $id);
    $id = $_POST['id'];
    $Gender = $_POST['Gender'];
    $Name = $_POST['Name'];
    $Birthday = $_POST['Birthday'];
    ```

    キャンセル

  • 2019/06/14 17:09

    順番が逆ですね。
    $id = $_POST['id'];
    $Gender = $_POST['Gender'];
    $Name = $_POST['Name'];
    $Birthday = $_POST['Birthday'];
    で取得してから。
    $stmt->bind_param('sssi',$Birthday, $Name, $Gender, $id);

    キャンセル

+1

こんな感じでいかがでしょうか?

$name = filter_input(INPUT_POST, 'Name');
$gender = filter_input(INPUT_POST, 'Gender');
$id = filter_input(INPUT_POST, 'id', FILTER_SANITIZE_NUMBER_INT);
if ($name && $id && $gender) {
  $stmt = $mysqli->prepare("UPDATE studentinfo SET Name=?, Gender=? WHERE id=?");
  $stmt->bind_param('ssi', $name, $gender, $id);
  ...
}

投稿

編集

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2019/06/13 21:57

    ご回答ありがとうございます。
    現在、名前のみは更新できるのですが、性別などその他の更新ができない状況です。

    頂いたphpから性別(Gender)を追加して更新したい場合はどのような形になりますでしょうか?

    キャンセル

  • この投稿は削除されました

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 = $mysqli->prepare("UPDATE studentinfo SET Name=? WHERE id=?");
        if ($stmt) {
            $Name = $_POST['Name'];
            $id = $_POST['id'];
            $Gender = $_POST['Gender'];
            //プレースホルダへ実際の値を設定する
            $stmt->bind_param('si', $Name, $id);


じゃないでしょうか。
$Name$idがPOST受信できていない場合の動作も
設計上に対策を盛り込んでくださいね。
老婆心ながら、
POST受信に限らず、外部から受信するデータを鵜呑みにしないよう、
検証することも時には必要かもしれません。

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2019/06/12 22:24

    m6u様
    早速のご回答ありがとうございます。
    頂いた内容を試してみましたが、やはり更新されません。

    SELECT文よりPostされた文字がupdate1,update2にも入ってしまう為、データベースの内容は更新されているが内容は最初の物と同じと考えたのですが、そのような可能性はございますでしょうか?

    キャンセル

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

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

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

  • PHP

    24625questions

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

  • SQL

    3094questions

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