Случайный идентификатор каждой страницы - PullRequest
0 голосов
/ 22 апреля 2020

Я хочу создать кнопку, которая дает каждой ссылке уникальный идентификатор ссылки из базы данных.

У меня есть только кнопка «Далее», которая должна дать мне следующую страницу истории.

Я не нашел ни одной Фрагмент из Google, как создать ссылку с идентификатором, который не повторяется позже.

Мой код:

$row = Db::run()->pdoQuery('SELECT c.name AS name
, p.id AS id, p.created AS created
, p.title AS title, p.body AS body, p.cover AS cover 
FROM projects AS p 
INNER JOIN categories AS c 
  ON p.category = c.id 
WHERE p.id ="' . $id . '";')->results(); // for current story article

$nrow = Db::run()->pdoQuery('SELECT 
    (SELECT MIN(id) AS id FROM projects WHERE id > p.id) as next_id, 
    (SELECT title FROM projects WHERE id > p.id) as next_title,
    (SELECT cover FROM projects WHERE id > p.id) as next_cover,
    (SELECT c.name AS name FROM projects AS a 
        INNER JOIN categories AS c 
          ON a.category = c.id 
     WHERE a.id > p.id) AS next_name
FROM projects p WHERE p.id = "' . $id . '"')->results(); // for next story article


$tpl->data = $row;
$tpl->next = $nrow;

Изображение кнопки «Следующая история»: Следующая история

Может быть, возможно, каким-то образом он проверяет, какой идентификатор был предоставлен в последний раз и какой сейчас, а какой следующий, или кешируется?

Ответы [ 2 ]

0 голосов
/ 23 апреля 2020

Это не тот ответ, который вы ищете - но вам нужно быть намного более конкретным c, если вы хотите конкретный c ответ.

дает каждую ссылку уникальной ID ссылки из базы данных

Это невозможно, если в вашей базе данных больше историй, чем когда-либо будет прочитано - что немного глупо. Это имеет больше смысла, если вы имеете в виду, что один человек не увидит один и тот же идентификатор более одного раза. Но вы имеете в виду один раз в сеансе? Пока у них есть аккаунт? Вы хотите предоставить это как анонимную возможность, которую люди могут использовать без учетной записи?

Вы не говорите, что порядок, в котором представлены идентификаторы, имеет отношение.

Вы не сказали что такое тип данных «projects.id».

Ваш запрос на следующую историю вообще не имеет смысла.

Предполагается, что истории будут читаться по порядку, и вы не сохраняете состояние на стороне сервера. , и вы обеспечили соответствие локальному провайдеру l aws, и этот project.id представляет собой почти непрерывный набор целых чисел, и что это веб-приложение (МНОГО допущений), а затем просто отбросьте код ie, содержащий идентификатор каждый раз, когда вы представляете историю, а затем получить следующую историю с ...

 SELECT c.name AS name
 , p.id AS id, p.created AS created
 , p.title AS title, p.body AS body, p.cover AS cover 
 FROM projects AS p 
 INNER JOIN categories AS c 
   ON p.category = c.id 
 WHERE p.id =(SELECT MIN(read.id) 
    FROM projects read
    WHERE id>" . (integer) $_COOKIE['lastread'] 
0 голосов
/ 23 апреля 2020

Похоже, вы используете MySQL запросов в своем вопросе.

Вы можете обновить схему базы данных так, чтобы в вашей таблице projects был столбец с флагом AUTO_INCREMENT.

Из их документов :

"Атрибут AUTO_INCREMENT может использоваться для создания уникального идентификатора для новых строк"

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

Для этого вы можете рассмотреть возможность использования UUID() или UUID_SHORT() в MySQL 5.7 + .

Кроме того, хотя ваш Q подразумевает, что вы не используете ORM, такие инструменты, как Doctrine & DoctrineExtensions предоставляют быстрый доступ к более случайным (и более оптимизированным для SEO) уникальным Параметры идентификаторов для строк, например slugs .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...