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

Форум MySQL

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

 

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

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

тема: Правильное составление запроса
 
 автор: Владимир55   (12.01.2013 в 21:42)   письмо автору
 
 

Не вполне понимаю использование кавычек в запросах. Вот такой пример правильного запроса:
mysql_query("DELETE FROM `log_commerce_ml` ORDER BY `id` DESC LIMIT ".(int)$n_del);


Почему поля в обратных одиночный кавычках? Это обязательно? В примерах на этом форуме такое написание встречается отнюдь не всегда, однако все работает.

Как правильно?

И еще.
Почему $n_del не в одиночных кавычках?
Почему эту переменную вынесли за двойные кавычки, ограничивающие запрос вцелом?

  Ответить  
 
 автор: Sfinks   (12.01.2013 в 23:36)   письмо автору
 
   для: Владимир55   (12.01.2013 в 21:42)
 

Обратные одиночные кавычки используются для указания парсеру MySQL, что это имя поля, таблицы или алиаса.
В данном конкретном случае этот запрос будет работать и без них.
Они не являются обязательными при продуманном именовании таблиц и полей. Однако без них будут ошибки при совпадении имен с зарезервированными словами MySQL.

Например такой запрос:
SELECT `select`, `int`, `order` FROM `table` ORDER BY `order`
работать будет. А такой:
SELECT select, int, order FROM table ORDER BY order
естественно не будет.
Если не хотите задумываться, есть в MySQL какое-то конкретное ключевое слово, то лучше всегда ставить обратные кавычки. А если у вас какой-то универсальный код, в котором вместо имен используются переменные, а значения задаются в другом месте, например в config.php, то ставьте обратные кавычки всегда.

> Почему $n_del не в одиночных кавычках?
Значение лимита не в одиночных кавычках, т.к. целочисленные значения указываются без них.
Больше того, когда вы пишете в запросе значение целочисленного поля в кавычках, то парсер понимает, что вы передаете ему строку. И прежде чем выполнить запрос, выполняет неявное преобразование типов, чтобы привести все в соответствие. Следовательно, пусть не значительно, но нагрузка увеличивается.

> Почему эту переменную вынесли за двойные кавычки, ограничивающие запрос вцелом?
Потому что перед тем как вставить ее значение в запрос, к ней еще применили явное приведение к целому: (int), что не возможно сделать внутри кавычек.
Можно сделать это до формирования запроса:
<?php
  $n_del 
= (int)$n_del;
  
mysql_query("DELETE FROM `log_commerce_ml` ORDER BY `id` DESC LIMIT $n_del");
, но что это меняет? По сути - ничего.

  Ответить  
 
 автор: Владимир55   (13.01.2013 в 10:59)   письмо автору
 
   для: Sfinks   (12.01.2013 в 23:36)
 

1. То есть, при использовании экзотических названий таблиц и полей об их закавычивании можно не беспокоиться?

2. Или такой критерий: если запрос исполняется, то о нем можно не беспокоиться - следовательно, парсер MySQL в нем разобрался и в дальнейшем все будет нормально.
Это справедливо?

3. А если имена полей и таблиц заданы в переменных, то можно писать так:
<?php 
  mysql_query
("DELETE FROM $log_commerce_ml ORDER BY $id DESC LIMIT $n_del");


Или нужно так:
<?php 
 mysql_query
("DELETE FROM `" $log_commerce_ml "` ORDER BY `" $id "` DESC LIMIT $n_del");

  Ответить  
 
 автор: Sfinks   (13.01.2013 в 18:41)   письмо автору
 
   для: Владимир55   (13.01.2013 в 10:59)
 

1 и 2 - да. За исключением случая, когда сейчас парсер разобрался, а через 2 года в MySQL появилась новая функция с совпадающим названием и хостер обновил мускул и у вас все перестало работать.
В любом случае справедливо следующее: от проставления обратных кавычек хуже не будет, но вот если не ставить - возможны варианты.

3. Если в разработке участвует несколько человек, то лучше второй вариант.
Можно еще и вот так:
<?php  
  mysql_query
("DELETE FROM `$log_commerce_ml` ORDER BY `$id` DESC LIMIT $n_del");
и вот так:
<?php  
  mysql_query
("DELETE FROM `{$log_commerce_ml}` ORDER BY `{$id}` DESC LIMIT $n_del");
Последний вариант актуален, когда в качестве имен используется массив:
<?php  
  mysql_query
("SELECT `{$config['id_field_name']}` FROM `{$config['table_name']}` LIMIT {$config['posts_per_page']}");
или свойства объекта при использовании ООП:
<?php  
  mysql_query
("SELECT `{$this->id_field_name}` FROM `{$this->table_name}` LIMIT {$this->posts_per_page}");


P.S. А что у вас делает ORDER BY в запросе DELETE? Только сейчас заметил =)

  Ответить  
 
 автор: Владимир55   (13.01.2013 в 19:43)   письмо автору
 
   для: Sfinks   (13.01.2013 в 18:41)
 

А что у вас делает ORDER BY в запросе DELETE?

Определяет, какие данные удалять - самые старые.

  Ответить  
 
 автор: Sfinks   (13.01.2013 в 20:06)   письмо автору
 
   для: Владимир55   (13.01.2013 в 19:43)
 

Хм... И правда. Чет я ступил =)

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

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