#php #mysql
#php #mysql
Вопрос:
Я немного заблудился и не могу найти ничего, что могло бы направить меня в правильном направлении, так что, возможно, у кого-то из вас есть предложение. Я пытаюсь добавить элементы в список.
Прежде всего, у меня есть таблица пользователей, которая содержит идентификатор пользователя. Этот идентификатор вводится как сеанс, поэтому, когда пользователь создает, добавляет список, его идентификатор вставляется в таблицу списка, поэтому я знаю, к какому пользователю относится список. Таблица списка также содержит имя списка и уникальный идентификатор, который получается в результате автоматического увеличения.
Список:
id(from user) ai Listname
1 1 List one
1 2 List two
3 3 List one
Моя следующая таблица — добавить элементы в список. Он содержит ai из списка, а также его собственное автоматическое увеличение и имя элемента.
ai(from list) itemAi itemName
? ? ?
Чего я не понимаю, так это вставить его. Допустим, я создал список в своей таблице, и я вставляю имя элемента, и itemAi автоматически устанавливается, как мне установить, в каком списке я нахожусь в данный момент? Должен ли я устанавливать его как сеанс или каков обычный подход?
Обновить:
$name = 'Test';
$sql = $con->prepare('INSERT INTO list (name) VALUES (?)');
$sql->bind_param("s",$name);
$sql->execute();
$sql->close();
$user = $_SESSION['user_id'];
$qq = $con->prepare('INSERT INTO user_list (user_id, list_id) VALUES (?,?)');
$qq->bind_param("ss", $user,????);
$qq->execute();
$qq->close();
$con->close();
Ответ №1:
Я бы попытался нормализовать ваши таблицы в логические понятия: пользователь, список, элемент и т.д. Затем используйте таблицы объединения для создания отношений «многие ко многим» между ними.
Таблицы:
user
: идентификатор (автоматическое увеличение), имя, фамилия, …
list
: идентификатор (автоматическое увеличение), имя
item
: идентификатор (автоматическое увеличение), имя
user_list
: идентификатор пользователя (FK to user.id
), идентификатор списка (FK to list.id
)
user_list_item
: user_id (FK to user.id
), list_id (FK to list.id
), item_id (FK to item.id
)
*FK = внешний ключ. Есть способы немного сократить это, но я бы предпочел здесь явную структуру, чтобы все было чисто и разделено.
Затем в PHP вы отслеживаете своего пользователя и список, над которым они в данный момент работают в сеансе.
<?php
// After logging in
$_SESSION['user_id'] = ...;
// Choose which list the user is working on
$_SESSION['list_id'] = ...;
Если они не выбрали список для работы, заставьте их это сделать. Это часть проверки.
Теперь каждый раз, когда пользователь хочет внести изменения, используйте эти значения сеанса. Ваша бизнес-логика будет:
<?php
// Associate a list with a user
INSERT INTO `user_list` (user_id, list_id) VALUES (?, ?)
?: $_SESSION['user_id']
?: $_SESSION['list_id']
// Disassociate a list from a user
DELETE FROM `user_list` WHERE user_id = ? AND list_id = ?
?: $_SESSION['user_id']
?: $_SESSION['list_id']
// Insert a new item into a user's list
$itemId = INSERT INTO `item` (name) VALUES (?)
?: 'Bread'
INSERT INTO `user_list_item` (user_id, list_id, item_id) VALUES (?, ?, ?)
?: $_SESSION['user_id']
?: $_SESSION['list_id']
?: $itemId
// Clear our the items from a specific list
DELETE FROM `user_list_item` WHERE user_id = ? AND list_id = ?
?: $_SESSION['user_id']
?: $_SESSION['list_id']
// Empty all items for a given user, but keep the lists intact.
DELETE FROM `user_list_item` WHERE user_id = ?
?: $_SESSION['user_id']
// Remove a specific item from a user's list
DELETE FROM `user_list_item` WHERE user_id = ? AND list_id = ? AND item_id = ?
?: $_SESSION['user_id']
?: $_SESSION['list_id']
?: $itemId
Допустим, пользователь вставляет новый список, и я вставляю его имя, и идентификатор
в списке получает A.i. Затем в то же время я должен вставить идентификатор
пользователя сеанса и идентификатор list_id в user_list, идентификатор пользователя устанавливается из
сеанса, но как мне получить идентификатор list_id для нового созданногосписок?
Хороший вопрос. Большинство СУБД предоставляют вам функцию для получения последнего вставленного идентификатора. PDO специально предоставляет его через lastInsertId
.
В этом случае вы должны выполнить 2 инструкции insert. Первый создаст новый список, а второй свяжет список с пользователем, взяв идентификатор вновь созданного списка и текущий идентификатор пользователя из сеанса.
<?php
// Create a new list and assign it to a user
// The form was submitted
if ($_SERVER['REQUEST_METHOD'] === 'POST') {
// Connection to your DB.
// See https://phpdelusions.net/pdo#dsn for a decent tutorial on PDO.
$pdo = new PDO(...);
// Get the name from the submitted form
$listName = $_POST['name'];
// Create the list and get the ID of the newly created list.
$stmt = $pdo->prepare('INSERT INTO `list` (name) VALUES (?)');
$stmt->execute([$listName]);
$listId = $pdo->lastInsertId();
// Now, associate the new list with the user.
$stmt = $pdo->prepare('INSERT INTO `user_list` (user_id, list_id) VALUES (?, ?)');
$stmt->execute([$_SESSION['user_id'], $listId]);
}
Комментарии:
1. Спасибо за ваш ответ, я понимаю концепцию, у меня только что появился еще один вопрос, поэтому я правильно понимаю. Допустим, пользователь вставляет новый список, и я вставляю его имя, и идентификатор в списке получает A.i. Затем в то же время я должен вставить идентификатор пользователя сеанса и идентификатор list_id в user_list, идентификатор пользователя устанавливается из сеанса, но как мне получить идентификатор list_id для нового созданногосписок? Я обновил вопрос, чтобы показать, что я имею в виду. Вам не нужно отвечать, большое спасибо за концепцию!
2. Большое спасибо за ваши объяснения, это заняло некоторое время, но я смог заставить вставку работать, в моем случае мне пришлось сделать $ListID = $sql-> insert_id; . Теперь я собираюсь выяснить, как также выбирать списки, спасибо за ваше время :))