Ten temat co jakiś czas powraca na forum, a dla mnie jest o tyle ważny, że na niczym innym niż PostgreSQL stawiać Coyota lokalnie ochoty nie mam. Problem zaczyna się, gdy w kodzie PHP pojawia się składnia SQL nie wspierana przez ten (czy też inne) serwery baz danych.
Więc proponuję następujące rozwiązanie: oddzielić logikę aplikacji czyli główną część PHP od samych funkcji SQL pobierających dane. Może łatwiej na przykładzie:
Załóżmy istnienie fragmentu w pliku coyote/index.php (fragment prawdziwy)
$sql = 'SELECT news_id,
news_subject,
news_time
FROM ' . NEWS_TABLE . '
ORDER BY news_id
DESC LIMIT ' .$user->theme['cfg']['index_news_limit'];
$result = $db->sql_query($sql);
while ( $row = $db->sql_fetch($result) )
{
$template->assign_block('NEWS', array(
'U_NEWS' => append_sid("news.$phpEx?id=$row[news_id]&go=1"),
'DATE' => date('d-m', $row['news_time']),
'SUBJECT' => trim_text($row['news_subject'], $user->theme['cfg']['index_news_length'])
)
);
}
Proponowałbym oddzielenie kodu SQL od działania PHP w taki sposób, jak przedstawiają pliki poniżej. Plik
coyote/index.php:
/* ZAŁĄCZANIE PLIKU Z FUNKCJAMI O NAZWIE TAKIEJ SAMEJ JAK TEN PLIK, Z KATALOGU OBSŁUGIWANEJ BAZY DANYCH */
if (file_exists('database/'.$Config['DB']['System'].'/'.basename($_SERVER['SCRIPT_NAME'])))
include('database/'.$Config['DB']['System'].'/'.basename($_SERVER['SCRIPT_NAME']));
// ...
if ($db->Index->GetNews($user->theme['cfg']['index_news_limit']))
{
foreach ( $db->result as $row )
{
$template->assign_block('NEWS', array(
'U_NEWS' => append_sid("news.$phpEx?id=$row[news_id]&go=1"),
'DATE' => date('d-m', $row['news_time']),
'SUBJECT' => trim_text($row['news_subject'], $user->theme['cfg']['index_news_length'])
)
);
}
}
Plik coyote/database/PostgreSQL/index.php:
<?php
include_once(coyote/database/PostgreSQL/common_db_functions.php);
class Index
{
function GetNews($limit)
{
global $db;
return $db->Query('SELECT news_id,
news_subject,
news_time
FROM ' . NEWS_TABLE . '
ORDER BY news_id
DESC LIMIT ' . $limit);
}
}
$db->Index = new Index();
?>
Zaincludowany plik zawierałby definicję $db (właściwie to ten mechanizm akurat istnieje) oraz jej metody w stylu Query(), które zwraca również wynik do $db->result. Pracuję obecnie nad projektem, który wykorzystuje taki mechanizm, więc odpowiednik pliku coyote/database/PostgreSQL/common_db_functions.php dla PostgreSQL mam.
Sprawdza się to doskonale, a wystarczy dodać osobny katalog z plikami dla innej bazy i ustawić zmienną (tutaj: $Config['DB']['System']) na nazwę tej bazy danych i rozbudowa gotowa. Uniezależniamy kod PHP od systemu zarządzania bazą danych.
Co myślicie o użyciu tego mechanizmu w Coyote?