Strict Standards: Resource ID#34 used as offset, casting to integer (34) in /home/tvoyweb/domains/tvoyweb.ru/public_html/forums/include/fm.class.php on line 401

Strict Standards: Resource ID#36 used as offset, casting to integer (36) in /home/tvoyweb/domains/tvoyweb.ru/public_html/forums/include/fm.class.php on line 401

Strict Standards: Resource ID#37 used as offset, casting to integer (37) in /home/tvoyweb/domains/tvoyweb.ru/public_html/forums/include/fm.class.php on line 401
ТвойWeb :: Версия для печати :: PHP + MySQL [5]
ТвойWeb » WebMaster класс » PHP/Perl » PHP + MySQL

Страниц (6): « 1 2 3 4 [5] 6 »
 

41. Systemnik - 16 Марта, 2008 - 09:27:22 - перейти к сообщению
ааа я все отлично понял!!! Надо сказать 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 (значение переменной не подставляется а тут подставилось) почему?


как включить что бы все малейшие ошибки сразу отображались?


числовой тип является числовым литералом?
42. Ray Wen - 16 Марта, 2008 - 10:58:53 - перейти к сообщению
Systemnik, переменные подставляются только в двойных ковычках...
43. Furax - 16 Марта, 2008 - 12:01:45 - перейти к сообщению
За отображение ошибок в 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 можно передать любую комбинацию кавычек и имён переменных (поэкспериментируй!), но переменные, которые ты упомянёшь, всё равно не будут подставлены в строку.
44. Systemnik - 17 Марта, 2008 - 03:49:06 - перейти к сообщению
Цитата:
Опять ты за своё!

Так я сейчас объясню как я все понял.
Литералом является тип данных имеющий постоянное значение (тоесть не переменная и не константа)
Тип - это тип данных (число или символы (строка))
Строка с постоянным значением является - строковым литералом
Число с постоянным значением является - числовым литералом
45. Ray Wen - 17 Марта, 2008 - 04:19:53 - перейти к сообщению
Systemnik
Подставляется все, но если там больше одного слова, то они не воспринимаются целым без ковычек... следовательно происходит ошибка запроса...
46. Furax - 17 Марта, 2008 - 04:31:04 - перейти к сообщению
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) - булево значение и так далее. Главное, что это значение, записанное непосредственно в коде, теми средствами, которые язык предоставляет для записи таких значений. Не переменная, не константа, не результат выполнения и не параметр функции, а именно значение в чистом виде.

Так что понял ты, как мне кажется, верно.
47. Systemnik - 17 Марта, 2008 - 04:54:25 - перейти к сообщению
Тогда вопрос такой их этой теории следует => что переменная не подставляется в одинарные кавычки только если строка не зключена в двойные?

Цитата:
Так что понял ты, как мне кажется, верно.

УРА я счастлив! Ура я понл ура ура ура ура ура ура ура ура ура ура ура ура ура Улыбка простите за излишнюю эмоциональность ура ура ура ура ура Радость

И вот вопрос почему не работает код

CODE:
@mysql_query('DELETE FROM `site_stranichki` WHERE `id` = "$id" LIMIT 1');

=> база получит запрос
DELETE FROM `site_stranichki` WHERE `id` = "$id" LIMIT 1
??

ааа кажется я понял почему.. видимо потому что вокруг стоят символы ' ' следовательно кавычки "" являются символами в строке поэтому пхп не подсавит значение переменнной так?
48. Ray Wen - 17 Марта, 2008 - 05:54:02 - перейти к сообщению
Systemnik
Пользуйся программами с подсветкой php кода, тогда многое сразу станет понятным...
49. Furax - 17 Марта, 2008 - 06:07:10 - перейти к сообщению
Ray Wen
Кому как. Лично у меня глаза начинают разбегаться...

Systemnik
Да, именно так. PHP не важно, какие кавычки и как расставлены внутри строки, заключённой в другой тип кавычек. С его точки зрения, те двойные кавычки, что стоят внутри одинарных - обычные символы, и никакой особой обработки не требуют.

Для PHP существуют только начало и конец строчного литерала. Литерал, открытый двойной кавычкой, должен быть закрыт также двойной, а одинарные внутри - это просто символы; и наоборот.
50. Ray Wen - 17 Марта, 2008 - 06:25:17 - перейти к сообщению
Furax, ну ты исключительный случай, сравнению не поддаешься... У большинства со зрением все в порядке и начало-конец строчки, функции и т.д. различать подсветка помогает... по крайней мере в ковычках уже не заблудишься...

Форум на AlfaSpace.NET


Powered by ExBB
ExBB FM 1.0 RC1 by TvoyWeb.ru
InvisionExBB Style converted by Markus®

[Script Execution time: 0.0385]     [ Gzipped ]



Notice: ob_end_flush(): failed to send buffer of ob_gzhandler (1) in /home/tvoyweb/domains/tvoyweb.ru/public_html/forums/include/page_tail.php on line 33