Полезное для программистов:

Фриланс
Новости
Статьи
   
Рубрики:

Error. Page cannot be displayed. Please contact your service provider for more details. (7)


Грамотное взаимодействие Php4 с Mysql, пособие для начинающих

Поиск:
Начать писать скрипты с использованием Базы Данных для многих становится большой трудностью. В основном все бояться этого слова «Базы Данных», хотя ничего страшного нет. Главное, понять, как это работает, а потом уже дело встает лишь за реализацией на языке программирования.

MySQL мы будем рассматривать, как наиболее распространенную Базу Данных для Интернет-приложений, и как наиболее простую в плане работы с ней. Она идеально подходит для тех, кто только начинает познавать силу использования СУБД (Систем управления Базами Данных).

Сразу хочу оговориться, что рассматривать я буду только взаимодействие PHP4, поскольку в PHP5 было введено новое расширение MySQLi, которое позволяет использовать все возможности более новых версий СУБД MySQL. Дело в том, что разработчики MySQL с выходом новой ветки сервера усложняют его, и уже по их заверениям в MySQL 5.x мы сможем использовать принципы транзакции и многих других полезных вещей.

1. База Данных. Как много в этом слове для сердца прогера слилось...
2. Соединяемся с Базой Данных.
3. Создание Базы Данных и таблицы.
4. Посылаем запрос и обрабатываем результат.
5. Правильный синтаксис запросов.
6. Использование mysql_escape_string(); в целях безопасности.
7. Учимся искать свои ошибки.
8. Советы на будущее.

-----------------------------------------------------------------

1. База Данных. Как много в этом слове для сердца прогера слилось..

Первую часть своей статьи я хочу посвятить общим вопросам взаимодействия языка программирования, в частности PHP, и сервера Баз Данных – MySQL.

Итак, рассмотрим схему работы.
Как вы уже знаете, запрос пользователя на http://example.com в первую очередь поступает на Apache. Затем, если заглавная страница является скриптом PHP, Apache посылает index.php на интерпретатор PHP,а уже полученный гипертекст возвращает пользователю.
Предположим, что в PHP есть код для работы с MySQL. Первым делом идет соединение с Базой Данных. Затем, скрипт с помощью специальных функций посылает к серверу Баз Данных SQL запросы, т.е. команды. К примеру
Код
SELECT `*` FROM `table`

SQL это язык структурированных запросов (Structure Query Language). Иногда SQL запросы называют SQL инструкциями или командами.

Сервер, получив данную команду, обрабатывает ее, производит необходимые операции с Базой Данных и возвращает в скрипт результат выполнения запроса в виде «Ресурса» или ошибку. «Ресурс» это, по сути, указатель на ячейку в оперативной памяти, но не явный.
Получив результат выполнения запроса, к примеру, SELECT скрипт с помощью специальных функций может получить все данные в массив, сами функции, как раз и будут обращаться к ячейке в памяти и забирать оттуда информацию.

Еще один маленький момент. Есть Сервер Баз Данных. В нем может быть несколько Баз Данных, в каждой Базе Данных может быть несколько таблиц. Почему-то это с трудом укладывается в голове у начинающих разработчиков.

В этой статье я не могу раскрыть всех возможностей и тонкостей поставленной задачи. Но вы всегда сожжете найти информацию по синтаксису запросов и многому другому тут: http://dev.mysql.com/doc/mysql/ru/

2. Соединяемся с Базой Данных

Код
<?php

$host = "localhost";    // Имя хоста
$port = "3306";         // Номер порта, 3306 - по умолчанию
$user = "root";         // Имя пользователя
$pass = "*********";    // Пароль
$dbnm = "test";         // Имя Базы Данных

$h = ( empty( $post ) ) ? $host : $host . ":" . $port;

$db = mysql_connect( $h , $user , $pass );
// Соединяемся с Сервером Баз Данных

if( !$db )   // Если соединиться не удалось:
 {
  print ("Datebase connection failed.");
  // Пишем ошибку и завершаем выполнение скрипта.
  exit();
 }

// иначе выбираем Базу Данных для работы
if( ! mysql_select_db( $dbnm ) )  // Если нет такой БД
 {
  print ("Datebase select failed.");
  // Пишем ошибку и завершаем выполнение скрипта.
  exit();
 }

?>


Вот самый простой пример соединения с Базой Данных.
Помимо mysql_connect(); есть еще и mysql_pconnect(); разница между этими функциями в том, что mysql_pconnect(); создает постоянное соединение, а mysql_conect(); - каждый раз новое. При этом стоит отметить, что при использовании mysql_connect(); обязательно закрывать соединение mysql_close(); в то время, как при mysqLpconnect(); этого делать не требуется.

Обращаю ваше внимание на то, что в MySQL существует система привилегий пользователей, и поэтому не всегда вы сможете выполнить любые запросы. Сделано это в целях безопасности.

3. Создание Базы Данных и таблицы.

Для хранения, каких либо данных вам необходимо сначала создать Базу Данных и хотя бы одну таблицу в ней. Они создаются обычными SQL запросами. Для создания баз данных с именем test используем:
Код
CREATE DATABASE ‘test’

SQL запрос для создания таблиц чуть более сложный.
Код
CREATE TABLE `test_table` (
`id` INT NOT NULL AUTO_INCREMENT,
`name` TINYTEXT NOT NULL ,
`text` TEXT NOT NULL ,
PRIMARY KEY ( `id` )
);

Выполнение данного запроса создаст таблицу с тремя полями id, name, text, где id – счетчик и первичный ключ, который необходим для идентификации каждой записи.. К примеру у вас в таблице может храниться упоминание о двух Машах Ивановых, и как вы разберете какая из них какая? Первичный ключ поможет вам это сделать.

4. Посылаем запрос и обрабатываем результат.

Посылается запрос очень легко функцией mysql_query();. К примеру, следующий код сможет вставить в нашу таблицу какие-то данные:
Код
<?php
// Соединение с Базой данных

$res = mysql_query( "INSERT INTO `test_table` VALUES ( '' , 'Вася' , 'Программист' )" );
?>

Переменная $res необходима нам для последующих операций с результатами запроса. Для запроса INSERT это не актуально, но вот для выборки данных (SELECT) это жизненно необходимо.
Пример:
Код
<?php
// Соединение с Базой данных

$res = mysql_query( "SELECT `*` FROM `test_table`" );
while( $row = mysql_fetch_object( $res ) )
{  print "ID: " . $row -> id . ", Name: " . $row -> name . ", text: " . $row -> text . ".";  }

?>

Цикл while при каждом проходе получает в переменную $row данные каждой извлеченной записи, начиная с первой выбранной. В данном случае данные мы получаем как объект, но можно получить как и ассоциативный массив, где индексами массива $row будут имена полей, в нашем же случае имена полей в таблице – названия свойств объекта $row. Тут каждый выбирает то, что ему больше нравится.

Еще есть вариант вытащить значение одной ячейки: mysql_result( $res , <номер строки> , <имя поля> );, но эта функция довольно-таки «тормозная» и ее применять не рекомендуется.

5. Правильный синтаксис запросов.

Этот вопрос на самом деле ключевой. Поскольку из-за не соблюдения синтаксиса запросов очень часто возникают разные ошибки, причем ошибки логического плана, когда у вас должен быть один результат, а на практике оказывается совсем другой. Да и с точки зрения безопасности такие ошибки могут привести к SQL инъекциям.

1. Имя базы данных и таблицы выделяем в тильду, кнопочка с буквой Ё.
2. Там где у нас тип поля в таблице строковой, выделяем его апострофами ‘.
3. Там где у нас числовой тип данных, никаких кавычек или апострофов не пишем.

Именно эти три пункта зачастую приводят к диким последствиям.

6. Использование mysql_escape_string(); в целях безопасности

Самое главное правило при разработке любых приложений: «Никогда не доверяй данным, которые пришли от пользователя». При работе с MySQL и PHP этот вопрос также актуален. Да, бесспорно надо проверять данные, которые пришли от пользователя в самом скрипте, но и помимо этого необходимо использовать mysql_escape_string Эта функция мнемонизирует строку, чтобы её можно было передать функции mysql_query();.

Применять данную функцию необходимо ко всему запросу целиком. Т.е. если мы получаем имя из адресной строки браузера, наш код на выборку будет выглядеть следующим образом:
Код
<?php
// Соединение с Базой данных

$res = mysql_query( "SELECT `*` FROM `test_table` WHERE `name` = '" . mysql_escape_string( $_GET['name'] ) . "'" );
while( $row = mysql_fetch_object( $res ) )
{  print "ID: " . $row -> id . ", Name: " . $row -> name . ", text: " . $row -> text . ".";  }

?>


7. Учимся искать свои ошибки.

Для новичков это – камень преткновения. Вечно появляются вопросы: «а что у меня не так», «а почему у меня не работает». Вся проблема заключается лишь в незнании как грамотно ловить и обрабатывать ошибки. Поскольку, прочитав текст ошибки, сообразить, в чем дело – совсем не сложно.

В PHP есть две функции: mysql_error() и mysql_errno();. Первая возвращает текст ошибки, а вторая - код ошибки в числовом формате. Поэтому для определения выполнился ли запрос или нет, надо писать:
Код
<?php
// Соединение с Базой данных

$res = mysql_query( "SELECT `*` FROM `test_table` WHERE `name` = '" . mysql_escape_string( $_GET['name'] ) . "'" );

if( mysql_errno() == 0 )
{
  while( $row = mysql_fetch_object( $res ) )
   {  print "ID: " . $row -> id . ", Name: " . $row -> name . ", text: " . $row -> text . ".";  }
}
else
{  print mysql_error();  }

?>

0 – возвращается, если запрос был выполнен успешно. В противном случае – MySQL вернет свой код ошибки.

При отладке скриптов как правило таких конструкций не пишут. Это, по сути, лишний код. В основном, в случае, print mysql_error(); вставляется сразу после mysql_query();.

Обращаем ваше внимание, что запрос на выборку, не вызовет ошибок, если он вернул 0 записей. Для этого самому необходимо проверять кол-во записей полученных запросом с помощью функции mysql_num_rows();

8. Советы на будущее.

Уже когда собирался публиковать статью, вспомнил, что в свое время мои знания о возможностях MySQL были ограничены.
Поэтому хочу вам сказать, что MySQL поддерживает многие функции преобразования строк, дат, чисел, поэтому не думайте что, список агрегатных функций ограничен MAX(), MIN(), COUNT().

Помимо это есть один момент касающийся скорости выполнения SQL запросов.
К примеру
Код
SELECT COUNT(`*`) FROM `table`

будет выполнен намного быстрее, нежели
Код
SELECT COUNT(`pole`) FROM `table`

Хотя заметить вы это сможете только на очень больших таблицах. Так же и с другими агрегатными функциями.
Автор: Mal Hack
Сайт: http://mal-hack.net






Просмотров: 9326

 

 

Новые статьи:


Популярные:
  1. Как сделать цикличным проигрывание MIDI-файла?
  2. Создание AVI файла из рисунков
  3. Как устройство "отключить в данной конфигурации"?
  4. Kто в данный момент присоединен через Сеть?
  5. Как узнать количество доступной памяти?
  6. Как реализовать в RichEdit разноцветный текст?
  7. Как скрыть свое приложение от ProcessViewer
  8. Как программно нажать/скрыть/показ кнопку "Start"?
  9. Модуль работы с ресурсами в PE файлах
10. Функции вызова диалоговых окон выбора
11. Проверка граматики средствами Word'а из Delphi.
12. Модуль для упрощенного вызова сообщений
13. Функции для записи и чтение своих данных в, ЕХЕ- файле
14. Рекурсивный просмотр директорий
15. Network Traffic Monitor
16. Разные модули
17. Универсальная функция для обращения к любым экспортируем функциям DLL
18. Библиотека от VladS
19. Протектор для UPX'а
20. Еще об ICQ, сообщения по контакт листу?
21. Использование открытых интерфейсов
22. Теория и практика использования RTTI
23. Работа с TApplication
24. Примеры использования Drag and Drop для различных визуальных компонентов
25. Что такое порт? Правила для работы с портами
26. Симфония на клавиатуре
27. Загрузка DLL
28. Исправление автоинкремента
29. Взаимодействие с чужими окнами
30. Проверить дубляжи в столбце


 

 

 
 
На главную