Вставить идентификатор списка и элемент

#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; . Теперь я собираюсь выяснить, как также выбирать списки, спасибо за ваше время :))