|
|
|
| Не вполне понимаю использование кавычек в запросах. Вот такой пример правильного запроса:
mysql_query("DELETE FROM `log_commerce_ml` ORDER BY `id` DESC LIMIT ".(int)$n_del);
|
Почему поля в обратных одиночный кавычках? Это обязательно? В примерах на этом форуме такое написание встречается отнюдь не всегда, однако все работает.
Как правильно?
И еще.
Почему $n_del не в одиночных кавычках?
Почему эту переменную вынесли за двойные кавычки, ограничивающие запрос вцелом? | |
|
|
|
|
|
|
|
для: Владимир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");
| , но что это меняет? По сути - ничего. | |
|
|
|
|
|
|
|
для: 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");
|
| |
|
|
|
|
|
|
|
для: Владимир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? Только сейчас заметил =) | |
|
|
|
|
|
|
|
для: Sfinks
(13.01.2013 в 18:41)
| | А что у вас делает ORDER BY в запросе DELETE?
Определяет, какие данные удалять - самые старые. | |
|
|
|
|
|
|
|
для: Владимир55
(13.01.2013 в 19:43)
| | Хм... И правда. Чет я ступил =) | |
|
|
|