Biblioteka PearDatabase bazująca na PDO

W wersji YetiForce 2.1 ulepszyliśmy komunikacje pomiędzy bazą danych, a aplikacją aktualizując jedną z bibliotek za to odpowiedzialnych. Wersje wcześniejsze komunikowały się z bazą danych poprzez ADODB, a następnie korzystały ze sterowników MySQL. Aktualna wersja biblioteki PearDatabase komunikuje się bezpośrednio z PDO, które jest wbudowane w PHP, a więc mamy pewność, że zawsze będzie aktualne.

Tworzenie połączenia z bazą

  1. Standardowe (łączy z bazą domyślną):
    • $db = PearDatabase::getInstance();
  2. Zawansowane (łączy z dowolną bazą):
    • $db = new PearDatabase($db_type, $db_hostname, $db_name, $db_username, $db_password);

Debugowanie

Plik config\debug.php parametr SQL_DIE_ON_ERROR - Zatrzymanie aplikacji w miejscu wystąpienia błędnego zapytania z odpowiednim komunikatem.
Database ERROR: SQLSTATE[42S22]: Column not found: 1054 Unknown column 'searchlabesl' in 'field list'
#0 PearDatabase->checkError() called at [C:\www\YetiForceCRM\include\database\PearDatabase.php:306]

#1 PearDatabase->pquery() called at [C:\www\YetiForceCRM\vtlib\Vtiger\Functions.php:245]

#2 Vtiger_Functions::getCRMRecordMetadata() called at [C:\www\YetiForceCRM\vtlib\Vtiger\Functions.php:269]

#3 Vtiger_Functions::getCRMRecordLabel() called at [C:\www\YetiForceCRM\modules\Vtiger\models\Menu.php:82]

#4 Vtiger_Menu_Model::getBreadcrumbs() called at [C:\www\YetiForceCRM\cache\templates_c\vlayout\2e3b24f53a6fa7b73fe91e9ef7050f26857fa9d9.file.CommonActions.tpl.php:113]

#5 content_557e7fd8edf954_89212780() called at [C:\www\YetiForceCRM\libraries\Smarty\libs\sysplugins\smarty_internal_templatebase.php:188]

#6 Smarty_Internal_TemplateBase->fetch() called at [C:\www\YetiForceCRM\libraries\Smarty\libs\sysplugins\smarty_internal_template.php:304]

#7 Smarty_Internal_Template->getSubTemplate() called at [C:\www\YetiForceCRM\cache\templates_c\vlayout\af7d5c37f878a084bcedc2c729eafdef9b042191.file.BasicHeader.tpl.php:24]

#8 content_557e7fd8a14f38_27662380() called at [C:\www\YetiForceCRM\libraries\Smarty\libs\sysplugins\smarty_internal_templatebase.php:188]

#9 Smarty_Internal_TemplateBase->fetch() called at [C:\www\YetiForceCRM\libraries\Smarty\libs\sysplugins\smarty_internal_template.php:304]

#10 Smarty_Internal_Template->getSubTemplate() called at [C:\www\YetiForceCRM\cache\templates_c\vlayout\58d2208bab530ab02000de6d14631bb5289359db.file.DetailViewPreProcess.tpl.php:31]

#11 content_557e9e07d359e3_34804255() called at [C:\www\YetiForceCRM\libraries\Smarty\libs\sysplugins\smarty_internal_templatebase.php:188]

#12 Smarty_Internal_TemplateBase->fetch() called at [C:\www\YetiForceCRM\libraries\Smarty\libs\sysplugins\smarty_internal_templatebase.php:394]

#13 Smarty_Internal_TemplateBase->display() called at [C:\www\YetiForceCRM\include\runtime\Viewer.php:182]

#14 Vtiger_Viewer->view() called at [C:\www\YetiForceCRM\include\runtime\Controller.php:176]

#15 Vtiger_View_Controller->preProcessDisplay() called at [C:\www\YetiForceCRM\modules\Vtiger\views\Detail.php:126]

#16 Vtiger_Detail_View->preProcess() called at [C:\www\YetiForceCRM\modules\Leads\views\Detail.php:18]

#17 Leads_Detail_View->preProcess() called at [C:\www\YetiForceCRM\include\main\WebUI.php:78]

#18 Vtiger_WebUI->triggerPreProcess() called at [C:\www\YetiForceCRM\include\main\WebUI.php:203]

#19 Vtiger_WebUI->process() called at [C:\www\YetiForceCRM\index.php:27]

Najważniejsze przykłady kodu z wykorzystaniem bazy danych

$result = $db->query('SELECT * FROM vtiger_leadstatus');
 
while($row = $db->fetchByAssoc($result)){
 $pick_val = $row[$fieldName];
}
 
$resultUsers = $db->query('SELECT id FROM vtiger_users;');
 
while ($userID = $db->getSingleValue($resultUsers)) {
 echo $userID;
}
 
$resultUsers = $db->query('SELECT id FROM vtiger_users;');
$userID = $db->getSingleValue($resultUsers);

Różnice w listowaniu danych

Wcześniej:
for($i = 0; $i < $db->num_rows($listResult); $i++) { $row = $db->fetch_row($listResult, $i);
Teraz:
while($row = $db->fetchByAssoc($listResult)){

Lista funkcji

  • bind($param, $value, $type = null) - dodawanie parametrów do zapytania http://php.net/manual/en/pdostatement.bindvalue.php;
  • checkError($message, $dieOn-Error = false) - logowanie błędów;
  • columnMeta(&$result, $col) - informacje o kolumnie z wyniku;
  • completeTransaction() - zakończenie pomyślne transakcji;
  • concat($list) - tworzenie wartości concat dla mysql z tablicy;
  • connect() - połączenie z bazą danych;
  • delete($table, $where = '', $params = []) - usuwanie danych;
  • disconnect() - kończenie połączenia z bazą danych;
  • ErrorMsg() - tekst z komunikatem błędu zapytania http://php.net/manual/en/pdostatement.errorinfo.php;
  • execute - wykonanie zapytania http://php.net/manual/en/pdostatement.execute.php;
  • fetch_array($result) - zwraca tablicę asocjacyjną z całym wynikiem http://php.net/manual/en/pdostatement.fetch.php;
  • fetchByAssoc(&$result, $rowNum = -1, $encode = true) - zwraca tablicę asocjacyjną, domyślnie pierwszy wiersz lub wiersz o konkretnym numerze;
  • flatten_array($input, $output = null) - spłaszcza tablicę wielopoziomową w jeden poziom;
  • formatDate($datetime, $strip_quotes = false) - obecnie nie jest wspierane;
  • generateQuestionMarks($items) - tworzy string z tylko znakami "?" tyle ile jest elementów tablicy, np "?,?,?,?";
  • getAffectedRowCount($result) - ilość danych, dla których wykonano zapytanie, dla select ilość rekordów, dla update ilość zaktualizowanych danych http://php.net/manual/en/pdostatement.rowcount.php;
  • getColumnNames($tablename) - tablica z nazwami kolumn tabeli;
  • getColumnsMeta($tablename) - tablica z obiektami zawierającymi szczegółowe informacji dotyczące kolumn w tablicy;
  • getEmptyBlob() - znak null;
  • getFieldsArray($result)- tablica z kolumnami tabeli zwyniku http://php.net/manual/en/pdostatement.getcolumnmeta.php;
  • getFieldsDefinition($result) - tablica z obiektami zawierającymi szczegółowe informacji dotyczące kolumn w tablicy;
  • getInstance() - tworzenie nowej instancji PearDatabase;
  • getLastInsertID($seqname = '') - id ostatniego inserta http://php.net/manual/en/pdo.lastinsertid.php;
  • getOne($sql, $dieOn-Error = false, $msg = '') - pobranie jednej wartości z wyniku;
  • getRowCount($result) - ilość rekordów;
  • getSingleValue - pobranie jednej wartośli z wyniku  http://php.net/manual/en/pdostatement.fetchcolumn.php;
  • getUniqueID($seqname) - pobranie kolejnego ID dla tablicy;
  • hasFailedTransaction() - czy transakcja zawiera błąd;
  • insert($table, $data) - dodawanie danych do bazy (data - tablica asoccjacyjna);
  • isMySQL() - czy baza typu MySQL;
  • isOracle() - czy baza typu Oracle;
  • isPostgres() - czy baza typu Postgres;
  • log($message, $type = 'info') - zapis logów bazy danych;
  • logSqlTime($startat, $endat, $sql, $params = false) - rozszerzony zapis logów bazy danych (w trakcie przebudowy);
  • num_fields($result) - ilośc kolumn w wyniku http://php.net/manual/en/pdostatement.columncount.php;
  • num_rows($result) - ilośc wierszy w wyniku;
  • pquery($query, $params = [], $dieOn-Error = false, $msg = '') - wykonanie zapytania z parametrami;
  • prepare($query) - wykonanie zapytania http://php.net/manual/en/pdo.prepare.php;
  • println($msg) - zapis logów bazy danych;
  • query($query, $dieOn-Error = false, $msg = '') - wykonanie zapytania bez parametrów http://php.net/manual/en/pdo.query.php;
  • query_result(&$result, $row, $col = 0) - pobieranie danych;
  • query_result_raw(&$result, $row = 0) - pobieranie danych;
  • query_result_rowdata($result, $row = 0) - pobieranie danych;
  • raw_query_result_rowdata(&$result, $row = 0) - pobieranie danych;
  • quote($input, $quote = true, $type = null) - zabezpieczanie wartości w zapytaniu sql  http://php.net/manual/en/pdo.quote.php;
  • requirePsSingleResult($sql, $params, $dieOn-Error = false, $msg = '', $encode = true) - wymusza aby liczba wierszy w wyniku była równa 1 bo innaczej zwraca false, opcja z parametrami;
  • requireSingleResult($sql, $dieOn-Error = false, $msg = '', $encode = true) - wymusza aby liczba wierszy w wyniku była równa 1 bo inaczej zwraca false, opcja bez parametrów;
  • resetSettings($dbtype, $host, $dbname, $username, $passwd) - zmiana danych do połączenia bazy danych, zaleca się aby po tym wykonać connect()
  • rollbackTransaction() - confnięcie zmian wykonanych w transakcji;
  • setAttribute(func_get_args()) - ustawianie atrybutów połączenia z bazą danych http://php.net/manual/en/pdo.setattribute.php;
  • setDatabaseHost($host) - zapis nazwy hosta;
  • setDatabaseName($dbname) - zapis nazwy bazy danych;
  • setDatabaseType($type) - zapis typu połączenia;
  • setDieOnError($bool) - zapis czy włączyć przerywanie skryptu w momencie wystąpienia błędu;
  • setUserName($name) - zapis nazwy hosta;
  • setUserPassword($pass) - zapis nazwy hosta;
  • sql_escape_string($str) - zabezpieczanie wartości w zapytaniu sql;
  • sqlExprDatalist($array) - tworzenie stringa z tablicy w postaci ('44','66','777') z zabezpieczonymi wartościami;
  • startTransaction() - zakończenie transakcji;
  • updateBlob($table, $column, $val, $where) - aktualizacja danych.
  • czwartek, 10 sierpień 2017