多対多のテーブル構造があり、チェックボックス フォームを更新しています。
目標は、users_project テーブルを使用して users テーブルを projects テーブルに関連付けることです。このようにして、プロジェクトごとに多くのユーザーが存在し、ユーザーごとに多くのプロジェクトが存在する可能性があります。
各ユーザー編集ページのフォームは次のようになります
<form action="#" method="post">
<div>
<input type="checkbox" name="project_id[]" id="1" value="1">
<label for="1">project 1</label>
<br>
<input type="checkbox" name="project_id[]" id="2" value="2">
<label for="2">project 2</label>
<br>
<input type="hidden" name="editing">
<input type="submit" id="submit" value="submit">
</div>
</form>
3 つのテーブルの例を次に示します。
ユーザー テーブル
+----+-----------+
| id ¦ username ¦
+----+-----------+
| 1 ¦ user 1 ¦
| 2 ¦ user 2 ¦
+----+-----------+
プロジェクト テーブル
+----+-----------+
¦ id ¦ title ¦
+----+-----------+
| 1 ¦ project 1 ¦
| 2 ¦ project 2 ¦
+----+-----------+
user_projects テーブル
このテーブルは、ID に基づいて上記の 2 つのテーブルを関連付けます
+----+-------------+---------+
| id ¦ project_id ¦ user_id |
+----+-------------+---------+
| 1 ¦ 1 ¦ 2 |
| 2 ¦ 2 ¦ 1 |
+----+-------------+---------+
これらの値を追加および編集するためのチェックボックス フォームを作成しました。各ユーザー ページでは、プロジェクト テーブルにすべてのプロジェクトが表示されます。次に、user_projects テーブルにクエリを実行し、一致するリストを見つけて、チェックボックスにチェックを追加します。
しかし、これらの値をデータベースに編集するにはどうすればよいでしょうか? user テーブルで project_id と user_id の一致を求めるクエリをループせずに、ユーザーが以前にチェックしたボックスをオフにしたか空のボックスをオンにしてデータベースを更新したかどうかを知るにはどうすればよいですか?
これが、最終結果で達成したいことの大まかな概念です。
if ($_POST['editing']) {
$totalprojects = $_POST['editing'];
$query = "
SELECT *
FROM user_projects
WHERE user_id = user_id
AND project_id = project_id
";
$result = $mysqli->query($query);
$count = $mysqli->affected_rows;
for($i=0; $i < $totalprojects; $i++) {
if ($count == 1) {
if ($box == checked){
//do nothing
}
else {
//delete from database
}
}
if ($count == 0) {
if ($box == checked){
//add to database
}
else {
//do nothing
}
}
}
}
プロジェクト テーブル内のすべてのプロジェクトに対して少なくとも 1 回はデータベースにクエリを実行する必要があるため、これはまったく良い考えとは思えません。私が一般的な問題であると想像するものには、より良い解決策があるに違いありません。私はこれについて間違った方法で考えていることを知っています。
注:配列をシリアル化してユーザー列に貼り付けることだけを考えましたが、プロジェクトをユーザーのみユーザーに関連付けてプロジェクトに関連付けることができず、目的を無効にすることができないため、これは受け入れられません。
これをJavaScriptの策略なしで実装したいと思います。