konto usunięte

Temat: uniwersalna klasa/funkcja do pobierania danych z bazy

Witam. Dopiero zaczynam przygodę z PHP i MySQL i nie wiem jak rozwiązać pewien problem. Chciałbym do mojej stronki podejść maksymalnie obiektowo i stworzyć sobie jakąś funkcję lub klasę która wywoła mi dowolną procedurkę MySQL i zwróci wynik tej procedury (gdyż w większości przypadków będą to SELECTy) w postaci jakiegoś resultseta. Zaznaczam że funkcja lub klasa będzie na jednej stronce wywoływana wielokrotnie więc pojawia się problem z zamykaniem połączenia gdyż nie mogę tego zrobić póki nie zapiszę wyniku zapytania do jakiejś zmiennej (chciałbym, żeby był to resultset bo dość łatwo się po nim poruszać). Obecnie mam to rozwiązane tak:

tutaj część kodu z klasy który zwraca store_resulta
....
public function myQuery($query)
{
mysqli_set_charset($mysqli, "utf8");
$mysqliMultiResult = mysqli_multi_query($mysqli, $query);

if (mysqli_errno($mysqli))
{
LogError($errno, $errstr, $errfile, $errline) ;
}

if ($mysqliMultiResult)
{
return mysqli_store_result($mysqli);
}

}

.....


tutaj wywołanie pojawiające się w kilku miejscach na stronie:
function aaaa()
{
$obj = new DBClass()
$result=$obj->myQuery("CALL proc");
if ($result==null)
{
LogError($errno, $errstr, $errfile, $errline) ;
}
else
{
while ($row = mysqli_fetch_array($result, MYSQLI_ASSOC)) {tutaj sobie przypisuje do zmiennych jakie potrzebuję}

mysqli_free_result($result);

}
}
Rafał Jakubowski

Rafał Jakubowski programista,
freelancer

Temat: uniwersalna klasa/funkcja do pobierania danych z bazy

Witam,

po pierwsze: nikt o zdrowych zmysłach nie zamyka połączenia z bazą po każdym wywołaniu zapytania - to skrajnie nieoptymalne i ciężko mi sobie nawet wyobrazić sens takiego zachowania (chociaż pewnie w jakiś specyficznych przypadkach takowy istnieje).

I druga - z Twojej sygnaturki wynika, że ciupiesz w .NET - więc może po prostu wejdź w jakiś PHPowy framework? Jest ich kilka, są naprawdę niezłe i w połączeniu z jakimś dobrym IDE sprawiają, że pisanie jest zbliżone wygodą do VS (przy mniejszych wymaganiach oczywiście ;))

W zasadzie wg mnie nie do końca sprecyzowałeś swój problem :)

konto usunięte

Temat: uniwersalna klasa/funkcja do pobierania danych z bazy

tzn może faktycznie nie chodzi dokładnie o zamykanie połączenia ale o to że gdy wywołam w ten sposób dwa razy pod rząd tą funkcję to stronka się nie generuje więc pewnie jest problem z jakimś zwalnianiem zasobów mysqli?
Rafał Jakubowski

Rafał Jakubowski programista,
freelancer

Temat: uniwersalna klasa/funkcja do pobierania danych z bazy

W zasadzie nie używam mysqli, także mogę błądzić - ale tak "na oko" to w zasadzie (poza treścią samego zapytania) nie widzę tu nic szczególnie niepokojącego...

Może coś w samym konstruktorze?

Jeśli przy pierwszym wywołaniu metoda Ci zwraca co trzeba - to być może jest to właśnie kwestia zapytania - nic innego mi do głowy nie przychodzi.

Nic innego nie wydaje się mieć sens ;)

konto usunięte

Temat: uniwersalna klasa/funkcja do pobierania danych z bazy

Zapytania są dobre. Wykonuje się tylko pierwsze wywołanie procedurki.
Michał Jarosz

Michał Jarosz Frontend Developer &
Team Leader

Temat: uniwersalna klasa/funkcja do pobierania danych z bazy

Sprawdź czy pzypadkiem nie musisz wywołać mysqli_free_result zanim wywołasz kolejne zapytanie.

A poza tym, może sprawdź jakiegoś ORM, zamist pisać własną klasę? No chyba, że masz specyficzne wymagania, albo robisz to dla zabawy/nauki ;)
Janusz Skudrzyk

Janusz Skudrzyk Członek zarządu,
weblabs.pl

Temat: uniwersalna klasa/funkcja do pobierania danych z bazy

ten brak ; nie występuje we właściwym kodzie ?
co pojawia się w logach ?
strona wyświetla się w całości, czy ucina przy drugim odwołaniu do DBClass ?
zrób $obj jako element zewnętrzny przekazywany do funkcji przez referencje:
function nazwa( &$obj ) {
// ... //
$obj->myQuery( "xxx" ) ;
// ... //
}

$obj = new DBClass ;
nazwa( $obj ) ;
Jarosław Lisicki

Jarosław Lisicki programista,
Gadu-Gadu

Temat: uniwersalna klasa/funkcja do pobierania danych z bazy

Zgodnie z tym co pisza na php.net:

{{{
Bad example, will FAIL now and then on subsequent calls:
<?php
$sQuery='CALL exampleSP('param')';
if(!mysqli_multi_query($this->sqlLink,$sQuery))
$this->queryError();
$this->sqlResult=mysqli_store_result($this->sqlLink);
?>

Working example:
<?php
$sQuery='CALL exampleSP('param')';
if(!mysqli_multi_query($this->sqlLink,$sQuery))
$this->queryError();
$this->sqlResult=mysqli_store_result($this->sqlLink);

if(mysqli_more_results($this->sqlLink))
while(mysqli_next_result($this->sqlLink));
?>
}}}

zrób $obj jako element zewnętrzny przekazywany do funkcji przez referencje:
function nazwa( &$obj ) {
// ... //
$obj->myQuery( "xxx" ) ;

W PHP5 obiekty są przekazywane przez referencje by default.

konto usunięte

Temat: uniwersalna klasa/funkcja do pobierania danych z bazy

Panowie, a w DSN nie trzeba przypadkiem ustawic "persistent" zeby miec jedno polaczenie do bazy zamiast laczenia sie przy kazdym zapytaniu?

IMHO, pisanie wlasnej klasy do obslugi bazy nie ma sensu, chyba, ze ma to byc ekstremalnie odchudzone/specyficzne z jakichs wgledow. W wiekszosci zastosowan lepiej wziac cos klasy ADODB i miec swiety spokoj.
Michał Jarosz

Michał Jarosz Frontend Developer &
Team Leader

Temat: uniwersalna klasa/funkcja do pobierania danych z bazy

Łukasz S.:
Panowie, a w DSN nie trzeba przypadkiem ustawic "persistent" zeby miec jedno polaczenie do bazy zamiast laczenia sie przy kazdym zapytaniu?
>

Na pewno nie przy mysqli (któremu nie daje się DSN i które jak na razie nie obsługuje stałych połączeń - mają się pojawić w 5.3)



Wyślij zaproszenie do