Выполнение while / loop для получения 10 случайных результатов

Привет, я пытаюсь создать скрипт для моего веб-сайта, поэтому каждый раз, когда поисковая система приходит на мой сайт, на моем сайте будет отображаться 10 различных тегов.

Эти теги будут схвачены из db. Поэтому в тот момент, когда я закодировал его, он захватывает только один. (потому что я не знаю, как это сделать)

Вот так

 $sql = "SELECT tagname FROM tags ORDER BY rand() LIMIT 10"; $result = mysql_query($sql); $row = mysql_fetch_object($result); echo "<a href='index.php'>" .$row->tagname. " </a>"; 

Есть ли в любом случае, я могу добавить какое-то время, чтобы он сделал это 10 раз? Например, используйте одно и то же эхо, но распечатайте 10 результатов вместо 1 …. я изменил предел от 1 до 10, но это не сработало … все еще показывая один …

Заметьте, прочитайте перед реальным ответом : для тех, кто продолжает делать этот ответ отрицательным. Прочитайте заголовок (который начинается с « Doing a while ») и заключительной части, вопрос («В любом случае, я могу добавить некоторое время , чтобы он делал это в 10 раз?»). Этот ответ касается повторения набора результатов, а не использования функции RAND! Запрос не появляется в моем ответе, и я также предлагаю другой подход в конце:


вам просто нужно обернуть свой вызов в mysql_fetch_object в цикле

 $result = mysql_query($sql); while ($row = mysql_fetch_object($result)) { echo "<a href='index.php'>" .$row->tagname. " </a>"; } 

Позже отредактируйте Другие соображения:

  • если в таблице содержится очень большой объем данных (но это не похоже, что это будет) порядок rand () может плохо повлиять на производительность
  • рассмотрите возможность использования pdo (или, по крайней мере, mysqli)
  • вы должны иметь некоторую обработку ошибок, даже если запрос кажется идеальным, по крайней мере

    if (! $ result) {echo mysql_error (); умереть; }

Пожалуйста, прекратите использовать ORDER BY RAND() . Просто остановись. Эта операция имеет сложность n*log2(n) , что означает, что время, затрачиваемое на запрос, будет расти "

  entries | time units ------------------------- 10 | 1 /* if this takes 0.001s */ 1'000 | 300 1'000'000 | 600'000 /* then this will need 10 minutes */ 

Если вы хотите генерировать случайные результаты, создайте хранимую процедуру, которая их генерирует. Что-то вроде этого (код, взятый из этой статьи , который вы должны прочитать):

 DELIMITER $$ DROP PROCEDURE IF EXISTS get_rands$$ CREATE PROCEDURE get_rands(IN cnt INT) BEGIN DROP TEMPORARY TABLE IF EXISTS rands; CREATE TEMPORARY TABLE rands ( tagname VARCHAR(63) ); loop_me: LOOP IF cnt < 1 THEN LEAVE loop_me; END IF; SET cnt = cnt - 1; INSERT INTO rands SELECT tags.tagname FROM tags JOIN (SELECT (RAND()*(SELECT MAX(tags.id) FROM tags)) AS id) AS choices WHERE tags.id >= choices.id LIMIT 1; END LOOP loop_me; END$$ DELIMITER ; 

И чтобы использовать его, вы должны написать:

 CALL get_rands(10); SELECT * FROM rands; 

Что касается выполнения всего этого на стороне PHP, вам следует прекратить использовать древний API mysql_* . Это более 10 лет и больше не поддерживается. Сообщество даже приступило к процессу обесценивания их. В 2012 году не должно быть больше нового кода, написанного с помощью mysql_* . Вместо этого вы должны использовать PDO или MySQLi . Что касается того, как написать его (с PDO):

 // creates DB connection $connection = new PDO('mysql:host=localhost;dbname=mydb;charset=UTF-8', 'username', 'password'); $connection->setAttribute(PDO::ATTR_EMULATE_PREPARES, false); // executes the procedure and creates select statement $connection->exec('CALL get_rands(10)'); $statement = $connection->query('SELECT * FROM rands'); // performs query and collects all the info if ($statement->execute()) { $tags = $statement->fetchAll(PDO::FETCH::ASSOC); } 

Обновить

Если требование состоит в том, чтобы получить не только 10 случайных результатов, но на самом деле 10 УНИКАЛЬНЫХ случайных результатов , то для выполнения этого потребуются два изменения PROCEDURE :

  1. Временная таблица должна обеспечивать уникальность записей:

     CREATE TEMPORARY TABLE rands ( tagname VARCHAR(63) UNIQUE); 

    Также имеет смысл собирать только идентификаторы, а не значения. Особенно, если вы ищете 10 уникальных статей, а не только теги.

  2. При вставке повторяющегося значения счетчик cnt не должен уменьшаться. Это может быть обеспечено добавлением HANDLER (до определения LOOP ), который «поймает» поднятое предупреждение и отрегулирует счетчик:

     DECLARE CONTINUE HANDLER FOR SQLSTATE '23000' SET cnt = cnt + 1; 

Вы выбираете только один из них

Вы должны забрать их все по очереди

 $sql = "SELECT tagname FROM tags ORDER BY rand() LIMIT 10"; $result = mysql_query($sql); while($row = mysql_fetch_object($result)) { echo "<a href='index.php'>" .$row->tagname. " </a>"; }