Systemnik
Без одинарных кавычек подставится что угодно, не только числа. PHP вообще плевать, что находится в строке, заключённой в двойные кавычки, будь то одинарные кавычки или просто текст.
Но SQL не всё равно, будут кавычки или нет: если одинарных кавычек нет, то уже база данных, которая ничегошеньки не знает ни о том, были ли вокруг строки команд, переданной ей на выполнение, двойные кавычки, ни о том, откуда эта строка вообще взялась (её мог ведь передать пользователь, как в PHPMyAdminе, правильно?), не будет знать, что та часть запроса, которая некогда была содержимым переменной, является строкой, а не чем-то иным. База данных не имеет понятия ни о переменных PHP, ни о правилах кавычек в нём. Она знает оно: та часть запроса, которая заключена в одинарные кавычки, - это строковый литерал (уже с её точки зрения); всё, что вне кавычек - это уже операторы SQL, имена таблиц, функции SQL, переменные SQL (да, они там тоже есть, но они никак не связаны с переменными PHP) и т. д.
То есть, если написать вот так:
CODE:$value='Вася';
mysql_query("SELECT `id` FROM `names` WHERE `name` = $value");
То база данных получит вот такой запрос:
CODE:SELECT `id` FROM `names` WHERE `name` = Вася
PHP ведь не знает правил SQL, да и о том, что ты формируешь строку запроса в базу данных, а не надпись на странице сайта, он не подозревает, так что кавычки вокруг слова "Вася" он не поставил. С другой стороны, база данных не знает о том, что означает слово "Вася": оно не является именем переменной SQL, именем функции SQL, именем таблицы или столбца; поэтому уже база данных выдаст ошибку, хотя с точки зрения PHP всё в порядке. Когда ты пишешь:
CODE:$value='Вася';
mysql_query("SELECT `id` FROM `names` WHERE `name` = '$value'");
То база данных получает вот такой запрос:
CODE:SELECT `id` FROM `names` WHERE `name` = 'Вася'
После этого она может сказать, что "Вася" - это строка символов, поскольку она заключена в кавычки, и обработает запрос правильно.
Если же ты пишешь так:
CODE:$id=2;
mysql_query("SELECT `name` FROM `names` WHERE `id` = $id");
То база данных получает вот такой запрос:
CODE:SELECT `name` FROM `names` WHERE `id` = 2
Она знает, что 2 - это число, и запрос обрабатывается правильно, несмотря на отсутствие кавычек (или, скорее, благодаря ему).
Литерал - это не обязательно строка. Строковый литерал ('smile!', "$name Пупкин" и т. д.) - это строка, числовой (2, 3.14, 3e+8)- число, логический (true, false) - булево значение и так далее. Главное, что это значение, записанное непосредственно в коде, теми средствами, которые язык предоставляет для записи таких значений. Не переменная, не константа, не результат выполнения и не параметр функции, а именно значение в чистом виде.
Так что понял ты, как мне кажется, верно.