Вставка и обновление записей для должностей, которые будут доступны до 3-х других пользователей


Во-первых, я этого HTML Я использую здесь:

body {
  text-align: center;
}
<form method='post' action=''>
  <input type='text' placeholder='post' name='post'>
  <div>
    <input type='text' placeholder='ref1' name='ref1'>
    <input type='text' placeholder='ref1id' name='ref1id'>
  </div>
  <div>
    <input type='text' placeholder='ref2' name='ref2'>
    <input type='text' placeholder='ref2id' name='ref2id'>
  </div>
  <div>
    <input type='text' placeholder='ref3' name='ref3'>
    <input type='text' placeholder='ref3id' name='ref3id'>
  </div>
  <input type='submit' name='submit'>
</form>


Я получаю данные с помощью PHP и отправить его как это:

<?php
if (isset($_POST['submit'])) {
  $post = $_POST['post'];

  $ref1 = $_POST['ref1'];
  $ref1id = $_POST['ref1id'];

  $ref2 = $_POST['ref2'];
  $ref2id = $_POST['ref2id'];

  $ref3 = $_POST['ref3'];
  $ref3id = $_POST['ref3id'];

  $stmt = $conn->prepare($Query)
  $stmt->execute([
    'post' => $post, 
    'ref1' => $ref1, 
    'ref1id' => $ref1id, 
    'ref2' => $ref2, 
    'ref2id' => $ref2id, 
    'ref3' => $ref3, 
    'ref3id' => $ref3id
  ])

}
?>

Тогда я применить это SQL запрос на INSERT данные:

INSERT INTO `posts` (`post`, `ref1`, `ref1id`, `ref2`, `ref2id`, `ref3`, `ref3id`) VALUES (:post, :ref1, :ref1id, :ref2, :ref2id, :ref3, :ref3id)

И это UPDATE данные:

UPDATE `posts` SET `post` = :post, `ref1` = :ref1, `ref1id` = :ref1id, `ref2` = :ref2, `ref2id` = :ref2id, `ref3` = :ref3, `ref3id` = :ref3id

в этой MYSQL таблица: http://sqlfiddle.com/#!9/7d22d8/1/0


Идея заключается в том, что user можно сделать отдельный post для 3 человек только, он пишет свое имя в ref[x] и пароль, ref[x]id



116
1
задан 14 марта 2018 в 03:03 Источник Поделиться
Комментарии
1 ответ

Рассмотрим следующую таблицу:

CREATE TABLE IF NOT EXISTS `posts` (
`id` int(6) unsigned NOT NULL,
`post` varchar(24) NOT NULL,
PRIMARY KEY (`id`)
) DEFAULT CHARSET=utf8;

Мы убрали столбцы Реф. Теперь мы добавляем новую таблицу:

CREATE TABLE IF NOT EXISTS `post_refs` (
`posts_id` int(6) unsigned NOT NULL,
`ref` varchar(24) NOT NULL,
`ref_id` varchar(24) NOT NULL,
PRIMARY KEY (`posts_id`, `ref`)
) DEFAULT CHARSET=utf8;

Вполне возможно, что индекс должен содержать ref_id а не ref. Вы на самом деле не дают достаточно контекста, чтобы сказать.

Это основная нормализации. Таблицы базы данных не должен содержать столбцы дублировать информацию (например, пронумерованы столбцы). Такие столбцы должны быть перемещены в свои таблицы, так что вам не придется изменять структуру базы данных каждый раз, когда вы изменить бизнес-правила.

Чтобы сделать эту работу, вам понадобится как минимум два SQL-запросы, по одному для каждой таблицы. Вы должны получить posts_id после первого. Для обновления, вы могли бы сделать это с SELECT (возможно, включаемых в запрос). Для вставки, вы могли бы сделать $conn->lastInsertId() после вставки в пост. Для обновления, вы можете удалить из post_refs таблицы, а затем выполните вставку. Е. Г. что-то вроде

SELECT id AS posts_id FROM posts WHERE post = :post

Если нет строк, делать

INSERT INTO posts (post) VALUES (:post)

Если есть несколько строк, делать

DELETE FROM post_refs WHERE posts_id = :posts_id

В любом случае, потом делать

INSERT INTO post_refs (posts_id, ref, ref_id) VALUES (:posts_id, :ref, :ref_id)

или многорядные эквивалент.

Эта логика становится проще, если вы заранее знают, нужно ли делать обновление или вставка. Ваш вопрос подразумевает, что вы делаете, но не показывают как.

Также рассмотреть

CREATE TABLE IF NOT EXISTS `post_read_users` (
`posts_id` int(6) unsigned NOT NULL,
`users_id` int(6) unsigned NOT NULL,
PRIMARY KEY (`posts_id`, `users_id`)
) DEFAULT CHARSET=utf8;

Потому что это не нормально необходимого для описания людей, которые вы хотите дать доступ. Обычно вы просто выбираете из списка, подключение существующих потребителей к посту. Вы, кажется, создавать пользователей, как вы идете. Так что либо человек созидающий должен помнить, чтобы дать ту же информацию каждый раз, или человек читающий должен запоминать множество паролей. Либо будет необычным и слишком сложная реализация.

0
ответ дан 14 марта 2018 в 11:03 Источник Поделиться