Форум: Форум PHPФорум ApacheФорум Регулярные ВыраженияФорум MySQLHTML+CSS+JavaScriptФорум FlashРазное
Новые темы: 0000000
PHP. Практика создания Web-сайтов (второе издание). Авторы: Кузнецов М.В., Симдянов И.В. Объектно-ориентированное программирование на PHP. Авторы: Кузнецов М.В., Симдянов И.В. Самоучитель PHP 5 / 6 (3 издание). Авторы: Кузнецов М.В., Симдянов И.В. PHP на примерах (2 издание). Авторы: Кузнецов М.В., Симдянов И.В. PHP Puzzles. Авторы: Кузнецов М.В., Симдянов И.В.
ВСЕ НАШИ КНИГИ
Консультационный центр SoftTime

Форум MySQL

Выбрать другой форум

 

Здравствуйте, Посетитель!

вид форума:
Линейный форум Структурный форум

тема: Получить значения в случайном порядке
 
 автор: Лена   (27.10.2008 в 10:10)   письмо автору
 
 

При каждой итерации цикла выбирается один заголовок+несколько картинок к нему. Картинки выбираются в случайном порядке. Можно ли заголовки (у меня - $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($fpLOCK_EX);
    
$text fread($fpfilesize($filename));
    
$head strtok($text".");
    
$head1 "<a href='?link=$id'><h2><div class = 'c_head'>" $head "</div></h2></a><br>";
    
    
$text substr($textstrpos($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($fpLOCK_UN);
    
fclose($fp);
    } 
}
?>

  Ответить  
 
 автор: Trianon   (27.10.2008 в 11:22)   письмо автору
 
   для: Лена   (27.10.2008 в 10:10)
 

Можно в ORDER BY tid выражение сортировки изменить на зависящее от некоторого параметра, вычисляемого случайным образом.

$shuffle = rand();
$sql = " ... ORDER BY (tid^$shuffle) ..."


Утверждение, что такой цикл выбирает несколько картинок, представляется мне сомнительным.

LIMIT 0,28 не мешает?

  Ответить  
 
 автор: Лена   (28.10.2008 в 10:54)   письмо автору
 
   для: 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.
Понимаю, что неумно, но как сделать толково, не знаю. Если количество картинок поменяется, это будет катастрофа, лимит не сработает, как надо.

  Ответить  
 
 автор: Trianon   (28.10.2008 в 11:13)   письмо автору
 
   для: Лена   (28.10.2008 в 10:54)
 

>Смотрите, допустим, у нас пятый цикл. Из числа элементов rand(), допустим, выбирает tid=7

rand() вызывается один раз, перед запросом. Значение $shuffle, им сгенерированное, в ходе цикла никак не меняется.
Можно говорить о том, что заголовки будут недостаточно случайно выбраны, но два одинаковых заголовка Вы не получите никак.

>И еще вопрос: почему в rand() не указан диапазон, от 0 до числа tid? Как программа будет знать, что нужно выбирать значения именно из поля tid?

А эти диапазоны не связаны напрямую.Хорошо если они будут равны.
Если диапазон rand() будет больше диапазона ключей tid, ничего страшного не случится. Вообще ничего.
Если диапазон rand() будет меньше, ключи будут лишь несколько хуже перемешаны.

Можно применить в ORDER BY дополнительно какую-либо хеширующую функцию для лучшей рандомизации. Если нагрузка на SQL не критична.

  Ответить  
Rambler's Top100
вверх

Rambler's Top100 Яндекс.Метрика Яндекс цитирования