|
Почетный модератор
16844 / 6724 / 880
Регистрация: 12.06.2012
Сообщений: 19,967
|
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
FAQ по распространенным ошибкам07.09.2012, 16:05. Показов 48449. Ответов 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 ошибкам |
|
2450 / 2301 / 597
Регистрация: 27.05.2011
Сообщений: 7,845
|
|||||||||||||||||||||||||||||||||||
| 07.09.2012, 16:31 | |||||||||||||||||||||||||||||||||||
|
продолжение о теме ошибок и отладке , сегодня хочу написать об исключениях (Exception)
исключения вызываются :
После вызова исключения мы видим на экране :
дабы не допустить фатальной ошибки , исключения необходимо отлавливать таким образом :
Зачем я затронул эту тему , ведь можно было просто вернуть false ? А как вы проверите к примеру сможет ли открыть адресс функция file_get_contetns() ? что-бы обезопасить функции результат которых нельзя проверить не вызвав ошибку , нужно немного отойти от темы... обработчик ошибок php может перенаправлять ошибки сценария в обработчик юзера функцией set_error_handler () . пример :
14
|
|||||||||||||||||||||||||||||||||||
|
2450 / 2301 / 597
Регистрация: 27.05.2011
Сообщений: 7,845
|
|||||||||||||||||||||||||||||||
| 17.09.2012, 12:31 | |||||||||||||||||||||||||||||||
|
Не используйте относительные пути - определяйте корневой путь
Иногда можно встретить код похожий на :
PHP ищет сперва текущий каталог , а затем отталкиваясь от текущего места положения ищет целевой каталог - слишком много поисков . Если файл с таким кодом будет включен в другой файл , то текущее место нахождение может измениться и будет ошибка . старайтесь создавать абсолютные пути:
Ваш сценарий может подключать в начале большой список различных файлов - какие-то библиотеки , классы :
11
|
|||||||||||||||||||||||||||||||
|
Почетный модератор
16844 / 6724 / 880
Регистрация: 12.06.2012
Сообщений: 19,967
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| 17.09.2012, 13:08 [ТС] | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
Несколько слов об ошибках Попова.
В сети, среди 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 | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
Хотелось бы рассказать о некоторых ошибках в 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 | |
|
спасибо вам огромное.благодаря вам у меня меньше головной боли стало.
0
|
|
|
61 / 23 / 7
Регистрация: 22.05.2012
Сообщений: 89
|
||||||
| 22.12.2014, 04:44 | ||||||
|
Хотелось бы добавить несколько слов насчет сравнения с учетом типа. Однажды писал авторизацию/регистрацию и в части авторизации отчасти было следующее: если пользователь подтвердил E-mail перейдя по ссылке из отправленного письма - он может авторизоваться, иначе после ввода логина и пароля пользователю показывалась ошибка о том, что учетная запись еще не активирована. Проверка проверялась примерно так (дословно уже не припомню, но суть передам и таким примером):
...
В тот момент будучи учеником в С++ у меня выработалась некоторая "паранойя" по поводу типов данных, поэтому в PHP я сравнивал данные с учетом типа. В коде выше у меня была семантическая ошибка в том, что данные из БД приходили в типе STRING (а я ведь почему то был уверен, что это был INT) и затем сравнивались с INT - естественно, возвращалось FALSE и код работал неправильно. Около половины дня потратил на поиск этой ошибки :-( Мораль данной ситуации в том, что сравнивать данные с учетом типа тоже нужно с некоторой аккуратностью
0
|
||||||
|
Почетный модератор
16844 / 6724 / 880
Регистрация: 12.06.2012
Сообщений: 19,967
|
|||||||
| 22.12.2014, 07:57 [ТС] | |||||||
|
А вообще, особенно после статически типизированных языков, нужно с еще большей внимательностью относиться к типам данных (вопреки некоторым мнениям, что динамическая типизация в разы лучше), т.к. компилятор языка PHP не предупредит о сравнении данных с разными типами, как при использовании статической типизации. Хотя, признаться, в некоторых языках с динамической типизацией, все же, есть некая проверка типов. Например, в лиспе подобный код выдаст ошибку, что foo не является числом
0
|
|||||||
| 22.12.2014, 07:57 | |
|
Помогаю со студенческими работами здесь
9
Справочник по ошибкам Post платы PHPStorm - навигация по ошибкам анализатора Сма Bauknecht WA 7540, Поделитесь информацией по ошибкам Сма Blomberg WNF 8447 нужна инфа по ошибкам сма Whirlpool AWE 6514 859365110040, нужны данные по ошибкам Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |
|
Новые блоги и статьи
|
|||
|
Идея фильтра интернета (сервер = слой+фильтр).
Hrethgir 31.03.2026
Суть идеи заключается в том, чтобы запустить свой сервер, о чём я если честно мечтал давно и давно приобрёл книгу как это сделать. Но не было причин его запускать. Очумелые учёные напечатали на. . .
|
Модель здравосоХранения 6. ESG-повестка и устойчивое развитие; углублённый анализ кадрового бренда
anaschu 31.03.2026
В прикрепленном документе раздумья о том, как можно поменять модель в будущем
|
10 пpимет, которые всегда сбываются
Maks 31.03.2026
1. Чтобы, наконец, пришла маршрутка, надо закурить. Если сигарета последняя, маршрутка придет еще до второй затяжки даже вопреки расписанию.
2. Нaдоели зима и снег? Не надо переезжать. Достаточно. . .
|
Перемещение выделенных строк ТЧ из одного документа в другой
Maks 31.03.2026
Реализация из решения ниже выполнена на примере нетипового документа "ВыдачаОборудованияНаСпецтехнику" с единственной табличной частью "ОборудованиеИКомплектующие" разработанного в конфигурации КА2. . . .
|
|
Functional First Web Framework Suave
DevAlt 30.03.2026
Sauve. IO
Апнулись до NET10.
Из зависимостей один пакет, работает одинаково хорошо как в режиме проекта
так и в интерактивном режиме. из сложностей - чисто функциональный подход.
Решил. . .
|
Автоматическое создание документа при проведении другого документа
Maks 29.03.2026
Реализация из решения ниже выполнена на нетиповых документах, разработанных в конфигурации КА2.
Есть нетиповой документ "ЗаявкаНаРемонтСпецтехники" и нетиповой документ "ПланированиеСпецтехники".
В. . .
|
Настройка движения справочника по регистру сведений
Maks 29.03.2026
Решение ниже реализовано на примере нетипового справочника "ТарифыМобильнойСвязи" разработанного в конфигурации КА2, с целью учета корпоративной мобильной связи в коммерческом предприятии.
. . .
|
Автозаполнение реквизита при выборе элемента справочника
Maks 27.03.2026
Программный код из решения ниже на примере нетипового документа "ЗаявкаНаРемонтСпецтехники" разработанного в конфигурации КА2.
При выборе "Спецтехники" (Тип Справочник. Спецтехника), заполняется. . .
|