В статье предлагается несколько простых функций языка PHP для взаимодействия с СУБД MySQL, которые могут значительно облегчить повседневную работу программистов.
Работа с MySQL силами встроенных функций PHP (таких как mysql_query(), mysql_fetch_assoc() и др.) не является чем-то сложным. Однако синтаксические конструкции, требуемые для обработки результатов запроса, обычно занимают пару лишних строк кода. Приходится либо повторять такой код каждый раз, либо использовать специальные библиотеки, которые призваны эту задачу автоматизировать. Эти библиотеки, однако, часто берут на себя дополнительные (обычно довольно бесполезные) задачи, в результате чего интерфейс их усложняется и такими библиотеками оказывается неудобно пользоваться.
Предлагаемые в настоящей статье функции позволяют решать подавляющее большинство задач по отправке и обработке результатов запросов к серверу MySQL, используя для этого очень небольшое количество программного кода.
Далее в статье следуют примеры ипользования функций1, после чего приводится их код (его можно также скачать в виде файла).
mysql_q() — отправка запроса и слежение за ошибками
Нередко оказывается, что запрос к MySQL содержит ошибку, из-за чего приложение неправильно работает. Функция mysql_query() при этом ведет себя молчаливо, не выводя никаких сообщений. Поэтому поиск места, где ошибка произошла, часто становится проблемой.
Функция mysql_q() помогает быстро найти проблемное место — в случае ошибки в запросе она выводит на экран сообщение с информацией об ошибке и прекращает работу скрипта2.
Рассмотрим пример:
$query = "SELECT NOW"; // забыли поставить скобки
mysql_query($query); // ничего не происходит
mysql_q($query); // а вот mysql_q() проинформирует об ошибке
?>
После работы mysql_q() на экране появится сообщение:
MySQL error in file /usr/home/www/наш_сайт/html/test.php at line 7 (function mysql_q):
Unknown column 'NOW' in 'field list'
SELECT NOW
Функция mysql_q() пригодна для любых запросов (не только SELECT):
mysql_q("SET @a = 1");
mysql_q("USE some_other_database");
mysql_q("TRUNCATE some_table");
mysql_q("DROP some_table");
mysql_q("START TRANSACTION");
// и др.
Код этой функции весьма прост и его можно легко модифицировать так, чтобы функция решала какие-нибудь ещё полезные задачи: например, отправляла письмо администратору сайта в случае ошибки, измеряла время выполнения некоторых запросов и многое другое.
Далее речь пойдет о функциях для обработки запросов, которые возвращают результат — это, прежде всего, запросы SELECT, а также некоторые другие. Для отправки запросов все эти функции используют mysql_q().
В примерах будет использована вот такая таблица:
+----+-----------+-------+---------------------+
| id | name | price | created |
+----+-----------+-------+---------------------+
| 1 | Веник | 100 | 2010-10-09 22:24:14 |
| 2 | Швабра | 500 | 2010-10-09 22:24:26 |
| 3 | Чайник | 1500 | 2010-10-09 22:24:37 |
| 4 | Совок | 150 | 2010-10-09 22:24:51 |
| 5 | Телевизор | 5000 | 2010-10-09 22:24:59 |
| 6 | Ведро | 150 | 2010-10-09 22:25:18 |
+----+-----------+-------+---------------------+
6 rows in set (0.00 sec)
mysql_getcell() — получение одной ячейки
Функция mysql_getcell() предназначена для получения результатов запросов, которые состоят из одной строки и одного столбца (такие запросы называются скалярными). Результаты mysql_getcell() возвращает в виде скалярной переменной:
echo mysql_getcell("SELECT NOW()"); // 2010-10-09 22:30:05
echo mysql_getcell("SELECT COUNT(*) FROM products"); // 6
echo mysql_getcell("SELECT name FROM some_table ORDER BY price LIMIT 1"); // Телевизор
// и др.
Если в запросе встретится ошибка — в сообщении будет указано место, откуда вызывается mysql_getcell()3:
echo mysql_getcell("SELECT NOW");
?>
MySQL error in file /usr/home/www/наш_сайт/html/test.php at line 2 (function mysql_getcell):
Unknown column 'NOW' in 'field list'
SELECT NOW
Код функции приводится ниже.
mysql_getrow() — получение одной строки
Функция mysql_getrow() служит для получения результатов запросов, которые состоят из одной строки. mysql_getrow() вернёт результат запроса в виде одномерного ассоциативного массива, ключами которого являются имена колонок, а значениями - то, что хранится в соответствующих ячейках:
$query = "SELECT * FROM products WHERE id = 5";
$data = mysql_getrow($query);
print_r($data);
?>
Array
(
[id] => 5
[name] => Телевизор
[price] => 5000
[created] => 2010-10-09 22:24:59
)
Код функции mysql_getrow() приводится ниже.
mysql_getcolumn() — получение одного столбца
Функция mysql_getcolumn() служит для получения результатов запросов, которые состоят из нескольких строк и одного столбца. mysql_getcolumn() возвращает результат запроса в виде одномерного массива:
$query = "SELECT name FROM products ORDER BY price DESC";
$data = mysql_getcolumn($query);
print_r($data);
?>
Array
(
[0] => Телевизор
[1] => Чайник
[2] => Швабра
[3] => Совок
[4] => Ведро
[5] => Веник
)
Можно и запросы типа таких:
print_r(mysql_getcolumn("SHOW TABLES LIKE 'products'"));
?>
Array
(
[0] => products
)
Иногда бывает нужно иметь такой массив, ключи которого содержат значения какого-нибудь уникального поля (столбца) соответствующих записей. С помощью mysql_getcolumn() сделать это очень легко — нужно добавить это поле в запрос и указать в качестве второго аргумента TRUE. Ключами становятся значения того поля, которое указано в запросе первым:
$query = "SELECT id, name FROM products ORDER BY price DESC";
$data = mysql_getcolumn($query, TRUE);
print_r($data);
?>
Array
(
[5] => Телевизор
[3] => Чайник
[2] => Швабра
[4] => Совок
[6] => Ведро
[1] => Веник
)
Код функции mysql_getcolumn() приводится ниже.
mysql_gettable() — для табличных запросов
Табличным называется запрос, результат которого содержит более одной строки и более одного столбца. Функция mysql_gettable() возвращает его в виде двумерного массива:
$query = "SELECT * FROM products ORDER BY price DESC LIMIT 3";
$data = mysql_gettable($query);
print_r($data);
?>
Array
(
[0] => Array
(
[id] => 5
[name] => Телевизор
[price] => 5000
[created] => 2010-10-09 22:24:59
)
[1] => Array
(
[id] => 3
[name] => Чайник
[price] => 1500
[created] => 2010-10-09 22:24:37
)
[2] => Array
(
[id] => 2
[name] => Швабра
[price] => 500
[created] => 2010-10-09 22:24:26
)
)
print_r(mysql_gettable("SHOW VARIABLES LIKE 'query_cache%'"));
?>
Array
(
[0] => Array
(
[Variable_name] => query_cache_limit
[Value] => 1048576
)
[1] => Array
(
[Variable_name] => query_cache_min_res_unit
[Value] => 4096
)
[2] => Array
(
[Variable_name] => query_cache_size
[Value] => 134217728
)
[3] => Array
(
[Variable_name] => query_cache_type
[Value] => ON
)
[4] => Array
(
[Variable_name] => query_cache_wlock_invalidate
[Value] => OFF
)
)
Есть возможность записать в ключи массива значения уникального поля. Для этого поле нужно добавить в запрос (если оно уже не присутствует в неявном виде как часть *) и указать имя поля вторым аргументом4:
$query = "SELECT * FROM products ORDER BY price DESC LIMIT 3";
// вместо * можно было написать id, name, price, created
$data = mysql_gettable($query, 'id');
print_r($data);
?>
Array
(
[5] => Array
(
[id] => 5
[name] => Телевизор
[price] => 5000
[created] => 2010-10-09 22:24:59
)
[3] => Array
(
[id] => 3
[name] => Чайник
[price] => 1500
[created] => 2010-10-09 22:24:37
)
[2] => Array
(
[id] => 2
[name] => Швабра
[price] => 500
[created] => 2010-10-09 22:24:26
)
)
Код функции mysql_gettable() приводится ниже.
Код функций
Наличие функции mysql_q() является обязательным для работы остальных. Приводимый ниже код можно скачать одним файлом.
if ($result = mysql_query($sql)) return $result;
else {
$trace = debug_backtrace();
if (in_array($trace[1]['function'], array('mysql_getcell', 'mysql_getrow', 'mysql_getcolumn', 'mysql_gettable')))
$level = 1;
else $level = 0;
$message =
'<p><strong>MySQL error</strong> in file <strong>'.$trace[$level]['file'].'</strong>'.
" at line <strong>" .$trace[$level]['line']."</strong>
(function <strong>" . $trace[$level]['function'] ."</strong>):<br/>"
."\n<span style='color:blue'>".mysql_error()."</span>\n\n<pre>$sql</pre></p>";
die($message);
}
}
$cell = FALSE;
if ($result = mysql_q($sql) AND $row = mysql_fetch_row($result)) $cell = $row[0];
return $cell;
}
перейти к описанию mysql_getcell()
$row = array();
if ($result = mysql_q($sql)) $row = mysql_fetch_assoc($result);
return $row;
}
перейти к описанию mysql_getrow()
$data = array();
$result = mysql_q($sql);
if (!$makehash) while ($row = mysql_fetch_row($result)) $data[] = $row[0];
else while ($row = mysql_fetch_row($result)) $data[$row{0}] = $row[1];
return $data;
}
перейти к описанию mysql_getcolumn()
$data = array();
$result = mysql_q($sql);
if (is_null($keycol)) while ($row = mysql_fetch_assoc($result)) $data[] = $row;
else while ($row = mysql_fetch_assoc($result)) $data[$row{$keycol}] = $row;
return $data;
}
перейти к описанию mysql_gettable()
1. В примерах предполагается, что уже установлено соединение с сервером MySQL и выбрана база данных для работы.
2. Разумеется, такое поведение можно изменить. Для этого нужно убрать из кода mysql_q() вызов функции die(). Впрочем, проходить мимо неисправленных ошибок — не самая лучшая практика (по крайней мере, в период первичной разработки).
3. Вид сообщений об ошибках таков и для других функций; речь о них пойдет в статье далее.
4. Столбец, указываемый во втором аргументе, обязательно должен присутствовать в результате запроса. Если для этого столбца используется псевдоним, то вторым аргументом нужно указывать именно псевдоним:
© Все права на данную статью принадлежат порталу webew.ru. Перепечатка в интернет-изданиях разрешается только с указанием автора и прямой ссылки на оригинальную статью. Перепечатка в печатных изданиях допускается только с разрешения редакции.
