Пример 8: Организация постраничного вывода
Следующий код показывает как организовать простейший постраничный вывод.
include_once('../adodb.inc.php'); include_once('../adodb-pager.inc.php'); session_start();
$db = NewADOConnection('mysql');
$db->Connect('localhost','root','','xphplens');
$sql = "select * from adoxyz ";
$pager = new ADODB_Pager($db,$sql); $pager->Render($rows_per_page=5);
В результате вы увидите что-то похожее на это:
|< << >> >| ID First Name Last Name Date Created 36 Alan Turing Sat 06, Oct 2001 37 Serena Williams Sat 06, Oct 2001 38 Yat Sun Sun Sat 06, Oct 2001 39 Wai Hun See Sat 06, Oct 2001 40 Steven Oey Sat 06, Oct 2001 Page 8/10 Количество рядов для вывода контролируется функцией Render(). Если вы не укажите никакого значения – по умолчанию будет выведено 10 записей.
Вы можете изменять названия колонок изменяя свой SQL запрос (поддерживается в большинстве баз данных):
$sql = 'select id as "ID", firstname as "First Name", lastname as "Last Name", created as "Date Created" from adoxyz';
Вышеприведенный пример вы можете найти в примере adodb/tests/testpaging.php, включенном в пакет установки. Класс ADODB_Pager может быть адаптирован программистом для вывода вместо линков картинок, а белый фон – более подходящим цветом.
Также вы можете настроить показ html при помощи $pager->htmlSpecialChars = false.
Часть кода, приведенного здесь, выла написана Ivan Oliva и Cornel G. Пример 9: Экспорт данных в CVS или с разделением табуляцией
В вашем распоряжение есть несколько вспомогательных функций, которые помогут вам экспортировать данные в CVS или в файл с разделителями в виде табуляции:
include_once('/path/to/adodb/toexport.inc.php'); include_once('/path/to/adodb/adodb.inc.php');
$db = &NewADOConnection('mysql'); $db->Connect($server, $userid, $password, $database);
$rs = $db->Execute('select fname as "First Name", surname as "Surname" from table');
print "<pre>"; print rs2csv($rs); # возвращает строку, CSV формат
print '<hr>';
$rs->MoveFirst(); # Замечание: некоторые базы данных не поддерживают MoveFirst print rs2tab($rs,false); # возвращает строку, разделитель - табуляция # false == подавляет название полей на первой линии print '<hr>'; $rs->MoveFirst(); rs2tabout($rs); # выводит непосредственно на stdout (есть также функция rs2csvout) print "</pre>";
$rs->MoveFirst(); $fp = fopen($path, "w"); if ($fp) { rs2csvfile($rs, $fp); # записываем в файл (есть также функция rs2tabfile) fclose($fp); }
Перевод каретки или переход на новую линию заменены на пробелы. Названия колонок будут записаны самой первой линией. Строка будет содержать текст взятый в двойные кавычки с разделителями. Двойные кавычки будут взяты в двойные кавычки еще раз. Это необходимо, чтобы файл нормально импортировался в Exel.
Все, описанные выше, функции берут в качестве дополнительного параметра $addtitles, который по умолчанию выставлен в TRUE. Если его установить в FALSE – первая линия не будет содержать названия колонок. Пример 10: Recordset фильтры
Иногда может потребоваться перед использованием сделать преобразование всех рядов в recordset. Для примера мы преобразуем все текстовые данные в верхний регистр:
include_once('adodb/rsfilter.inc.php'); include_once('adodb/adodb.inc.php');
// ucwords() каждый элемент в recordset function do_ucwords(&$arr,$rs) { foreach($arr as $k => $v) { $arr[$k] = ucwords($v); } }
$db = NewADOConnection('mysql'); $db->PConnect('server','user','pwd','db');
$rs = $db->Execute('select ... from table'); $rs = RSFilter($rs,'do_ucwords');
Функция RSFilter принимает 2 параметра: recordset и название функции фильтра. Возвращает обработанный recordset с указателем на первом элементе. Функция фильтра принимает 2 параметра: текущий ряд как массив и объект recordset. Для будущей совместимости вы не должны использовать оригинальный объект recordset. Пример 11: Умные транзакции
Старый способ сделать транзакцию требовал, чтобы вы использовали:
$conn->BeginTrans(); $ok = $conn->Execute($sql); if ($ok) $ok = $conn->Execute($sql2); if (!$ok) $conn->RollbackTrans(); else $conn->CommitTrans();
Для большинства проектов этот способ очень сложен, потому что вы должны отслеживать статус ошибки. Умные транзакции намного проще. Вы запускаете умную транзакцию функцией StartTrans():
$conn->StartTrans(); $conn->Execute($sql); $conn->Execute($Sql2); $conn->CompleteTrans();
CompleteTrans() обнаруживает возникшие SQL ошибки и делает обратную перемотку или Commit (подтверждение). Вы также можете вызвать обратную перемотку, даже если никакой ошибки не произошло используя функцию FailTrans(). Обратите внимание, что обратная перемотка была сделана в CompleteTrans(), то в FailTrans() она сделана не будет.
$conn->StartTrans(); $conn->Execute($sql); if (!CheckRecords()) $conn->FailTrans(); $conn->Execute($Sql2); $conn->CompleteTrans();
Вы также можете проверить, была ли в процессе транзакции ошибка. Для этого воспользуйтесь функцией HasFailedTrans(). Она возвратит TRUE, если вызывалась функция FailTrans() или была ошибка при выполнении SQL запроса. Убедитесь, что вы вызываете функцию HasFailedTrans() перед CompleteTrans(), потому что она выдает результат только между StartTrans/CompleteTrans().
И, наконец, StartTrans/CompleteTrans могут быть вложенными и только самый удаленный блок выполнен. Функции BeginTrans/CommitTrans/RollbackTrans, напротив, НЕ МОГУТ быть вложенными.
$conn->StartTrans(); $conn->Execute($sql); $conn->StartTrans(); # игнорируется if (!CheckRecords()) $conn->FailTrans(); $conn->CompleteTrans(); # игнорируется $conn->Execute($Sql2); $conn->CompleteTrans();
Обратите внимания, точки сохранения (savepoints) на данный момент не поддерживаются.
|