Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [Sterownik]Sterownik do Mysql
Forum PHP.pl > Inne > Oceny
marcio
WItam pisze sobie sterownik do bazy Mysql dla zapotrzebowan mojego cms'a i mysle tak sobie czy takie rozwiazane jest godne uzycia np:
  1. <?php
  2. function DbSqlSelect($columns = array('*'), $table = '', $wh = array(''), $other = '') {
  3.  
  4. if(count($columns) == 1) $column = $columns[0];
  5. else if(count($columns) > 1) $column = implode(',', $columns);
  6. else $column = '*';
  7.  
  8. if(count($wh) == 1) {
  9.  
  10. $key_tab = array_keys($wh);
  11. $where = $key_tab[0];
  12.  
  13.  foreach($wh as $argv => $args)
  14.  
  15.  $countArgs = count($args);
  16.  
  17.   for($i = 0; $i < $countArgs; $i++) {
  18.  
  19.    if(is_int($args[$i])) $where .= "(int)$args[$i]";
  20.    else if(is_string($args[$i-1])) $where .= "mysql_real_escape_string('$args[$i]')";
  21.    else $where .= $args[$i];
  22.  
  23.   }
  24. }
  25.  
  26. else if(count($wh) > 1) {
  27.  
  28. $where = '';
  29.  
  30.  foreach($wh as $key => $value) {
  31.  
  32.  $where .= $key;
  33.  $countValue = count($value);
  34.  
  35.   for($i = 0; $i < $countValue; $i++) {
  36.  
  37.   if(is_int($value[$i])) $where .= "(int)$value[$i]";
  38.   else if(is_string($value[$i-1])) $where .= "mysql_real_escape_string('$value[$i]')";
  39.   else $where .= $value[$i];
  40.  
  41.     }
  42.   }
  43. }
  44. else $where = '';
  45.  
  46. if(count($wh) != 0 && !empty($other)) $SqlSelect = 'select '.$column.' from '.$table.' where '.$where.' '.$other.'';
  47.  
  48.  else if(count($wh) != 0 && empty($other)) $SqlSelect = 'select '.$column.' from '.$table.' where '.$where;
  49.  
  50.   else if(count($wh) == 0 && !empty($other)) $SqlSelect = 'select '.$column.' from '.$table.' '.$other;
  51.  
  52.    else $SqlSelect = 'select '.$column.' from '.$table;
  53.  
  54. return $sql = mysql_query($SqlSelect);
  55.  
  56. }
  57. ?>

A tak np wywoluje zapytania:
  1. <?php
  2. /*Wiecej warunkow where*/
  3.  
  4. //Wynik: select * from m_users where id=(int)1 and login=mysql_real_escape_string('marcio')
  5. $zawartosc .= DbSqlSelect(array('*'), 'm_users', array('id' => array('=', 1, ' and '), 'login' => array('=','marcio')));
  6.  
  7. /*Dla jednego warunku where*/
  8.  
  9. //Wynik: select * from m_users where login=mysql_real_escape_string('marcio')
  10. $zawartosc .= DbSqlSelect(array('*'), 'm_users', array('login' => array('=', 'marcio')));
  11.  
  12. /*Przyklad dla Sys. news'ow*/
  13.  
  14. $ris = DbSqlSelect(array('*'), 'news', array(), "order by id desc limit ".$strona*$liczba.",".$liczba."");
  15. $dane = DbSqlRecordsAssoc($ris);
  16. $count_dane = count($dane);
  17. for($i = 0; $i < $count_dane; $i++) {
  18.  
  19.  $wynik2 = DbSqlSelect(array('id'), 'komentarze', array('id_news' => array('=', $dane[$i]['id']))); //SPosob z uzyciem funk. DbSqlSelect
  20.  $wynik2 = DbSqlQuery('select * from komentarze where id_news = '.(int)$dane[$i]['id'].''); //Zwykly select
  21.  $ile_comm = DbSqlNumRows($wynik2);
  22.  $ile_comm = DbSqlCountRows('select count(id) from komentarze where id_news = '.$dane[$i]['id'].'');
  23. }
  24. ?>

Ilosc komentarzy mozna utrzymac w 2 sposoby albo za pomoca DbSqlQuery() ktory pobiera resource zapytania lub za pomoca DbSqlCountRows() ktore liczy normalnie.

Nie musze filtrowac zmiennych ani nic wydaje mi sie tez to bardziej czytelne i w ogole.

Na podstawie funckji DbSqlSelect() chcialbym zrobic tez wlasna skladnie dla zapytan Update,Insert i Delete, oczywiscie DbSqlSelect() nie oferuje wszyskich przypadkow zapytan ale dla podstawowych wystarcza.

P.S pojawil sie problem mam funkcje:
  1. <?php
  2. function DbSqlNumRows($Sql) {
  3.  
  4. return $sql = mysql_num_rows($Sql);
  5. }
  6. ?>

Gdy jej wynik przypisze jakiejs zmiennej to Mysql zwraca mi blad ze jest zly identyfikator polaczenia a jesli dam odrazu do echo DbSqlNumRows($id_zapytania) to jest good dlaczego tak sie dzieje, po modyfikacji funkcji DbSqlSelect() nastapil taki problem a przeciez jest return w funkcji tongue.gif moze juz jest pozno i nie kontaktuje.

P.S2 oczywiscie nie chce oceny co do kodu bo wiem ze ameryki nie odkrylem jednak nie bylem pewny gdzie umiescic temat jako ze jest troche dwuznaczny.
.radex
Cytat
mysle tak sobie czy takie rozwiazane jest godne uzycia np:


moim zdaniem te wszystkie funkcje nie mają sensu, jeśli używasz tylko MySQL, bo ani trochę nie ułatwiają pracy

  1. <?php
  2. $wynik2 = DbSqlSelect(array('id'), 'komentarze', array('id_news' => array('=', $dane[$i]['id'])));
  3. $id = intval($dane[$i]['id']);
  4. $wynik2 = CośDoQuery("SELECT `id` FROM `komentarze` WHERE `id_news` = '$id'");
  5. ?>


Jak widać, czyste rozwiązanie nie jest wiele dłuższe, a o wiele bardziej czytelne. A można zrobić jeszcze coś w tym stylu:

  1. <?php
  2. $wynik2 = CośDoQuery("SELECT `id` FROM `komentarze` WHERE `id_news` = '%1'", intval($dane[$i]['id']));
  3. //albo
  4. $wynik2 = CośDoQuery("SELECT `id` FROM `komentarze` WHERE `id_news` = '%i'", $dane[$i]['id']);
  5. ?>
skowron-line
No takie srednie te twoje funkcje. Może zamiast takie rzeczy pisać zainteresuj się PDO
http://www.php.net/pdo
http://pl.wikibooks.org/wiki/PHP/Biblioteka_PDO

Nie będziesz wymyślał koła na nowo.
phpion
Moim zdaniem pisanie takich "sterowników" mija się z celem. Dużo bardziej przydatnym narzędziem byłoby coś na wzór Kohanowego Query Buildera. Dzięki niemu można w bardzo prosty sposób dynamicznie budować zapytania (szczególnie przydatne przy SELECTach).
ucho
Phpion ma rację, też używam takiego bardzo prymitywnego "sklejacza" - kiedy używa się wielu podobnych zapytań. np. we wszelkiego rodzaju raportach, wydzielenie części wspólnej bardzo pomaga w utrzymaniu. Lepsze to, niż, z czym się spotkałem, dodawanie warunków do zapytania za pomocą preg_replace haha.gif
marcio
Cytat
No takie srednie te twoje funkcje

Czyli nie jest tez takie zle tongue.gif??

Cytat
Może zamiast takie rzeczy pisać zainteresuj się PDO

Nie pisze w OOP wiec nie chce mieszac kodu to raz a dwa nie chce mi sie czytac jakiejs dokumentacji wystarczy mi ta z php i sql tongue.gif

Cytat
jeśli używasz tylko MySQL, bo ani trochę nie ułatwiają pracy

W sumie tu daje ci 70% racji ale kto wie moze projekt sie rozwinie i bede musial zrobic sterownik tez dla postgresql etc... wiec wtedy mozna edytowac ta funkcje i dodac np jako argument jakiej bazy sie uzywa i jest to porzyteczne, a dwa nie musze sie martwic co do filtrowania zmiennych ktore trafiaja do zapytania jak juz mi sie stalo w starym cms'ie ze zapomnialem rzytowac na int i byl Sql.Inj tongue.gif

Nie wiem jak dla mnie takie cos wydaje sie czytelniejsze niz pisanie za kazdym razem calego zapytania i bawienie sie w ' i " jak juz sie ktos przyzyczai to czemu nie biggrin.gif
skowron-line
Cytat(marcio @ 6.03.2009, 14:48:59 ) *
Czyli nie jest tez takie zle tongue.gif??
Nie pisze w OOP wiec nie chce mieszac kodu to raz a dwa nie chce mi sie czytac jakiejs dokumentacji wystarczy mi ta z php i sql tongue.gif
W sumie tu daje ci 70% racji ale kto wie moze projekt sie rozwinie i bede musial zrobic sterownik tez dla postgresql etc... wiec wtedy mozna edytowac ta funkcje i dodac np jako argument jakiej bazy sie uzywa i jest to porzyteczne, a dwa nie musze sie martwic co do filtrowania zmiennych ktore trafiaja do zapytania jak juz mi sie stalo w starym cms'ie ze zapomnialem rzytowac na int i byl Sql.Inj tongue.gif


No ale PDO też ma sterownik dla innych baz danych, a to że nie piszesz w OOP to o niczym nie swiadczy w kodzie strukturalnym też można odwoływać się do klas. Jak będziesz chcial wygenerować sobie PDF to tez napiszesz sobie funkcje skoro masz gotowe klasy questionmark.gif

( jakas mało składna ta wypowiedz )
marcio
No ale albo jest struktularny kod albo OOP.

Nie wiem wole pisac wlasne klasy nie lubie frameworkow ani gotowych klas dopoki dobrze php nie poznam wole uzywac wlasne skrypty

Cytat
( jakas mało składna ta wypowiedz )

O co chodzi?
.radex
Cytat(marcio @ 6.03.2009, 15:15:05 ) *
Nie wiem wole pisac wlasne klasy nie lubie frameworkow ani gotowych klas dopoki dobrze php nie poznam wole uzywac wlasne skrypty


To może zamiast marnować czas na pisanie skryptów naucz się dobrze php?
marcio
Cytat(.radex @ 6.03.2009, 15:43:22 ) *
To może zamiast marnować czas na pisanie skryptów naucz się dobrze php?


To jak mam sie go uczyc jak nie piszac wlasne kody i analizowac kody innych czytac ksiazki ehh juz sie na takiej nauce przejechalem i wiem ze moja metoda ktora teraz uzywam jest super biggrin.gif
Crozin
Chcesz umieć jakikolwiek język dobrze? Naucz się korzystać z tego co już ktoś wymyślił, szczególnie gdy jest to lepsze, wygodniejsze i istneije spore prawdopodobieństwo, że inni prog. też będą to znać.
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2024 Invision Power Services, Inc.