Pisząc dzisiaj klasę, która będzie modelem w nowej wersji mojego frameworka, natrafiłem na problem, z którym jakoś nigdy wcześniej nie miałem doczynienia. Wynika to z tego, że pisząc zwykły proceduralny kod zazwyczaj wiemy jakie zapytanie zostało wykonane i nie mamy problemu, czy na wyniku można wykonać mysql_num_rows(), lub inną funkcję odpowiednią dla zapytań z insert, czy też nie. Kiedy jednak zaczynami pisać kod zorientowany obiektowo nie jest już tak fajnie i trzeba (przynajmniej w moim przypadku) napisać bardziej wyspecjalizowaną klasę zawierającą metody odpowiednie do typu zapytania.
Funkcja mysql_query() zwraca dwa typy. Dla zapytań select, show, describe i explain zwraca zmienną typu resource, a dla innych zapytań zwraca boolean.
Tak więc jedyne co musimy zrobić, to sprawdzić typ zmiennej. Służy do tego funkcja gettype(). Oto prosty kod metody zwracającej bardziej wyspecjalizowaną klasę w zależności od typu zapytania:
(...)public function getInstance($result){if (gettype($result) == 'resource')return new DBQueryResource($result);elsereturn new DBQueryBoolean($result);//Jak ktoś ma lepszy pomysł na nazwy klas, to niech mów :P.}
To oczywiście bardzo prosty problem, ale ja musiałem poświęcić kilka minut na zastanowienie się, więc chcę już tego innym zaoszczędzić ;].
IMO korzystanie z mysql_blabla jest 'deprecated', aktualnie zalecane jest stosowanie ujednoliconego PDO.
Miałem podobny problem... rozwiązanie? mysql_query() dla nieudanego zapytania zwraca FALSE. Teraz wystarczy odpowiednio uformować instrukcje warunkowe.
jak ja uwielbiam jak Ty takie mÄ
@Peres: Nie na każdym serwerze dostaniesz PDO. Ja akurat buduje interfejs obsługi tylko MySQLa. Z innych baz raczej korzystać póki co nie będę.
Ewentualnie jeśli by mi się coś takiego przytrafiło, to mogę bardzo szybko przejść na AdoDB, bo ta biblioteka, którą teraz piszę jest bardzo zbliżona do AdoDB.
Ale PDO jest wygodne... ;-)
Jak PDO będzie na protazym, to się nim zainteresuje :P