Без описания |
Поиск в теме | Версия для печати |
Systemnik |
Отправлено: 16 Марта, 2008 - 09:27:22
|
ExBB Developer Team
Покинул форум
Сообщений всего: 778
Дата рег-ции: Дек. 2007
Карма 0
|
ааа я все отлично понял!!! Надо сказать Furax вы терпеливый и очень хорошо умеющий объяснять спасибо я полностью перевел свой сайт на мускул двидок а вам написал благодарность http://systemnik.alfaspace.net/i...x.php?page=about
если хотите могу повесить ссылку на ваш сайт на главной страницу (кнопку ссылку)
без разницы..
тока вот кгда стал писать админку вроде написал обнаружил вот что
CODE:@mysql_query("DELETE FROM `site_stranichki` WHERE `id` = $id LIMIT 1");
работает толко с числами
я не стал унывать.. сделал так
CODE:@mysql_query('DELETE FROM `site_stranichki` WHERE `id` = "$id" LIMIT 1');
вообще ничего не выполнялось..
и только кода сделал так
CODE:@mysql_query("DELETE FROM `site_stranichki` WHERE `id` = '$id' LIMIT 1");
все заработало. почему??
ведь код
<?php
$per = 'sanya';
print '$per';
?>
пишет $per (значение переменной не подставляется а тут подставилось) почему?
как включить что бы все малейшие ошибки сразу отображались?
числовой тип является числовым литералом?(Отредактировано автором: 16 Марта, 2008 - 09:34:38) |
|
|
Furax |
Отправлено: 16 Марта, 2008 - 12:01:45
|
Бледнотик
Покинул форум
Сообщений всего: 1472
Дата рег-ции: Март 2007
Откуда: Иркутск, Сибирь, СССР
Карма 32
|
За отображение ошибок в PHP отвечает параметр error_reporting в файле php.ini. Его надо поставить в положение E_ALL, или же в начале скрипта вставить строчку:CODE:error_reporting(E_ALL);
В SQL для выделения строк используются только одинарные кавычки.
Не надо смешивать PHP и SQL. Чтобы понять, как работает запрос, погляди, что отобразит такой листинг:CODE:echo "DELETE FROM `site_stranichki` WHERE `id` = '$id' LIMIT 1"; Именно то, что ты видишь в браузере, и пойдёт в базу данных в виде запроса. Переменная $id подставилась потому, что вся строка идёт в двойных кавычках. Одинарные в данном случае являются с точки зрения PHP не символами начала и конца строки, а просто символами в строке, которая заключена в двойные кавычки.
Systemnik пишет:числовой тип является числовым литералом? Опять ты за своё! Тип не может являться литералом! Литерал не может являться типом! Тип - это признак, которым обладает любой элемент в языке, кроме ключевых слов, например, переменная, литерал, константа, результат функции, результат арифметической или другой операции и т. д. По этому признаку язык решает, как обрабатывать этот элемент, сколько памяти выделять для его хранения, может ли он выступать аргументом той или иной функции и так далее.
Литерал - это (даю определение) заданное прямо в коде константное значение - например, число, строка, массив, записанный в виде array('a', 2, false) и т. п. Разумеется, литерал имеет тип, или, как ещё говорят, относится к тому или иному типу, но он не является типом. Тип же тоже никак не может являться литералом. Это явления различной природы: тип - характеристика, литерал - значение.
Путаницу вносит тот факт, что в PHP в литералах-строках осуществляется подстановка значений переменных. Поэтому строковый литерал становится "не совсем" константным значением, поскольку это значение определяется состоянием переменных к моменту вхождения литерала в код. Но всё же он константа: ему нельзя присвоить значение.
Обрати внимание, что подстановка переменных осуществляется только в литералах: в переменной POST или GET можно передать любую комбинацию кавычек и имён переменных (поэкспериментируй!), но переменные, которые ты упомянёшь, всё равно не будут подставлены в строку. |
|
|
Furax |
Отправлено: 17 Марта, 2008 - 04:31:04
|
Бледнотик
Покинул форум
Сообщений всего: 1472
Дата рег-ции: Март 2007
Откуда: Иркутск, Сибирь, СССР
Карма 32
|
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) - булево значение и так далее. Главное, что это значение, записанное непосредственно в коде, теми средствами, которые язык предоставляет для записи таких значений. Не переменная, не константа, не результат выполнения и не параметр функции, а именно значение в чистом виде.
Так что понял ты, как мне кажется, верно. |
|
|
Furax |
Отправлено: 17 Марта, 2008 - 06:07:10
|
Бледнотик
Покинул форум
Сообщений всего: 1472
Дата рег-ции: Март 2007
Откуда: Иркутск, Сибирь, СССР
Карма 32
|
Ray Wen
Кому как. Лично у меня глаза начинают разбегаться...
Systemnik
Да, именно так. PHP не важно, какие кавычки и как расставлены внутри строки, заключённой в другой тип кавычек. С его точки зрения, те двойные кавычки, что стоят внутри одинарных - обычные символы, и никакой особой обработки не требуют.
Для PHP существуют только начало и конец строчного литерала. Литерал, открытый двойной кавычкой, должен быть закрыт также двойной, а одинарные внутри - это просто символы; и наоборот. |
|
|
|
Поиск в теме | Версия для печати |
Страниц (6): « 1 2 3 4 [5] 6 » |
Сейчас эту тему просматривают: 2 (гостей: 2, зарегистрированных: 0, скрытых: 0) |
« PHP/Perl » |
Все гости форума могут просматривать этот раздел. Только администраторы и модераторы могут создавать новые темы в этом разделе. Только администраторы и модераторы могут отвечать на сообщения в этом разделе.
|
|
|