пятница, октября 05, 2007

SQL.php: запросы одним вызовом

Когда-то, разрабатывая внутренний портал для одной компании, написал библиотеку полезных функций, среди которых были и несколько штук для быстрого получения данных из MySQL. Пользоваться ими оказалось так сподручно, что со временем я вынес эти функции в отдельный файл, добавил в его начало соединение с сервером MySQL и назвал всё это дело, не заморачиваясь, sql.php. С тех пор этот файл можно найти во всех веб-проектах, над которыми я работал. Наверное (даже наверняка), он ещё кому-то пригодится. Это не yet another MySQL wrapper, это даже меньше: несколько способов получить данные из базы одним вызовом.

query_into_array($query) — отдаёт результат запроса как массив ассоциативных массивов, каждый из которых — ряд результата в виде поле => значение.

query_into_assoc($query) — отдаёт один ряд результата в виде ассоциативного массива. То же, что и предыдущее, но для запросов, где ожидается единственный ряд.

query_into_enum($query) — Не то же самое, что предыдущее, и я сам иногда забываю эту разницу: возвращает левую колонку запроса, в котором может быть много рядов. Полезно, когда нужно получить значения какой-то поля.

query_into_keyvalue($query) — похоже на предыдущее, но возвращаются 2 левых колонки в виде ассоциативного массива, где индексы — значения первого поля, а значения — значения второго. Очень удобный способ выбрать проиндексированные данные, но чреват потерей части данных, если значения первого поля не уникальны.

query_into_var($query) — для запроса, возращающего единственное значение. Что там у нас в таком-то поле такого-то ряда?:

echo query_into_var($query);

Теперь, собссно, сама библиотечка. Очень простая, на живую нитку, но — работает, а что ещё от неё надо?

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

$link = mysql_connect( "host", "user", "pass" );

/* Так можно настроить кодировки для MySQL 4.x
mysql_query("SET character_set_connection=cp1251");
mysql_query("SET character_set_results=cp1251");
mysql_query("SET character_set_server=koi8r");
mysql_query("SET character_set_client=cp1251"); */

/* А так — для 5.х
mysql_query("SET NAMES 'utf8'"); */

$db = mysql_select_db( "dbname" ) || die(mysql_error());

function query_into_array( $query ) {
$arr = array();
$n = 0;
$result = mysql_query( $query );
if ( ! mysql_affected_rows == 0 ) {
while ( $row = mysql_fetch_assoc( $result )) {
foreach ( $row as $key => $value ) {
$arr[$n][$key] = $value;
}
++$n;
}
mysql_free_result( $result );
}
return $arr;
}

function query_into_assoc( $query ) {
$result = mysql_query( $query );
if ($row = mysql_fetch_assoc( $result )) {
mysql_free_result( $result );
return $row;
}
}

function query_into_enum( $query ) {
$arr = array();
$result = mysql_query( $query );
if ( mysql_affected_rows() > 0 ) {
while ( $row = mysql_fetch_row( $result )) {
array_push( $arr, $row[0]);
}
mysql_free_result( $result );
}
return $arr;
}

function query_into_keyvalue($query) {
$arr=array();
$result = mysql_query( $query );
if (mysql_affected_rows()>0) {
while ($row= mysql_fetch_row($result)) {
$arr[$row[0]]=$row[1];
}
mysql_free_result( $result );
}
return $arr;
}

function query_into_var( $query ) {
return array_shift( query_into_enum( $query ));
}
?>





Комментариев нет:

Поиск по этому блогу