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

Форум MySQL

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

 

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

вид форума:
Линейный форум (новые сообщения вниз) Структурный форум

тема: Выбрать документы за вчера или позавчера

Сообщения:  [1-10]   [11-11] 

 
 автор: Лена   (02.08.2009 в 15:30)   письмо автору
 
   для: Trianon   (02.08.2009 в 14:47)
 

:)
Придрались-таки к словам...
Спасибо вам за ответы. Было интересно.

  Ответить  
 
 автор: Trianon   (02.08.2009 в 14:47)   письмо автору
 
   для: Лена   (02.08.2009 в 12:19)
 

безусловно.
Да и с чего бы функции о чем-то подозревать?
Она, знаете ли, ни сознанием, ни душой не обладает.

  Ответить  
 
 автор: Лена   (02.08.2009 в 12:19)   письмо автору
 
   для: Trianon   (02.08.2009 в 11:43)
 

Получается, последовательность такая: строка преобразуется в соответствии с нужным форматом, готовая строка поступает аргументом в функцию php и эта функция видит уже сформированную строку, не подозревая, было ли какое-то форматирующее преобразование или нет.

  Ответить  
 
 автор: Trianon   (02.08.2009 в 11:43)   письмо автору
 
   для: Лена   (02.08.2009 в 11:25)
 

нет. sql вообще не работает со строкой формата.
Он работает с аргументом функции mysql_query (), до которого строка формата не доходит в принципе.
Он работает - максимум - с результатом форматирующего преобразования, которое как раз и меняет язык с исходного на целевой.
<?
mysql_query
(sprintf("SELECT %s FROM %s WHERE name LIKE '%%%s%%'"'*''tbl'mysql_escape_string('Вася')));
mysql_query(sprintf('%s WHERE %s''UPDATE tbl SET cnt=cnt+1'"name LIKE '%Вася%'"));

  Ответить  
 
 автор: Лена   (02.08.2009 в 11:25)   письмо автору
 
   для: Trianon   (31.07.2009 в 18:16)
 

Ясно.
Но строка формата sprintf является частью SQL, иначе SQL бы ее не понимал.

  Ответить  
 
 автор: Trianon   (31.07.2009 в 18:16)   письмо автору
 
   для: Лена   (31.07.2009 в 15:20)
 

строка языка SQL и строка формата sprintf, порождающая на выходе строку SQL - формально всё ж разные языки.

$format = "SELECT n.nid sn, n.title nt, n.created
FROM {node} n
JOIN {term_node} tn ON n.nid = tn.nid
JOIN {term_data} td ON tn.tid = td.tid
JOIN {vocabulary} v ON td.vid = v.vid
JOIN {upload} up ON up.nid = n.nid
JOIN {files} f ON f.fid = up.fid
WHERE FROM_UNIXTIME(n.created, '%%Y-%%m-%%d') = (CURDATE() - INTERVAL %d DAY) ORDER BY RAND()
";


$sql = "SELECT n.nid sn, n.title nt, n.created
FROM {node} n
JOIN {term_node} tn ON n.nid = tn.nid
JOIN {term_data} td ON tn.tid = td.tid
JOIN {vocabulary} v ON td.vid = v.vid
JOIN {upload} up ON up.nid = n.nid
JOIN {files} f ON f.fid = up.fid
WHERE FROM_UNIXTIME(n.created, '%Y-%m-%d') = (CURDATE() - INTERVAL 1 DAY) ORDER BY RAND()
";


Обратите внимание на INTERVAL ... DAY

  Ответить  
 
 автор: Лена   (31.07.2009 в 15:20)   письмо автору
 
   для: Trianon   (31.07.2009 в 15:03)
 

Поставила %%d, работает.

>Путаете языки.
Почему путаю? Открываю мануал по MySQL, там в таблице определителей сначала идет строка - %d День месяца, число (00..31)
Под ней альтернативный вариант - строка - %e День месяца, число (0..31)
Значит, к одному языку относятся?

  Ответить  
 
 автор: Trianon   (31.07.2009 в 15:03)   письмо автору
 
   для: Лена   (31.07.2009 в 14:51)
 

Путаете языки.
нужно было поставить %%d

  Ответить  
 
 автор: Лена   (31.07.2009 в 14:51)   письмо автору
 
   для: Trianon   (30.07.2009 в 12:03)
 

Разбила на 2 запроса.
Первый запрос:

$sql = "SELECT n.nid sn, n.title nt, n.created
FROM {node} n
JOIN {term_node} tn ON n.nid = tn.nid
JOIN {term_data} td ON tn.tid = td.tid
JOIN {vocabulary} v ON td.vid = v.vid
JOIN {upload} up ON up.nid = n.nid
JOIN {files} f ON f.fid = up.fid
WHERE FROM_UNIXTIME(n.created, '%Y-%m-%e') = (CURDATE() - INTERVAL 1 DAY) ORDER BY RAND()
";


И перед вторым запросом проверяю:
if(mysql_num_rows($result)>0)
и тогда делаю второй запрос(он отличается от первого только INTERVAL 2 DAY).
Интересная ситуация сложилась.
Долго не могла понять, почему запрос в phpMyAdmin`e работает, а в модуле не хочет.
Как выяснилось, проблема была в условии:
WHERE FROM_UNIXTIME(n.created, '%Y-%m-%d') = (CURDATE() - INTERVAL 1 DAY)
В Друпале в целях безопасности в запросах с условием используется заполнитель %d, напр. запрос выглядит следующим образом:
$ex = db_query("SELECT * FROM table WHERE id = %d",$id);
А у меня в моем запросе при указании дня я тоже использовала %d, поэтому и не работало.
Пришлось в условии вместо %d поставить %e.
Теперь все в порядке.

  Ответить  
 
 автор: Trianon   (30.07.2009 в 12:03)   письмо автору
 
   для: Лена   (30.07.2009 в 11:39)
 

Можно, конечно, поизвращаться так:
SELECT n.nid, n.title FROM node n
WHERE FROM_UNIXTIME(n.created,'%Y-%m-%d') = (CURDATE() - INTERVAL 1+(
SELECT COUNT(*) = 0 FROM node WHERE FROM_UNIXTIME(created,'%Y-%m-%d') = (CURDATE() - INTERVAL 1 DAY
)
) DAY)

Но по-моему, самое разумное - сделать независимыми запросами.
Кстати, простор для оптимизации исходного запроса тоже немалый.

  Ответить  

Сообщения:  [1-10]   [11-11] 

Форум разработан IT-студией SoftTime
Rambler's Top100
вверх

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