Привет, я пытаюсь создать скрипт для моего веб-сайта, поэтому каждый раз, когда поисковая система приходит на мой сайт, на моем сайте будет отображаться 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>"; }
Позже отредактируйте Другие соображения:
вы должны иметь некоторую обработку ошибок, даже если запрос кажется идеальным, по крайней мере
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
:
Временная таблица должна обеспечивать уникальность записей:
CREATE TEMPORARY TABLE rands ( tagname VARCHAR(63) UNIQUE);
Также имеет смысл собирать только идентификаторы, а не значения. Особенно, если вы ищете 10 уникальных статей, а не только теги.
При вставке повторяющегося значения счетчик 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>"; }