Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > PHP: Общие вопросы > Константы php


Автор: quiz 14.11.2007, 00:05
В соседней ветке я привел часть кода своего сайта, где обращался к зачениям массива без кавычек:

Код

$au = mysql_query("SELECT * FROM users WHERE id='$usid'");
$au = mysql_fetch_array($au);

print $au[name];


На что мне дали ответ: "при обращении без кавычек вы пытаетесь обратиться к константе, которой не существует, а значит php ее создает и присваивает ей строку с ее именем".
Это правда? И если да, то насколько подобные неправильные обращения могут замедлить выполнение скриптов? smile 

Автор: skyboy 14.11.2007, 00:17
Цитата(quiz @  13.11.2007,  23:05 Найти цитируемый пост)
И если да, то насколько подобные неправильные обращения могут замедлить выполнение скриптов?

не думаю, что сильно уж, но есть проблема: если у тебя индекс массива совпадет с какой-то предопределенной константой(например, "http://www.php.net/manual/en/language.constants.predefined.php"; список объявленных констант можно получить с помощью http://www.php.net/manual/en/function.get-defined-constants.php), то  скрипт может выкинуть нечто экстраординарное...

Автор: SelenIT 14.11.2007, 03:18
Все, что генерит нотисы, тормозит весьма ощутимо, особенно в циклах (на phpclub-е как-то тестили обращение к необъявленным переменным - вышло замедление в 4 раза, тут, полагаю, масштаб сопоставим). Но писать чисто, чтоб при error_reporting(E_ALL) в вывод не сыпалось ничего постороннего, нужно не только из-за этого.

Автор: BuShaRt 14.11.2007, 10:51
quiz, 
Откройте учебник по PHP и почитайте, что такое константа.

Вопроса честно говоря не поня, автору лень проставлять кавычки, как делают это все?

Код

mysql_query("SELECT * FROM users WHERE id='$usid'");


сдесь тоже ошибка... правильно так 

Код

mysql_query("SELECT * FROM users WHERE id='".$usid."'");


error_reporting(E_ALL) - однозначно...

Автор: Alukard 14.11.2007, 12:45
Цитата(quiz @  14.11.2007,  00:05 Найти цитируемый пост)
print $au[name];


Я так понимаю, вопрос по этой строчке. Вам правильно сказали, что этот вызов будет искатьконстанту с именем name. Если не находит, php выдает ошибку в любом случае, нужно ставить одинарные кавычки: 

Код

print $au['name'];


Автор: quiz 15.11.2007, 06:33
Цитата(BuShaRt @ 14.11.2007,  10:51)
Вопроса честно говоря не поня, автору лень проставлять кавычки, как делают это все?

Вам для начала нужно научиться понимать вопрос, а потом давать ответ  smile

Добавлено через 36 секунд
Всем остальным спасибо, буду разбираться

Автор: skyboy 15.11.2007, 09:22
Цитата(quiz @  15.11.2007,  05:33 Найти цитируемый пост)
Вам для начала нужно научиться понимать вопрос

а смысл использования одноименных констант вместо строк разве не в "экономии" на кавычках? 

Автор: quiz 15.11.2007, 18:38
Цитата(skyboy @ 15.11.2007,  09:22)
а смысл использования одноименных констант вместо строк разве не в "экономии" на кавычках?

Если это неправильно (а это, как выяснилось, неправильно), то смысла никакого нет.
Проблема в том, что у меня 2 мегабайта php-скриптов, в которых практически через строчку используется это неправильное обращение к содержимому массива. Поэтому я и задался таким вопросом - есть ли смысл править тысячи неправильных обращений smile 

Видимо все-таки смысл есть. Запустил тестовый цикл - правильные кавычки ускоряют его ровно в 5 раз smile 

Автор: skyboy 15.11.2007, 18:42
Цитата(quiz @  15.11.2007,  17:38 Найти цитируемый пост)
есть ли смысл править тысячи неправильных обращений 

надеюсь, править не вручную собираешься? smile 

Автор: flashaa 15.11.2007, 18:49
В продолжение темы оптимизации.
Вот тут был такой пример.
Цитата(BuShaRt @  14.11.2007,  10:51 Найти цитируемый пост)
mysql_query("SELECT * FROM users WHERE id='".$usid."'");

Двойные кавычки нужны для интерпретации переменных и спецсимволов. Поэтому когда интерпретатор идет по строкам в двойных кавычках, он занимается подстановкой по регулярному выражению, что несколько тормозит процесс. Одинарные же кавычки не интерпретируются, следовательно строки в них будут быстро обработаны.
ПОэтому quiz, если будете добавлять кавычки, то непременно добавляйте одинарные!  smile  smile 

Автор: quiz 15.11.2007, 18:57
Цитата(skyboy @ 15.11.2007,  18:42)
надеюсь, править не вручную собираешься? smile

А есть выбор? Пока единственное, что пришло в голову - автозамена [ на [' и ] на '] , но все-равно для кажго случая редактору придется говорить "да" или "нет", потому как в скриптах таких квадратных скобок много, не относящихся к проблеме

Плюс придется заменять mysql_query("SELECT * FROM users WHERE id='$test[var]' "); на mysql_query("SELECT * FROM users WHERE id='".$test['var']."' "); (просто кавычки к ключу массива тут не добавить) :(

Автор: BuShaRt 15.11.2007, 19:15
flashaa, 
разница не существенна, но лучше конечно юзать одинарные ковычки.

Добавлено через 59 секунд
quiz, 
Если у человека в скриптах такой бардак, то зачем вам эти скрипты?

Автор: quiz 15.11.2007, 19:22
Цитата(BuShaRt @  15.11.2007,  19:15 Найти цитируемый пост)
Если у человека в скриптах такой бардак, то зачем вам эти скрипты? 

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

Автор: Alukard 15.11.2007, 22:26
Хм, странно, как можно допустить одну и ту же ошибку в массе скриптов, если она вызывает ERROR у PHP, потому что обращаться без кавычек не определив константу нельзя...
Но если все-таки нужно все поменять, то придется хорошенько поработать с текстовым редактором, кодом и конечно поиском и заменой...
Вот такая вот занудная работа программера бывает иногда)

Автор: quiz 16.11.2007, 02:27
Цитата(Alukard @ 15.11.2007,  22:26)
Хм, странно, как можно допустить одну и ту же ошибку в массе скриптов, если она вызывает ERROR у PHP, потому что обращаться без кавычек не определив константу нельзя...
Но если все-таки нужно все поменять, то придется хорошенько поработать с текстовым редактором, кодом и конечно поиском и заменой...
Вот такая вот занудная работа программера бывает иногда)

В том и беда, что по умолчанию никаких ошибок не вызывает

Автор: SamDark 16.11.2007, 14:40
quiz, 
Скорее всего потому, что error reporting отключен.

Автор: kasmanaft 16.11.2007, 16:38
Цитата
А есть выбор? Пока единственное, что пришло в голову - автозамена [ на [' и ] на '] , но все-равно для кажго случая редактору придется говорить "да" или "нет", потому как в скриптах таких квадратных скобок много, не относящихся к проблеме


Используйте регулярные выражения.. Неотносящиеся к проблеме скобки можно просто не трогать.

Цитата
Плюс придется заменять mysql_query("SELECT * FROM users WHERE id='$test[var]' "); на mysql_query("SELECT * FROM users WHERE id='".$test['var']."' "); (просто кавычки к ключу массива тут не добавить) :(

С помощью рег. выражений - всё, что угодно. Но в данном случае ничего заменять не нужно - тут все правильно.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)