PDA

Pogčedajte punu verziju : DB klasa - problem


Bojan Zivanovic
09. 08. 2005., 18:31
Za pristup bazi imam svoju klasu koju vec duze vreme uspesno koristim.
Medjutim, sada imam jedan projekat, gde se iz php-a selektuje tabela order, pa za svaki red iz te tabele se selektuje druga tabela (pomocu podataka iz tabele order), i ispisu rezultati.
To ne radi kada koristim moju klasu. Od 100 redova, on ispise prvi, i stane. Kada koristim mysql funkcije direktno radi. Evo vam kod pa vi vidite sta ne valja, glupo mi ovako, negde koristim klasu, negde ne...

$db->Query("SELECT * FROM qorder WHERE qfor= '%s'", array($_GET['what']));
$cnt = $db->GetResultCnt();

if($cnt == 0) {
echo "There are no questions in the database";
}

for($i = 0;$i < $cnt;$i++) {
$data = $db->GetData('all');
switch($data['qtype']) {
case "1": // Input
$db->Query("SELECT * FROM qinput WHERE qiID= '%s'", array($data['qID']));
$input = $db->GetData('all');

echo "
$input[subtitle]
<table>
<tr>
<td> $input[question] </td>
<td> <input type=\"text\" name=\"\" disabled> </td>
</tr> </table>";
break;

Kada umesto $db->Query koristim mysql_query sve normalno radi. Ovako ispise samo jedan red.
Evo dela klase:

function Query($query, $query_data = NULL) {
if(!$this->GetLink()) $this->Connect();
if(NULL != $query_data) {
$this->Prepare($query, $query_data);
$this->Result = mysql_query($this->GetSQL());
}
else {
$this->Result = mysql_query($query);
}
if (preg_match('/^\s*SELECT/i', $query)) {
$this->SetResultCnt(mysql_num_rows($this->GetResult()));
}
else {
$this->SetResultCnt(mysql_affected_rows($this->GetLink()));
}
}

Pa vi vidite :)
Nikada nisam naleteo na ovako nesto... Kazem, klasa radi posao u svim ostalim delovima projekta, kao i u drugim projektima.

zekica
10. 08. 2005., 13:43
To tako nikad neće raditi iz jednog jednostavnog razloga:


$db->Query("SELECT * FROM qorder WHERE qfor= '%s'", array($_GET['what']));
...
$data = $db->GetData('all');
...
$db->Query("SELECT * FROM qinput WHERE qiID= '%s'", array($data['qID']));
...
$input = $db->GetData('all');


$db je objekat koji ima property Result koji se setuje iz metode Query. Metod GetData po kodu treba da učita jedan red iz rezultata (kao mysql_fetch_array() i sl.

E sad, $db->result je posle unutrašnjeg queryja mysql result resurs koji ima samo jedan record.

funkcija GetData() kasnije pročita taj jedan red i kad dođe red na prvu GetData u sledećem ciklusu, ona nema šta da čita (onaj jedan red) je već pročitan, tako da vraća false ili prazan niz, šta već.


Rešenje: nekako pročitati sve podatke koje je vratio prvi query, smestiti ih u niz itd...

Rešenje 2: nije dobro što se tiče dizajna programa, ali možeš recimo drugi query koristiti tako što ćeš ako je u pitanju PHP4 uraditi:
$db2=$db;
$db2->Query();
$db2->GetData();

Probaj pa javi.

Rešenje 3: zašto ne koristiš inner join?

Bojan Zivanovic
12. 08. 2005., 20:04
Hvala zekice. Odradio sam stvar mysql funkcijama, klasa nije nesto, u buduce cu koristiti ADOdb.
Ne koristim inner join jer sam hteo quick and dirty resenje za projekat koji mi se vec popeo na glavu.. Put ka propasti :). Al nece se ponoviti...