Почетный модератор
16844 / 6723 / 880
Регистрация: 12.06.2012
Сообщений: 19,967
|
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
1 | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
FAQ по распространенным ошибкам07.09.2012, 16:05. Показов 46473. Ответов 8
Метки нет (Все метки)
Введение
Приветствую всех. Здесь будут выкладываться ответы на самые распространенные ошибки и проблемы, с которыми сталкиваются новички (а порой и не только новички) при программировании на PHP. Содержание # Распространенные ошибки в PHP ▲ Краткое вступление. Любой программист, рано или поздно, но сталкивается с ошибками. PHP несколько отличается от других, "стандартных" языков программирования. Отличия, конечно же, больше всего заметны в плане того, что во-первых, здесь нет жесткой типизации, а во-вторых - PHP язык с интерпретатором, а не компилятором. Уровни отображения ошибок в PHP ▲ В PHP существует несколько уровней ошибок. Вот таблица основных уровней
Более подробно об этом можете посмотреть здесь и здесь уровень отображения можно прописать непосредственно в коде, с помощью функции
По умолчанию в PHP стоит уровень отображения ошибок
На мой взгляд, программист всегда должен знать обо всем, что творится у него в коде во время отладки программы, поэтому я всегда прописываю
"Разбор полетов", или где ошибка? ▲
Следовательно ее нужно инициализировать (просто присвоить какое то значение). Идем далее.
Эта ошибка также возникнет в ситуации с кодом
В php любое выражение должно заканчиваться точкой с запятой. Позволительно опускать ее только в конце php-скрипта если после него не идет никаких других символов (в том числе и пустой строки). Далее
Отладка программы и поиск ошибок ▲ Итак, как же выявить ошибки. Установка отображения ошибок ▲ Первым делом, необходимо прописать то, что я уже писал выше - это эти две "волшебные" строчки:
Возвращаемые значения var_dump() ▲ Итак, что может вывести у нас var_dump(). NULL - переменная не объявлена, ей присвоили NULL или удалили с помощью unset() bool(false) - логический (булев) тип - ЛОЖЬ bool(true) - логический (булев) тип - ИСТИНА int(число) - целое число float(число) - вещественное число с плавающей точкой (дробное) или целое, но больше int (например так float(1.1111111111111E+229) ) object(a)#1 (число свойств) {свойства (имя и значения, в виде ассоциативного массива) } - объект (экземпляр) класса resource(число) of type (тип ресурса) - ресурс string(число символов в строке) "сама строка" - строка (текст) array(число ключей) { ключ=>свойство } - массив Добавлено через 1 час 41 минуту Работа с формами в PHP ▲ Форма должна выглядеть примерно так
Разберем построчно нашу форму: <form .. > - начало формы method="POST" - метод отправки данных. Возможны два метода передачи данных формы: метод GET и метод POST. GET - весь текст формы (все передаваемые значения) отображаются в адресной строке браузера. POST - все передаваемые значения передаются скрыто action="" - путь к документу, где будут обрабатываться наши данные. если пустой, или отсутствует, или прописано что то типа
enctype="" - способ кодирования данных формы при отправке на сервер. При отстутствии надобности в загрузке файлов не нужен Далее. <input type="text" - type - это тип текстового поля (их полно, перечислять не буду). name="first" - имя поля. Именно этот индекс нужно будет подставлять при обработке данных в массив $_POST value="GO!" - отображаемый текст </form> - Закрывающий тег формы. Обработка полученных данных формы в PHP ▲ В PHP, как я уже говорил, есть возможность отправлять формы методом POST и методом GET. в первом случае все данные находятся в суперглобальном массиве $_POST, во втором - аналогичном массиве $_GET с индексами (ключами) в виде названий полей. Мы будем разбирать метод POST, по аналогии легко переделать на метод GET Теперь, непосредственно, обработка этих данных в php. Комментарии буду писать прямо в коде
26
|
07.09.2012, 16:05 | |
Ответы с готовыми решениями:
8
Вопросы по "FAQ по распространенным ошибкам" Чем определяется одинаковость урлов /page?FAQ и /page.php?FAQ Гоняет по 2 ошибкам Справочник по ошибкам Post платы |
2432 / 2282 / 594
Регистрация: 27.05.2011
Сообщений: 7,801
|
|||||||||||||||||||||||||||||||
07.09.2012, 16:31 | 2 | ||||||||||||||||||||||||||||||
продолжение о теме ошибок и отладке , сегодня хочу написать об исключениях (Exception)
исключения вызываются :
После вызова исключения мы видим на экране : дабы не допустить фатальной ошибки , исключения необходимо отлавливать таким образом :
Зачем я затронул эту тему , ведь можно было просто вернуть false ? А как вы проверите к примеру сможет ли открыть адресс функция file_get_contetns() ? что-бы обезопасить функции результат которых нельзя проверить не вызвав ошибку , нужно немного отойти от темы... обработчик ошибок php может перенаправлять ошибки сценария в обработчик юзера функцией set_error_handler () . пример :
14
|
2432 / 2282 / 594
Регистрация: 27.05.2011
Сообщений: 7,801
|
|||||||||||||||||||||||||||||||
17.09.2012, 12:31 | 3 | ||||||||||||||||||||||||||||||
Не используйте относительные пути - определяйте корневой путь
Иногда можно встретить код похожий на :
PHP ищет сперва текущий каталог , а затем отталкиваясь от текущего места положения ищет целевой каталог - слишком много поисков . Если файл с таким кодом будет включен в другой файл , то текущее место нахождение может измениться и будет ошибка . старайтесь создавать абсолютные пути:
Ваш сценарий может подключать в начале большой список различных файлов - какие-то библиотеки , классы :
11
|
Почетный модератор
16844 / 6723 / 880
Регистрация: 12.06.2012
Сообщений: 19,967
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
17.09.2012, 13:08 [ТС] | 4 | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Несколько слов об ошибках Попова.
В сети, среди web-программистов, хорошо известен некий Евгений Попов, автор серии видеоуроков, любимец новичков и противоположность для программистов со стажем.. Итак, начнем. Вот код регистрации на его сайте. Кликните здесь для просмотра всего текста
Пойдем по порядку.
т.е. вот так
При необходимости, можно проверять существование нужных данных, но не таким способом. Как я уже говорил, в isset можно передавать несколько аргументов. Давайте посмотрим, как это можно делать.
присваиваем переменные, попутно сразу очищая их от пробелов (можно и другие очистки сразу добавить - нечего расписывать код на десять строк вместо одной)
Итак, совместив все это у нас получается такая запись:
В php есть такая вещь как так называемые "магические (волшебные) кавычки". Они добавляют экранирование к ряду символов в отправляемые данные. Но, т.к. мы будем использовать mysql_real_escape_string() перед запросом, то нам нужно очистить от этих слэшей. В принципе, при авторизации можно убирать слэши по любому, если они не должны быть в логине или пароли (а обычно это так). Проверить, включены кавычки или нет можно с помощью функции get_magic_quotes_gpc(). Я проверять не буду, а просто сразу очищу
Код Попова.
Правильно делать так:
22
|
1178 / 1128 / 94
Регистрация: 31.05.2012
Сообщений: 3,060
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
19.09.2012, 13:27 | 5 | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Хотелось бы рассказать о некоторых ошибках в php с использованием условий и логический операций.
Приходилось мне видеть что то типа вот такого:
||, &&, or, and, <, >, ==, ... - применяются для логических операций, и результатом выполнения будет всегда логическое значение. не важно какие были переменные.
Можно с увереностью сказать, что $username будет равно true, так как даже если $user->getUserName() вернёт false то (bool)'Гость' всегда вернёт true. То же самое и во втором пример, с вызовом функции hasGift(). Если хотя бы одно число не равно 0 то там будет передано в функцию true, а функция ожидает тип int, по этому в функции будет проверка (int)true = 1, то есть будет проверено, есть ли у юзера подарок с ID = 1. В результате функция выполнится, и проверка пройдёт, но не того чего нужно, и такую ошибку можно будет не сразу отловить и заметить что она есть. Теперь рассмотрим оператор switch. Пусть у нас будет код:
При $a от 11 до 20
При $a > 20
Вроде бы всё верно, но если взять $a = 0
А если добавить в начало вот такую строку
Ну и последнее о чём хотелось бы напомнить, это о третьем параметре функции in_array, там тоже бывает беда из за приведения типов. Напрмиер:
Или
(bool)'Петя' = true true в массиве есть. Что бы не было такого, есть у функции in_array третий параметр, который заставляет сравнивать с учётом типа переменных.
20
|
0 / 0 / 0
Регистрация: 12.06.2013
Сообщений: 11
|
|
12.06.2013, 16:08 | 6 |
спасибо вам огромное.благодаря вам у меня меньше головной боли стало.
0
|
61 / 23 / 7
Регистрация: 22.05.2012
Сообщений: 89
|
||||||
22.12.2014, 04:44 | 8 | |||||
Хотелось бы добавить несколько слов насчет сравнения с учетом типа. Однажды писал авторизацию/регистрацию и в части авторизации отчасти было следующее: если пользователь подтвердил E-mail перейдя по ссылке из отправленного письма - он может авторизоваться, иначе после ввода логина и пароля пользователю показывалась ошибка о том, что учетная запись еще не активирована. Проверка проверялась примерно так (дословно уже не припомню, но суть передам и таким примером):
...
В тот момент будучи учеником в С++ у меня выработалась некоторая "паранойя" по поводу типов данных, поэтому в PHP я сравнивал данные с учетом типа. В коде выше у меня была семантическая ошибка в том, что данные из БД приходили в типе STRING (а я ведь почему то был уверен, что это был INT) и затем сравнивались с INT - естественно, возвращалось FALSE и код работал неправильно. Около половины дня потратил на поиск этой ошибки :-( Мораль данной ситуации в том, что сравнивать данные с учетом типа тоже нужно с некоторой аккуратностью
0
|
Почетный модератор
16844 / 6723 / 880
Регистрация: 12.06.2012
Сообщений: 19,967
|
||||||
22.12.2014, 07:57 [ТС] | 9 | |||||
Мораль, скорее, в том, что сравнение с учетом типа надо использовать тогда, когда ты точно знаешь, какой тип ожидается в ответ.
А вообще, особенно после статически типизированных языков, нужно с еще большей внимательностью относиться к типам данных (вопреки некоторым мнениям, что динамическая типизация в разы лучше), т.к. компилятор языка PHP не предупредит о сравнении данных с разными типами, как при использовании статической типизации. Хотя, признаться, в некоторых языках с динамической типизацией, все же, есть некая проверка типов. Например, в лиспе подобный код выдаст ошибку, что foo не является числом
0
|
22.12.2014, 07:57 | |
22.12.2014, 07:57 | |
Помогаю со студенческими работами здесь
9
PHPStorm - навигация по ошибкам анализатора Сма Bauknecht WA 7540, Поделитесь информацией по ошибкам Сма Blomberg WNF 8447 нужна инфа по ошибкам сма Whirlpool AWE 6514 859365110040, нужны данные по ошибкам Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |