Fatal error: Call to a member function fetch_assoc() on a non-object
Door
J C
op 16-02-2015 01:12
gewijzigd op 16-02-2015 01:18
2.858 views
Ik zit te stoeien met een query. Volgens mij geeft de foutmelding aan dat de query niet klopt, maar ik kan de fout niet vinden, de tabellen, kolommen en db bestaan allemaal. En voor zover ik het kan vinden is INNER JOIN nog steeds toegestaan.
Ik heb de qry ingevoerd in phpmyadmin. Als ik het vraagteken vervang door een waarde, dan werkt het gewoon en geeft hij de juiste gegevens weer.
Ik heb je al een tijdje terug een PM gestuurd, je hebt deze nog niet gelezen.
Om hier vast een beetje op die PM vooruit te lopen: gebruik een wrapper class zodat je database-specifieke functies/methoden niet hardcode. Dit, in combinatie met een aantal vuistregels voor veilige queries, zorgen voor een (m.i.) stuk eenvoudiger gebruik.
Bovenstaande code zou er dan als volgt uit komen te zien:
<?php
// filter input
$medewerkerId = false;
// preg_match of filter_var als je dat leuker vindt
// andere functies lijken mij ongeschikt vanwege typecasting
if (preg_match('#^[1-9][0-9]*$#', $_GET['mw_id'])) {
$medewerkerId = trim($_GET['mw_id']);
}
if ($medewerkerId === false) {
// ongeldig medewerker id
// ...
} else {
// $db->query throwt een exception als de query een fout oplevert
// hier zou dus nog ergens een try-catch omheen moeten
// in deze query is het escapen van $medewerkerId alleen bedoeld voor
// het markeren van een DATA-deel - de escaping zelf doet verder niets in dit geval
$res = $db->query(
'SELECT mw_cursus_onderdeel, mw_cursus_onderdeel_id, mw_cursus_datum, mw_ervaring_groep_naam
FROM mw_cursus_onderdeel
INNER JOIN mw_ervaring_groep ON (mw_cursus_onderdeel_groep = mw_ervaring_groep_id)
INNER JOIN mw_cursus ON (mw_cursus_onderdeel = mw_cursus_onderdeel_id)
WHERE mw_cursus_persnr = '.$db->escape($medewerkerId).'
AND mw_cursus_onderdeel_rechten = 1'
);
if ($res->numRows() > 0) {
// loop door resultaten
while ($row = $res->fetchAssoc()) {
// doe iets met $row
// ...
}
} else {
// geen resultaten
// ...
}
// geef resultaat vrij
$res->freeResult();
}
?>
Er zijn overigens 1001 manieren om hier invulling aan te geven. Ik heb mijn manier, jij hebt jouw manier. Ik kan mij dan ook voorstellen dat iemand anders iets compleet anders doet. Voor alles wat ik hierboven doe heb ik in ieder geval een reden die ik kan motiveren dus voordat je roept "dat is fout" of wat dan ook, vraag je eerst eens af waarom ik dit zo doe.
Deze "set" tezamen levert voor zover ik kan overzien een veilige werkwijze op, en daar was het volgens mij allemaal om begonnen (en wat dat betreft heiligt dat mijn middelen).
EDIT: $_GET['mw_id'] i.p.v. $_GET['id']
EDIT: het meta-karakter "$" accepteert ook een newline, dus je zou het resultaat van de match ook nog kunnen trimmen om er verzekerd van te zijn dat de newline wordt verwijderd
De bovenstaande functies ($db->query, $db->escape, $res->numRows(), $res->fetchAssoc(), $res->freeResult()) zijn geen standaard PHP, die zitten in zelfgeschreven PHP-klasses.