【解決方法】デフォルトでNULLの場合、mysqlレコード列を追加する方法は?


「追加」というmysqlテーブルがあります。 各レコードには次の列があります。

ID、体重、ユーザー名、メールアドレス、パスワード

weight 列にはデフォルトの NULL 値があります。 テキストタイプです。

重み列を UPDATE して CONCAT したい場合 (値がまだ NULL の場合) は機能しません。 エラーはなく、成功したと言えます。 しかし、更新後の phpmyadmin に見られるように、「重み」に違いはありません。

しかし、手動で重みに値を追加し、CONCAT を更新しようとすると、完全に機能します。

「重み」にまだ値がない場合に、コードを CONCAT に変更する方法。
問題は NULL 値にある可能性があります! 「重み」にデフォルト値を追加したくありません。
IFステートメントは必要ですか? しかし、どのように?

私が試したこと:

PHP
$sql = "UPDATE append SET weight = CONCAT(weight, ',$weight') WHERE id = '" . $_SESSION['user']['id'] . "'";

if ($conn->query($sql) === TRUE) {
    echo "Successful!";
} else {
    echo "Error: " . $sql . "<br>" . $conn->error;
}

解決策 1

デフォルト値を空の文字列に設定することで解決した問題に対する答えではありませんが、悪い習慣を形成する前に今すぐ解決する必要があります!

コードは SQL インジェクション攻撃に対して脆弱です – SQL コマンドを作成するために文字列を連結しないでください

見る SQL インジェクション攻撃とその防止方法に関するヒント[^]
SQL インジェクションとクロスサイト スクリプティング[^]
SQL インジェクションの防止 – OWASP チート シート シリーズ[^]

また、Dave Kreskowiak からのコメントにも十分注意してください。保存するデータには正しい列タイプを使用してください。

最後に、ヌルを適切に処理する方法をここで学ぶことができます – https://dev.mysql.com/doc/refman/8.0/en/working-with-null.html[^]

解決策 2

解決策を見つけたとしても、それはおそらく良いものではありません。
デイブが言ったように、重量は数値であるため、テキスト形式で保存すると、後で実際にデータを使用したい場合に問題が発生します。たとえば、最大値を見つけたり、平均を計算したりします。

より良いアイデアは、このテーブルの ID 列に関連付けられ、各行に 1 つの数値の重みを追加する外部キーを持つ 2 番目のテーブルを使用することです。 その後、JOIN を使用してこれらを元のテーブルと結合し、データを非常に簡単に処理できます。 また、UPDATE (多くの重みを追加すると非常にコストがかかる可能性があります) は必要ありませんが、重みと ID 値を使用する単純な INSERT は必要ありません。

コメント

タイトルとURLをコピーしました