LoginSignup
chika_MM
@chika_MM (chika)

Are you sure you want to delete the question?

Leaving a resolved question undeleted may help others!

必須項目のラジオボタンの値をINSERTすると「0」と反映される

解決したいこと

必須項目にしているラジオボタン(47個)の値をMySQLへINSERTすると時々「0」と反映させてしまうため改善したいです。
47個のカラムすべてが「0」になる場合と、途中のカラムが「0」になる場合があります。

何かヒントや解決方法がありましたらご教授いただけると助かります。
よろしくお願いいたします。

phpバージョン

7.4

データベースサーバ

・Server type: MySQL
・サーバのバージョン: 5.6.23-log - MySQL Community Server (GPL)
・プロトコルバージョン: 10

MySQLカラムのデータ型

int(11)

該当するソースコード

<!-- 下記が47個分あります -->
<label><input name ="data[q1]" type="radio" value="1" required>そうだ</label>
<label><input name ="data[q1]" type="radio" value="2">まあそうだ</label>
<label><input name ="data[q1]" type="radio" value="3">ややちがう</label>
<label><input name ="data[q1]" type="radio" value="4">ちがう</label>
  $dbh=new PDO($dsn,$user,$password);
  $dbh->setAttribute(PDO::ATTR_ERRMODE,PDO::ERRMODE_EXCEPTION);

  $keys = array_keys($data);
  $columns = implode(',', $keys);
  $values = ':'.implode(',:', $keys);
  $sql = 'INSERT INTO ****** ('.$columns.') VALUES ('.$values.')';
  $st = $dbh->prepare($sql);
  $st->execute($data);

テーブル1.PNG

テーブル2.PNG

0

1Answer

考えられるのは、データが無いのでデフォルト値になった、というケースです。

送られたデータに不足がある、あるいはデータをSQLにする過程に不備がある、という可能性はないでしょうか?

ちなみにrequired属性がついているので通常の操作では入力必須になると思いますが、
HTMLはユーザがデータを入力しやすくするためのもので、送信されるデータを保証するものではありません。
ですので開発中に予期せぬ形で処理が実行されてしまったケースも考えられます。

0Like

Comments

  1. @chika_MM

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

    >送られたデータに不足がある、あるいはデータをSQLにする過程に不備がある、という可能性はないでしょうか?

    →各設問の回答を合計したカラム(データ型:int(11))は「0」とはならず、反映されているようなので、可能性は低めなのかなと考えておりました。
    data[q1]と同じ配列で同時にINSERTしています。

    今回の事象は、自分のPCで複数回実行した際に出たことですので
    もしかしたらその影響があるのかもしれませんが、
    本番の際に起こりうることだったら対処したいと思っております。


    >HTMLはユーザがデータを入力しやすくするためのもので、送信されるデータを保証するものではありません。
    ですので開発中に予期せぬ形で処理が実行されてしまったケースも考えられます。

    →こちらは、required属性がついていてもスルーされることがあるということでしょうか?
    その可能性があるならjsで制御しようかなと思います。


    初めてweb開発を行っており、楽しいですが様々な事象があるので
    意見をいただけることはうれしいです。
    ありがとうございます。


  2. > →こちらは、required属性がついていてもスルーされることがあるということでしょうか?
    > その可能性があるならjsで制御しようかなと思います。

    というより、サーバに送られてきたデータは一切信用できるものではありません。
    例えばHTMLやcss、jsなどクライアントサイドで動くものは、ブラウザの機能にある開発ツールなどで任意に変更することができます。(もちろんサーバ上にあるものは直接変更できません)
    そもそもフォームなど関係なくデータを送ることもできます。

    フォームを書類の様式、action属性のURLは特定の住所と考えてください。
    書類の様式は決まっているものの無視して適当に記入することが出来ますし、
    住所にはその書類以外のものを送ることも出来ます。
    (もちろん受理されるかは別の問題ですが)

    ですのでフォームやrequired属性などは、ユーザが分かりやすいようにするためのもの、でしかなく、
    受信したデータが正しいものかは別の話です。
  3. @chika_MM

    Questioner
    お教えいただきありがとうございました。
    いろいろと調べてみたら、POSTはしっかりできており、
    foreachで別の配列に入れるときに抜けてしまっていました。

    新しい質問をたてて、ヒントをいただこうと思います。

Your answer might help someone💌