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

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

新規登録して質問してみよう
ただいま回答率
86.12%
GET

GETとはHTTPが対応するリクエストメソッドの一つです。クライアントからサーバーへ送られたURLパラメータのデータを取得する時必要がある時に使われます。

MySQL

MySQL(マイエスキューエル)は、TCX DataKonsultAB社などが開発するRDBMS(リレーショナルデータベースの管理システム)です。世界で最も人気の高いシステムで、オープンソースで開発されています。MySQLデータベースサーバは、高速性と信頼性があり、Linux、UNIX、Windowsなどの複数のプラットフォームで動作することができます。

mysqli

MySQLiはPHP5より導入されているデータベース用のドライバです。MySQL 4.1.3以降の新しい機能の利点をまとめています。

POST

POSTはHTTPプロトコルのリクエストメソッドです。ファイルをアップロードしたときや入力フォームが送信されたときなど、クライアントがデータをサーバに送る際に利用されます。

PHP

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

解決済

MySQLで指定(isset)されたカラムのみUPDATEしたい

iinuma-y
pariparicb

総合スコア1

GET

GETとはHTTPが対応するリクエストメソッドの一つです。クライアントからサーバーへ送られたURLパラメータのデータを取得する時必要がある時に使われます。

MySQL

MySQL(マイエスキューエル)は、TCX DataKonsultAB社などが開発するRDBMS(リレーショナルデータベースの管理システム)です。世界で最も人気の高いシステムで、オープンソースで開発されています。MySQLデータベースサーバは、高速性と信頼性があり、Linux、UNIX、Windowsなどの複数のプラットフォームで動作することができます。

mysqli

MySQLiはPHP5より導入されているデータベース用のドライバです。MySQL 4.1.3以降の新しい機能の利点をまとめています。

POST

POSTはHTTPプロトコルのリクエストメソッドです。ファイルをアップロードしたときや入力フォームが送信されたときなど、クライアントがデータをサーバに送る際に利用されます。

PHP

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

2回答

0リアクション

1クリップ

251閲覧

投稿2022/09/08 11:20

前提・実現したいこと

クエリパラメータに渡されたカラムのみ値を更新する update.php を作っています。
DBへはmysqliを使用して接続しています。
カラムは二十数個ありますが、すべてを指定する必要はなく、指定されなかったカラムは更新しないようにしたいです。
パラメータ名とカラム名は対応しており、例えば「id=taro123&age=20&pref=Tokyo」とパラメータを渡した場合、
「UPDATE table SET age = 20, pref = 'Tokyo' WHERE id = 'taro123'」のようなSQLを発行したいです。

SQLインジェクション対策が必要で、できればSQL一文で実現したいと思っています。
※WHERE句のidをユーザーが指定できてしまう脆弱性は考えなくて構いません。

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

SQLインジェクション対策のため、普段はprepare()を使用していますが、update.phpに指定できるパラメータの数も可変であるため、この場合にどのようにbind_param()に引数を与えればよいかわからず、止まってしまっています。

該当のソースコード

現状、以下のように一つずつissetでチェックして実装していますが、非常に冗長なため、もっと効率の良い方法はないでしょうか?

PHP

$db = new mysqli($dbHost, $dbUser, $dbPasswd, $dbName); if ( isset($_POST['familyName']) ) { $stmt = $db->prepare('UPDATE table SET familyName = ? WHERE id = ?'); $stmt->bind_param('ss', $_POST['familyName'], $_POST['id']); $stmt->execute(); $stmt->close(); } if ( isset($_POST['firstName']) ) { $stmt = $db->prepare('UPDATE table SET firstName = ? WHERE id = ?'); $stmt->bind_param('ss', $_POST['firstName'], $_POST['id']); $stmt->execute(); $stmt->close(); } if ( isset($_POST['age']) ) { $stmt = $db->prepare('UPDATE table SET age = ? WHERE id = ?'); $stmt->bind_param('is', $_POST['age'], $_POST['id']); $stmt->execute(); $stmt->close(); } ~~~以下、二十数カラム分続く~~~ $db->close();

考えた別解

  • prepare()を使用することを諦めて、事前にパラメータが不正でないか全てチェックし、安全なSQL文を作ってquery()で実行

PHP

$sql = 'UPDATE table SET '; if ( isset($_POST['familyName']) ) $sql .= "familyName = {$_POST['familyName']}, "; if ( isset($_POST['firstName']) ) $sql .= "firstName = {$_POST['firstName']}, "; ~~~以下続く~~~ $sql .= "WHERE id = {$_POST['id']}"; $db->query($sql);

これもif文が連続し、あまり変わらない気がしています。。。

  • 先にSELECTでデフォルト値を取得しておいて、全てのカラムを指定する

PHP

$stmt = $db->prepare('SELECT * FROM table WHERE id = ?'); $stmt->bind_param('s', $_POST['id']); $stmt->execute(); $values = $stmt->get_result()->fetch_assoc(); $values['familyName'] == $_POST['familyName'] ?? $values['familyName']; $values['firstName'] == $_POST['firstName'] ?? $values['firstName']; ~~~以下同~~~ $stmt = $db->prepare('UPDATE table SET familyName = ?, firstName = ?, ......... WHERE id = ?');

もっと美しい方法はありませんでしょうか?
またMySQL自体の扱いも不慣れで、直接の質問以外の箇所でも構文等に不自然、無駄な箇所があればご指摘頂けると幸いです。
どうか、皆様の知恵をお借りしたく、宜しくお願い致します。

以下のような質問にはリアクションをつけましょう

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

リアクションが多い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

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

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

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

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

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

適切な質問に修正を依頼しましょう。

まだ回答がついていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
86.12%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問

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

GET

GETとはHTTPが対応するリクエストメソッドの一つです。クライアントからサーバーへ送られたURLパラメータのデータを取得する時必要がある時に使われます。

MySQL

MySQL(マイエスキューエル)は、TCX DataKonsultAB社などが開発するRDBMS(リレーショナルデータベースの管理システム)です。世界で最も人気の高いシステムで、オープンソースで開発されています。MySQLデータベースサーバは、高速性と信頼性があり、Linux、UNIX、Windowsなどの複数のプラットフォームで動作することができます。

mysqli

MySQLiはPHP5より導入されているデータベース用のドライバです。MySQL 4.1.3以降の新しい機能の利点をまとめています。

POST

POSTはHTTPプロトコルのリクエストメソッドです。ファイルをアップロードしたときや入力フォームが送信されたときなど、クライアントがデータをサーバに送る際に利用されます。

PHP

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