Навигация
Главная
Поиск
Форум
FAQ's
Ссылки
Карта сайта
Чат программистов

Статьи
-Delphi
-C/C++
-Turbo Pascal
-Assembler
-Java/JS
-PHP
-Perl
-DHTML
-Prolog
-GPSS
-Сайтостроительство
-CMS: PHP Fusion
-Инвестирование

Файлы
-Для программистов
-Компонеты для Delphi
-Исходники на Delphi
-Исходники на C/C++
-Книги по Delphi
-Книги по С/С++
-Книги по JAVA/JS
-Книги по Basic/VB/.NET
-Книги по PHP/MySQL
-Книги по Assembler
-PHP Fusion MOD'ы
-by Kest
Professional Download System
Реклама
Услуги

Автоматическое добавление статей на сайты на Wordpress, Joomla, DLE
Заказать продвижение сайта
Программа для рисования блок-схем
Инженерный калькулятор онлайн
Таблица сложения онлайн
Популярные статьи
OpenGL и Delphi... 65535
Форум на вашем ... 65535
HACK F.A.Q 65535
Гостевая книга ... 65535
Содержание сайт... 65535
Вызов хранимых ... 65535
Эмулятор микроп... 65535
Бип из системно... 58767
Invision Power ... 57732
Организация зап... 57528
Модуль Forms 56557
Создание отчето... 55176
Приложение «Про... 54931
Подключение Mic... 54713
Оператор выбора... 54511
ТЕХНОЛОГИИ ДОСТ... 51235
Программируемая... 47880
Пример работы с... 46994
Имитационное мо... 46927
21 ошибка прогр... 41967
Реклама
Сейчас на сайте
Гостей: 4
На сайте нет зарегистрированных пользователей

Пользователей: 13,008
новичок: pelageya
Новости
Реклама
Выполняем курсовые и лабораторные по разным языкам программирования
Подробнее - курсовые и лабораторные на заказ
Delphi, Turbo Pascal, Assembler, C, C++, C#, Visual Basic, Java, GPSS, Prolog, 3D MAX, Компас 3D
Заказать программу для Windows Mobile, Symbian

База данных междугородних телефонных разговоров на Delphi
Поиск пути в графе заданном списками инцедентности на Turbo Pascal
База данных - рабочее место кассира на Delphi + бд Access

Реклама

21 ошибка программиста PHP

Здесь для их эффективной обработки полезно использовать функцию sql_fetch_row() в сочетании с count():

for ($i = 0; $i < count($row); $i++){
print "Столбец". ($i + 1). $row[$i]. "\n
\n";
}
?>
Ошибки SQL: запрашивается не то, что нужно
Практика показывает, что обработка выборки из БД средствами PHP - тоже является ошибкой. Бывали случаи, когда для простого поиска по 2Мб БД программисты использовали PHP, а потом возмущались его медлительностью. А делать выборку "весом" в два метра занимает целую вечность.

Язык Структурированных Запросов (SQL) был специально разработан для запросов и получения данных из таблиц в БД. Идея языка заключается в отсеивании данных ненужных вам (средствами SQL) и получении только тех, которые вам действительно необходимы для дальнейшей обработки (например, средствами PHP).

Если вы заметили, что получаете в выборке данных, больше, чем вам нужно, это верный признак недоработанных SQL-запросов.
Условие WHERE
Классический пример эффективного применения SQL-запросов - использование условия WHERE в синтаксисе SQL.

Рассмотрим пример кода, производящего выборку и выводящего список имён и телефонов всех пользователей с id равным 5:

// В предыдущих строках
// устанавливается соединение, и $conn
// определяется как дескриптор соединения.

$statement = "SELECT name, phone, id FROM samp_table";
$result = @sql_query ($statement, $conn);

if (!$result) {
die (sprintf ("Ошибка [%d]: %s", sql_errno (), sql_error ()));
}

if (@sql_num_rows ($result) <= 0) {
die ("Получено ноль результатов");
}

while ($row = @sql_fetch_array ($result)){
if ($row[id] &amp; 5) {
print "Имя: $row[name]\n
\n";
print "Телефон: $row[phone]\n
\n";
break;
}
}
?>
Данный код имеет следующие недоработки: для поиска по всей БД используется PHP; при работе с БД малого размера на это можно и не обращать внимания, но с ростом БД вы обязательно заметите резкое падение скорости работы скриптов.

Выход прост: включите в SQL-запрос условие WHERE:

$statement = "SELECT name, phone FROM samp_table";
$statement .= " WHERE id='5'";
WHERE позволит применить более строгие критерии выборки. Фильтром в данном случае будет являться значение аргумента. В нашем примере это "id=5".

Получив нужную вам выборку, вы используете PHP для простого вывода результатов:

if (@sql_num_rows ($result) != 1) {
die ("Получено неверное количество рядов");
}

$row = @sql_fetch_array ($result);
print "Имя: $row[name]\n
\n";
print "Телефон: $row[phone]\n
\n";
?>
Обработка результатов выборки средствами PHP
Нередко программист намеренно не сортирует выборку при запросе, перекладывая эту работу на PHP. Такой подход неэффективен, ибо сортировка средствами SQL проходит намного быстрее, чем в PHP.

Для сортировки результатов рекомендуем применять синтаксис SQL (ORDER BY), а не PHP-функцию ksort().

Рассмотрим пример использования ksort() для сортировки выборки по имени (name):

$statement = "SELECT name, email, phone FROM some_table ";
$statement .= "WHERE name IS LIKE '%baggins'";

$result = @sql_db_query ($statement, "samp_db", $conn);

if (!$result) {
die (sprintf ("Ошибка [%d]: %s", sql_errno (),sql_error ()));
}

while ($row = @sql_fetch_array ($result)){
$matches[ $row[name] ] = array ($row[email], $row[phone]);
}

ksort ($matches);
?>
Возникает вопрос: а почему бы ни провести сортировку результатов во время выборки? Это избавит нас от необходимости проходить по всему массиву с результатами дважды.

Итак, убираем ksort() и исправляем SQL-запрос, добавив ORDER BY:

$statement = "SELECT name, email, phone FROM some_table ";
$statement .= "WHERE name IS LIKE '%baggins' ORDER BY name";
?>
12. Слабая устойчивость к ошибкам
В природе существует огромное количество скриптов абсолютно не справляющихся с пользовательскими ошибками. Своим появлением такие скрипты обязаны программистам, которые не удосуживаются правильно распланировать будущий проект и определить все места возможных ошибок. Причём этим следует заняться до того, как скрипт был написан. Недоработки подобного рода приводят к сбоям программы, что чревато не только получением некорректных результатов, но и падением системы!
Предусмотреть худшее
Любой скрипт может "свалиться" при наступлении каких-либо "критичных" условий. Чтобы свести такой риск к минимуму всегда нужно:
• проверять результаты вызова функций:
• проверять результаты системных вызовов:
• в файле php.ini устанавливать уровень error_reporting на E_ALL

Проверка результатов вызова функций
При вызове функции, результаты которой подвергаются дальнейшей обработке, обязательно убедитесь, что возвращаемые данные находятся в интервале допустимых значений.

В приведённом ниже примере на шестом витке цикла возникает ошибка "деление на ноль", поскольку $i наращивается на 1, а $j уменьшается на 1. На шестом проходе $i=$j=1.

mt_srand((double)microtime() * 10000000);

function do_math ($a, $b) {
return (($a - $b) * 2) / mt_rand();
}

for ($i = 5, $j = -5; $i > -5; $i--, $j++){
print $j / do_math ($i, $j) . "\n";
}
?>
Проверка результатов системных вызовов
При обращении к внешним файлам или процессам всегда проверяйте, всё ли работает корректно.

Блестящий тому пример - проверка ответа системы при вызове функции sql_connect(). Стоит проверить этот ответ и убедиться, что подключение к БД действительно имело место. Если этого не сделать, то все запросы к БД могут не состояться, а некоторые данные могут быть утеряны; вы же будете пребывать в счастливом неведении.

$conn = @sql_connect ($host, $user, $pass);

if (!$conn) {
die (sprintf ("Ошибка [%d]: %s", sql_errno (), sql_error ()));
}
?>
Установка уровня error_reporting в файле php.ini на E_ALL
Убедитесь, что PHP правильно сконфигурирован, то есть уровень error_reporting (отображение сообщений об ошибках) выставлено на наивысший уровень. При другой конфигурации, по крайней мере, на время отладки скриптов, многие ошибки типа "неверное регулярное выражение", "недопустимое значение" ускользнут от вашего внимания.

Обратимся ещё раз к примеру, приведённому в части "Проверка результатов вызова функций". Предположим, что error_reporting выставлен не на максимум, а, скажем, на E_ERROR.

Обратите внимание на то, как скрипт выполняет функцию do_math, но не сообщает об ошибке "деление на ноль", которая, однако, имела место (при $i=$j=0 вывода результата просто не было).

error_reporting (E_ERROR);

mt_srand ((double)microtime() * 1000000);

function do_math ($a, $b) {
return (($a - $b) * 2) / mt_rand();
}

for ($i = 5, $j = -5; $i > -5; $i--, $j++){
print $j / do_math ($i, $j) . "\n";
}
?>
Результат работы скрипта:

-5148.25
-5271
-323.75
-4931
-7713.5

-4702.5
-488.5
-928.5
-1394.75

Свои обработчики ошибок
Как правило, PHP выдаёт сообщения об ошибках непосредственно в браузер и не позволяет разработчику подавить или перехватить их. Однако в PHP4 у вас появилась возможность перехвата таких сообщений с помощью функции set_error_handler().

Функция set_error_handler() применяется для записи ошибок вашего скрипта. Теперь вы можете перехватывать все ошибки и программировать собственные обработчики - warning'и пользователей больше не побеспокоят.

В следующем примере set_error_handler() назначает обработчиком по умолчанию функцию error_handler(). В случае возникновения ошибки вызывается error_handler(), и встроенная функция error_log() регистрирует сбой в файле лога error_file.

Если происходит ошибка класса E_ERROR, работа скрипта прекращается и выводится сообщение об ошибке.


// void error_handler(string type, string message, string file, int line)
// Индивидуальный обработчик ошибок, определён функцией
// set_error_handler()

function error_handler ($type, $message, $file = __FILE__, $line = __LINE__) {
error_log("$message, $file, $line", 3, 'error_file');
if ($type & E_ERROR) {
print 'Произошла ошибка, зарегистирована.';
exit;
}
}

set_error_handler('error_handler');
?>
11. Неоправданное использование ООП
Парадигма ООП - замечательный подход к написанию кода. У ООП есть множество неоспоримых преимуществ, самое значительное из которых - возможность использовать заново уже некогда написанный код. Однако все мы рано или поздно осознаём тот факт, что 'PHP - не объектно-ориентированный язык'.

Несмотря на то, что PHP имеет корректно работающую поддержку объектов, использовать объекты там, где можно без них обойтись - недальновидно и неэффективно. Причина? Дело в том, что поддержка парадигмы ООП в PHP реализована не в полном объёме.

Несмотря на присутствие основных элементов, PHP всё-таки не хватает многих "продвинутых" функций (как защищённые члены или закрытые переменные), которые обязательны для "настоящих" объектно-ориентированных языков (например, Java, C++).

Кроме того, поддержка объектов в PHP недостаточно отработана и не очень эффективна. Это означает, что использование парадигмы ООП может существенно снизить скорость выполнения программы.
Примечание: Другими словами, скрипт, работающий на объектах будет исполняться медленнее, как код внутри eval() по сравнению с обычным кодом. Для более наглядных примеров, где использование ООП принимает какие-то уродливые формы, пришлось бы прибегнуть к продвинутым функциям концепциям PHP, некоторые из которых даже незадокументированы. Так что остановимся на этом.
А что же мы сможем без ООП?
Если вы пришли в PHP из Java или C++, где без объектов трудно создать что-либо более или менее серьёзное, то и в PHP вам будет трудно обходиться без них. Но будьте уверены, что серьёзные приложения могут быть написаны и методик и приёмов ООП (PHP был написан на C, а последний, как мы знаем, не поддерживает объектов).

Итак, для тех, кто не привык обходиться без ООП, приведём альтернативные технологии написания связных и расширяемых приложений вне парадигмы ООП:
• Создание API.
• Разработка концепции именования (и работа в её рамках).
• Группирование взаимосвязанных функций в один файл.

Создание API
Соотнесём код программы с тремя уровнями:
• Первый - собственно рабочие функции.
• Второй - API функции. Сюда входят функции для построения конкретного приложения.
• Третий - само приложение:

// MortgageRate.php (Ипотечный Кредит)

// Уровень первый - внутренние функции
// Внутренние функции для расчёта оптимальной процентной ставки исходя из времени и размера помесячных выплат

function _mort_find_interest_rate ($total) {
if ($total < 30000)
return (7.4);
elseif ($total > 30000)
return (3.2);
elseif ($total > 50000)
return (2.5);
else
return (1.7);
}

// Уровень второй - API функции

// double calculate_mortgage_rate (int money, int time, int month)
// Рассчитывает процентную ставку исходя из суммы займа, времени погашения и интервала выплат

function calculate_mortgage_rate ($money, $time, $month) {
$rate = _mort_find_interest_rate ($money) / 100;
$money /= ($time / $month);
return ($rate * $money) + $money;
}

?>

// CalcMortgage.php

// Третий уровень - приложение
// $money, $time и $period получаем из формы

include_once 'MortgageRate.php';

$price = calculate_mortgage_rate ($money, $time, $period);

print "Ваша процентная ставка за $period составляет $price";
?>
Разработка концепции именования и работа в её рамках.
Один из самых неприятных моментов при разработке больших приложений - это конфликты пространства имён. Классы его сегментируют. Таким образом, разные классы могут:
• иметь свойства с одинаковыми именами или
• содержать в себе методы с одинаковыми именами.
Например, класс Phillips и класс Normal могут одновременно содержать метод с именем screwdriver.

В общем, перед началом большого проекта рекомендуется продумать именование для всего, в частности, способы различия глобальных и регулярных переменных, определения библиотечных функций и т. д.
Группирование взаимосвязанных функций в один файл
Связанные API функции лучше всего собрать в один файл так же, как связанные методы объединяются в класс. Такие файлы можно представить классами, где каждая функция представляет собой как бы метод этого класса. Так, каждая функция будет иметь ясное определение и прозрачную структуру.

Например, можно было бы все функции, связанные с общением с БД, собрать в файл DB.php.
ООП, как и всё на свете, хорошо в меру
Небольшая оговорка: эта глава была написана не для того, чтобы отговорить вас от использования ООП вообще. Скорее, это была попытка убедить вас не работать с PHP в режиме Java или C++, где ООП - решение номер один.

Проведите тщательный анализ всех выгод и потерь, прежде чем применить объектный подход в PHP.
10. Неоправданное использование регулярных выражений
Регулярные выражения - мощный инструмент для поиска и организации данных, как, например, проверка адреса электронной почты на корректность или поиск URL. Но в то же время регулярные выражения работают медленнее других функций PHP, предназначенных для более простых задач.

Опубликовал Kest October 26 2008 15:46:29 · 1 Комментариев · 41967 Прочтений · Для печати

• Не нашли ответ на свой вопрос? Тогда задайте вопрос в комментариях или на форуме! •


Страница 3 из 4 < 1 2 3 4 >
Комментарии
Михаил November 24 2010 16:20:09
По-моему статья не закончена.
Добавить комментарий
Имя:



smiley smiley smiley smiley smiley smiley smiley smiley smiley
Запретить смайлики в комментариях

Введите проверочный код:* =
Рейтинги
Рейтинг доступен только для пользователей.

Пожалуйста, залогиньтесь или зарегистрируйтесь для голосования.

Отлично! Отлично! 50% [1 Голос]
Очень хорошо Очень хорошо 0% [Нет голосов]
Хорошо Хорошо 50% [1 Голос]
Удовлетворительно Удовлетворительно 0% [Нет голосов]
Плохо Плохо 0% [Нет голосов]
Гость
Имя

Пароль



Вы не зарегистрированны?
Нажмите здесь для регистрации.

Забыли пароль?
Запросите новый здесь.
Поделиться ссылкой
Фолловь меня в Твиттере!
Загрузки
Новые загрузки
iChat v.7.0 Final...
iComm v.6.1 - выв...
Visual Studio 200...
CodeGear RAD Stud...
Шаблон для новост...

Случайные загрузки
Философия C++. Пр...
Пользовательская...
Введение в станда...
Trojan [Исходник ...
Delphi Russian Kn...
Разработка распре...
GamesBase 3.0
Strawberry Prolog...
JanButtonsV
Java 2 - Эффектив...
Аватары в комме...
Delphi World 6.0
Turbo Pascal for ...
ComboBox97
Последнее загруж...
Фундаментальные а...
3D Октаэдр
KOL & MCK v1.69
ShadelLabel
Проигрыватель Mp3

Топ загрузок
Приложение Клие... 100276
Delphi 7 Enterp... 75339
Converter AMR<-... 20017
Borland C++Buil... 10492
GPSS World Stud... 8868
Borland Delphi ... 7496
Turbo Pascal fo... 6868
Visual Studio 2... 4869
Калькулятор [Ис... 3852
FreeSMS v1.3.1 3482
Случайные статьи
Переустановка пров...
Искажения образа т...
Расшифровка данных...
Язык С и С ++: дос...
1.1. Набросок решения
Описание внешних ф...
Запуск просмотрщика
6.3. Классификаци...
Максимально свобод...
15.1. Слова
Достаточность
Интерфейс между ко...
Как оформлять курс...
Бинарный поиск и п...
Уровень защищенных...
ВКонтакте, Однокла...
Использование прог...
Программы для Винд...
Проверка балланса....
Рабочий пример: те...
Арифметическое выр...
Безлимитный хостинг
Invalid subrange b...
Что является станд...
Сортировка числово...
Статистика



Друзья сайта
Программы, игры


Полезно
В какую объединенную сеть входит классовая сеть? Суммирование маршрутов Занимают ли таблицы память маршрутизатора?