|
|
|
| При каждой итерации цикла выбирается один заголовок+несколько картинок к нему. Картинки выбираются в случайном порядке. Можно ли заголовки (у меня - $head1) тоже средствами SQL выбирать в случайном порядке?
<?php
include("configs/dbopen.php");
$sql="SELECT *, t.id AS tid FROM texts AS t
LEFT JOIN img AS i
ON i.id_text = t.id
WHERE t.id_mod IS NULL AND t.id_menu = i.id_menu
ORDER BY tid, RAND() LIMIT 0,28";
$res = mysql_query($sql);
if(!$res) exit("Error in $sql: ". mysql_error());
for($p = 0; $row = mysql_fetch_assoc($res); ) {
if($p != $row['tid']) {
$p = $row['tid'];
$name = $row['main_text'];
$filename = "content/menu/" . $name;
$id = $row['id_menu'];
$fp = fopen($filename, "r");
flock($fp, LOCK_EX);
$text = fread($fp, filesize($filename));
$head = strtok($text, ".");
$head1 = "<a href='?link=$id'><h2><div class = 'c_head'>" . $head . "</div></h2></a><br>";
$text = substr($text, strpos($text, ".")+1);
//$text = nl2br($text);
$foto = "<a href='?foto=$id'><div class = 'link_foto'>Галерея работ</div></a>";
$name1 = $row['name'];
$file_img = "lightbox/images/". $name1;
$img_name = "<a href='" . $file_img . "' rel='lightbox[wedding]' title='Кликните, чтобы посмотреть другие картинки'><img src='" . $file_img . "'
width='70' height='80' alt='" . $head . "' align='left' hspace = '10' /></a>";
$ans = explode(".",$text);
$annons = "<div class = 'hpans'>". $ans[0] . "." . $ans[1] . "." . "</div>";
$line = "<center><img src='templates/css/foto.jpg' width='600' height='30' alt='' /></center><br>";
print $head1 . $img_name . $annons . $foto . $line;
flock($fp, LOCK_UN);
fclose($fp);
}
}
?>
|
| |
|
|
|
|
|
|
|
для: Лена
(27.10.2008 в 10:10)
| | Можно в ORDER BY tid выражение сортировки изменить на зависящее от некоторого параметра, вычисляемого случайным образом.
$shuffle = rand();
$sql = " ... ORDER BY (tid^$shuffle) ..."
|
Утверждение, что такой цикл выбирает несколько картинок, представляется мне сомнительным.
LIMIT 0,28 не мешает? | |
|
|
|
|
|
|
|
для: Trianon
(27.10.2008 в 11:22)
| | Смотрите, допустим, у нас пятый цикл. Из числа элементов rand(), допустим, выбирает tid=7, тогда выражение ORDER BY (tid^$shuffle) примет вот такой вид: ORDER BY (5^7)
В битовом представлении
5 = 0101
7 = 0111
Так как у нас исключающее ИЛИ(^) обнуляем совпадающие разряды. Получается 0010. В десятичном представлении это 2. Выходит, при прохождении пятого цикла у нас получается 2
Правильно разобралась?
Если rand`ом выбирается какое-то случайное значение, то при следующей итерации это значение уже не выбирается? Не получится, что у меня на странице будут два одинаковых заголовка?
И еще вопрос: почему в rand() не указан диапазон, от 0 до числа tid? Как программа будет знать, что нужно выбирать значения именно из поля tid?
Про LIMIT 0,28. Нужно выбрать 7 заголовков разделов, всего их 11. Так как картинок у меня к каждому разделу по 4 и мне все 4 надо вывести, я 7х4=28.
Понимаю, что неумно, но как сделать толково, не знаю. Если количество картинок поменяется, это будет катастрофа, лимит не сработает, как надо. | |
|
|
|
|
|
|
|
для: Лена
(28.10.2008 в 10:54)
| | >Смотрите, допустим, у нас пятый цикл. Из числа элементов rand(), допустим, выбирает tid=7
rand() вызывается один раз, перед запросом. Значение $shuffle, им сгенерированное, в ходе цикла никак не меняется.
Можно говорить о том, что заголовки будут недостаточно случайно выбраны, но два одинаковых заголовка Вы не получите никак.
>И еще вопрос: почему в rand() не указан диапазон, от 0 до числа tid? Как программа будет знать, что нужно выбирать значения именно из поля tid?
А эти диапазоны не связаны напрямую.Хорошо если они будут равны.
Если диапазон rand() будет больше диапазона ключей tid, ничего страшного не случится. Вообще ничего.
Если диапазон rand() будет меньше, ключи будут лишь несколько хуже перемешаны.
Можно применить в ORDER BY дополнительно какую-либо хеширующую функцию для лучшей рандомизации. Если нагрузка на SQL не критична. | |
|
|
|