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ą
- Standardowe (łączy z bazą domyślną):
- $db = PearDatabase::getInstance();
- 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.