アプリケーションのさまざまなオプションのそれぞれのフィールドを含むデータベーステーブルUSER_OPTIONSがあり、次のように効果的に表示されます。
USER_ID | OPTION_1 | OPTION_2 | OPTION_3 | ... | OPTION 20
----------------------------------------------------------
100 | true | true | false | ... | false
101 | true | true | false | ... | false
102 | false | false | false | ... | true
... etc etc
次に、私のアプリケーションは、このテーブルを調整するためにAJAXリクエストを実行したいと考えています。
AJAXを介して送信される情報は、変更されたデータベースフィールドの配列と、それらの新しい値(JSON形式)です。
$my_new_settings === {
'OPTION_1' : 'false',
'OPTION_2' : 'false'
'OPTION_20' : 'true'
}
私の計画は、パラメータ化されたSQLクエリを次の行に沿って使用することでした。
$query_string = "UPDATE `USER_OPTIONS`
SET ? = ?
WHERE
`USER_ID` = ?
LIMIT 1 ;";
$my_user_id = 100;
$my_field_for_updating = "OPTION_1";
$my_new_field_value = "false";
if ( $query = $mysqli->prepare($query_string) ) {
$query->bind_param("sss", $my_field_for_updating, $my_new_field_value, $my_user_id);
$query->execute();
$query->close();
}
次に、連想配列を反復処理して、のペア$my_field_for_updating
と$my_new_field_value
からのペアを取得し$my_new_settings
ます。
でも。
その後、php.netのマニュアルで次のことを発見しました。
(「マーカー」は、パラメーター化されたSQLクエリの「?」変数に使用される用語です)
ノート:
マーカーは、SQLステートメントの特定の場所でのみ有効です。たとえば、INSERTステートメントのVALUES()リスト(行の列値を指定するため)、またはWHERE句の列との比較で比較値を指定することができます。
ただし、識別子(テーブル名や列名など)、SELECTステートメントによって返される列に名前を付ける選択リスト、または=等号などの二項演算子の両方のオペランドを指定することはできません。パラメータタイプを判別することは不可能であるため、後者の制限が必要です。マーカーをNULLと比較することはできませんか?もNULLです。一般に、パラメーターはデータ操作言語(DML)ステートメントでのみ有効であり、データ定義言語(DDL)ステートメントでは有効ではありません。
したがって、これは私の提案した解決策を台無しにしました。
次のアイデアは、データベース内のすべてのフィールドを更新するSQLクエリを作成することでしたが、新しく更新されたフィールド値のみを含めることでした。ただし、データがないフィールドの「マーカー」に割り当てるには、魔法の「何もしない」変数が必要になることがわかりました。
$query_string = "UPDATE `USER_OPTIONS`
SET `OPTION_1` = ?,
SET `OPTION_2` = ?,
SET `OPTION_3` = ?,
...
SET `OPTION_20` = ?
WHERE
`USER_ID` = ?
LIMIT 1 ;";
$my_user_id = 100;
$my_new_OPTION_1_value = 'false';
$my_new_OPTION_2_value = 'false';
$my_new_OPTION_20_value = 'true';
$magic_do_nothing_value = ????;
if ( $query = $mysqli->prepare($query_string) ) {
$query->bind_param("sssssssssssssssssssss",
$my_new_OPTION_1_value,
$my_new_OPTION_2_value,
$magic_do_nothing_value,
$magic_do_nothing_value,
...
$magic_do_nothing_value,
$my_new_OPTION_20_value,
$my_user_id
);
$query->execute();
$query->close();
}
しかし、私は$magic_do_nothing_value
実際に何であるかを知りません(そしてグーグルするのは難しいと思いました)。私が試したものはすべて、エラーをスローするか、「false」と解釈されました。
だから私の最初の質問は:MYSQLデータベースが「何もしない」ためのシグナルとして受け入れる値はありますか?
存在しないと仮定して、これから先に進むと、次の考えは、指定されたデータベースから現在のすべての値をドラッグUSER_ID
し、変更を加えてこれらを修正し$my_new_settings
、それに応じてすべてのフィールドでデータベースを更新することでした。
ただし、これは、特に私の最初のソリューションと比較すると、多くの不要な作業のように思われます。
それは私をここに導き、より良いものを求めます!
あなたが持っているかもしれないどんな考えにも感謝します、私はそれらを聞くことに本当に興味があります。これは、PHP5.2と基本的なMySQL5.0.92データベースで実行されています。