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

Форум MySQL

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

 

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

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

тема: как упростить код?
 
 автор: Diablo_   (21.09.2006 в 01:39)   письмо автору
 
 

Скажите пожалуйста, можно ли вот этот код, как-то упростить???
Что бы он как можно меньше мучал базу?

<?
//------------------------------
$my->sql_query="select * from gallery_picture where (datas<'09.09.2006')";
$my->sql_execute();

if (@
mysql_num_rows($my->sql_res)==0)
    
$data='0';
else
{
    for (
$data1=array(); $row1=mysql_fetch_assoc($my->sql_res); $data1[]=$row1);                
    foreach (
$data1 as $element1)
    {
        
$data=$element1['datas'];
        
$picture_name=$element1['gen_name'];
        
$section=$element1['id_section'];
    }
}
//-------------------------------
$my->sql_query="select * from gallery_section where ID='".$section."'";
$my->sql_execute();

if (@
mysql_num_rows($my->sql_res)==0)
    
$data='0';
else
{
    for (
$data1=array(); $row1=mysql_fetch_assoc($my->sql_res); $data1[]=$row1);                
    foreach (
$data1 as $element1)
    {
        
$section_ok=$element1['Section'];
    }
echo 
'<img src="gallery/work/'.$section_ok.'/small_'.$picture_name.'" border=0>';
}
//--------------------------------------------------------
?>

   
 
 автор: cheops   (21.09.2006 в 12:30)   письмо автору
 
   для: Diablo_   (21.09.2006 в 01:39)
 

А что он делает? Какова цель кода?

   
 
 автор: Diablo_   (21.09.2006 в 12:55)   письмо автору
 
   для: cheops   (21.09.2006 в 12:30)
 

Первая часть кода, берёт из базы билжайшее значение по дате и вытаски вает нужные поля!
Вторая часть, берёт из другова раздела базы значение равное идентефикатору, которое было получено при помощи первой части кода, тем самым вормерует полный путь для рисунка!
Потом вывод рисунка!

   
 
 автор: cheops   (21.09.2006 в 13:15)   письмо автору
 
   для: Diablo_   (21.09.2006 в 01:39)
 

Можно поступить следующим образом
<?php
$my
->sql_query="select * from gallery_picture where (datas<'09.09.2006')"
$my->sql_execute(); 
if (@
mysql_num_rows($my->sql_res)==0$data='0'
else 

    
$picture mysql_fetch_assoc($my->sql_res);

    
$my->sql_query="select * from gallery_section where ID= ".$picture['id_section']; 
    
$my->sql_execute(); 

    if (@
mysql_num_rows($my->sql_res)==0$data='0'
    else 
    { 
      
$section mysql_fetch_assoc($my->sql_res);
      echo 
'<img src="gallery/work/'.$section['Section'].'/small_'.$picture['gen_name'].'" border=0>'
    } 
}
?>

   
 
 автор: Diablo_   (21.09.2006 в 15:31)   письмо автору
 
   для: cheops   (21.09.2006 в 13:15)
 

А как получить 3 ближайшие к текущий дате?
По убыванию!

   
 
 автор: Vlas_r   (21.09.2006 в 17:17)   письмо автору
 
   для: Diablo_   (21.09.2006 в 15:31)
 

Как я понял Вам необходимо получить информацию из двух таблиц о трёх картинках ближайших по дате к заданной? Тогда достаточно в запросе объеденить эти таблицы по ID, что-то вроди:

<?
$my
->sql_query="select * from gallery_picture AS p, gallery_section AS s where s.ID=p.id_section AND (p.datas<'09.09.2006') ORDER BY p.datas DESC LIMIT 3";
$my->sql_execute();
if (@
mysql_num_rows($my->sql_res)==0$data='0';
else
{
    while(
$section mysql_fetch_assoc($my->sql_res))
    {
        echo 
'<img src="gallery/work/'.$section['Section'].'/small_'.$section['gen_name'].'" border=0>';
    }
}
?>

Если я нигде не ошибся с полями БД. Но думаю суть ясна.

   
 
 автор: Trianon   (21.09.2006 в 21:00)   письмо автору
 
   для: Vlas_r   (21.09.2006 в 17:17)
 


datas<'09.09.2006'

Это работать не будет.
Причем у всех оппонентов.
Даты сравнваются точно также как и строки.

   
 
 автор: Diablo_   (22.09.2006 в 00:21)   письмо автору
 
   для: Trianon   (21.09.2006 в 21:00)
 

Подробнее можно?

   
 
 автор: Trianon   (22.09.2006 в 09:52)   письмо автору
 
   для: Diablo_   (22.09.2006 в 00:21)
 

Можно.
Попробуйте выполнить SELECT NOW() from dual WHERE NOW() < '21.09.2006'
Сильно удивитесь
Даты записываются в MySQL в виде ГГГГ.ММ.ДД
И никак иначе.

   
 
 автор: Diablo_   (22.09.2006 в 11:05)   письмо автору
 
   для: Trianon   (22.09.2006 в 09:52)
 

Они записываются так, как запишет их юзер!:)
Есть одно но, код работает отлично, картинки выводит, но не получается вывести описание которое хранится в бд в разделе "gallery_picture" в столбце "opisanie", но берёт описание, но только одно, а не для каждой картинки! Я вчера пытался что то сделать, но ничего не получилось!

   
 
 автор: cheops   (22.09.2006 в 11:38)   письмо автору
 
   для: Diablo_   (22.09.2006 в 11:05)
 

У вас поле datas какой тип имеет календарный или строковый?

   
 
 автор: Diablo_   (22.09.2006 в 11:44)   письмо автору
 
   для: cheops   (22.09.2006 в 11:38)
 

календарный "22.09.2006"

   
 
 автор: cheops   (22.09.2006 в 11:53)   письмо автору
 
   для: Diablo_   (22.09.2006 в 11:44)
 

Календарный тип, это типы TIME, DATE, DATETIME, TIMESTAMP, YEAR, а строковые типы, это TEXT, CHAR, VARCHAR - у вас поле datas какой из этих типов имеет? Просто формат "22.09.2006" будет неправильно сортироваться, так как сравнение дат производитя слева на право, именно поэтому для календарных типов в MySQL используется формат 2006-09-22, т.е. сначала год, потом месяц, потом день.

   
 
 автор: Diablo_   (22.09.2006 в 12:05)   письмо автору
 
   для: cheops   (22.09.2006 в 11:53)
 

А..., извините, не понял вопроса!
Формат поля "VARCHAR"! ну елс ибы я знал что нужно не 22.09.2006 писать а 2006.09.22, то сделал бы! Но сейчас уже поздно!

   
 
 автор: cheops   (22.09.2006 в 12:27)   письмо автору
 
   для: Diablo_   (22.09.2006 в 12:05)
 

Тогда сортировка по дате будет не правильной.

   
 
 автор: Diablo_   (22.09.2006 в 13:00)   письмо автору
 
   для: cheops   (22.09.2006 в 12:27)
 

ну можно же просто сравнением текущие даты и той что в бд?
Как правильно записывать дату в бд? Просто вот так "2006.09.22"???

   
 
 автор: Trianon   (22.09.2006 в 13:07)   письмо автору
 
   для: Diablo_   (22.09.2006 в 13:00)
 

Формально, должно быть 2006-09-22 13:01:51 . Это же будет возвращать MySql
Но принимает он данные, насколько я помню, с любым разделителем, необязательно через минус.

   
 
 автор: Trianon   (22.09.2006 в 13:01)   письмо автору
 
   для: cheops   (22.09.2006 в 12:27)
 

Причем тут сортировка?

Речь идет о сравнении.

Запросы вида

select * from gallery_picture where (datas<'09.09.2006')";  

будут возвращать совсем не то, что от них ожидают.

   
 
 автор: cheops   (22.09.2006 в 13:15)   письмо автору
 
   для: Trianon   (22.09.2006 в 13:01)
 

Суть одна и та же... дело не в следствиях, а в причине... хранение даты в формате DD.MM.YYYY в строках будет давать неправильные результаты везде где одна дата сравнивается с другой, будь то сортировка или операторы сравнения.

   
 
 автор: Trianon   (22.09.2006 в 13:26)   письмо автору
 
   для: cheops   (22.09.2006 в 13:15)
 

Дело в формулировках.
Ваши реплики 11:53 и 12:27 (тем паче на фоне реплики Diablo_ 11:05) можно воспринять так, что все скрипты будут работать, только данные могут выводиться в неожиданном порядке.
И уж если на то пошло, сортировка является следствием представления данных. А представление - соответственно - причиной.

   
 
 автор: cheops   (22.09.2006 в 20:01)   письмо автору
 
   для: Trianon   (22.09.2006 в 13:26)
 

Полностью с вами согласен.

   
Rambler's Top100
вверх

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