PDO fetch meedere records uit de database

Overzicht Reageren

Sponsored by: Vacatures door Monsterboard

Gijs VO

Gijs VO

31/07/2015 00:25:53
Quote Anchor link
Hallo,

ik ben een kleine functie aan het schrijven die alle aankopen in verband met mijn id uit de database haalt.
Dit is de functie:

function getschema($mysqli){
$id = $_SESSION['user_id'];
$query = $mysqli->prepare("SELECT a.naam
FROM schemes AS a, aankoop AS b
WHERE b.aankoop_username_id = :userid && b.aankoop_schema_id = a.id");
$query->bind_param(':userid', $id, PDO::PARAM_INT);
$query->execute();
$result = $query->fetchAll();
return($result);
}

De query is correct, deze heb ik in phpmyadmin getest en geeft de juiste gegevens weer.
Het probleem is dat als ik deze functie oproep geen enkele return waarde krijg.
Het oproepen doe ik met de volgende code:

foreach(getschema($mysqli) as $row) {
echo $row['naam'];
}

Weet iemand van jullie misschien waar hier mijn fout zit? Ik acht de kans het grootst in het fetchAll() commando, maar ook hier heb ik al verschillende mogelijkheden gebruikt, telkens met hetzelfde resultaat.

Ook is mijn html helemaal geruïneerd als ik bovenstaande foreach lus kopieer in mijn html pagina. Is het mogelijk dat dit komt omdat ik deze code wil weergeven in door javascript gestuurde tabs? Het ziet ernaar uit dat eenmaal de interpreter de php code tegenkomt, de rest van de code (vooral javascript scripts die onderaan de pagina opgeroepen worden) niet meer uitgevoerd wordt.

Hopelijk kan iemand van jullie me helpen met dit probleem.

Gijs
 
PHP hulp

PHP hulp

23/04/2024 20:20:10
 
Thomas van den Heuvel

Thomas van den Heuvel

31/07/2015 00:56:03
Quote Anchor link
Een aantal dingen komen mij vreemd over:

- ik neem aan dat $mysqli een object van de PDO-klasse is? MySQLi en PDO zijn twee tamelijk verschillende dingen, dus deze naamgeving is nogal verwarrend; je gebruikt ofwel PDO, ofwel MySQLi om te communiceren met je MySQL-database, een combinatie is niet mogelijk
- dan $query, dit lijkt mij een object van de klasse PDOStatement? ik zou deze dan $statement of $st of $pdoSt of whatever noemen, maar niet $query
- afhankelijk van hoe je je foutafhandeling ingesteld hebt bij de creatie van het PDO-object wordt false geretourneerd of een exception gegenereerd als je probeert een foutieve query te preparen, ik zou hier eerst eens naar kijken, want die constructie met "&&" lijkt mij niet kloppen, dit moet "AND" zijn denk ik
- PDOStatement::fetchAll() retourneert false als de query mislukt, heb je hier al op gecontroleerd?

Het voornaamste probleem op dit moment is dus dat het je ontbreekt aan middelen om signalen op te vangen dat er (mogelijk) iets mis is.
 
Gijs VO

Gijs VO

31/07/2015 01:04:07
Quote Anchor link
Dag Thomas,

ik heb de code wat aangepast zodat het meer duidelijk is. Ook heb een if else toegevoegd om te kijken of het $result false is na de fetchall.

Het probleem hiermee is dat ik een php test file heb aangemaakt in de map boven includes, waarin de functie staat. Maar hier zelfs niet de error krijg die ik in de if else voorzie.
Dit is de volledige file waarin ik de functie probeer te testen:

functions.php omvat andere, al werkende functies en hierin is de file 'myaccount_functions.php' waarin mijn funtie staat, geincluded.
DB connect is uiteraard de connectie met de database waarin $mysqli gedefinieerd word.

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
9
10
11
12
<?php
include 'includes/functions.php';
include 'includes/db_connect.php';
error_reporting(E_ALL);

sec_session_start();

foreach(getschema($mysqli) as $row) {
    echo $row['naam'];
}


?>

}

Gijs
 
Thomas van den Heuvel

Thomas van den Heuvel

31/07/2015 01:12:04
Quote Anchor link
Okay, zet bovenaan het bovenstaande script (dus helemaal aan het begin van de code die wordt uitgevoerd) het volgende:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
<?php
error_reporting(E_ALL);
ini_set('display_errors', 'stdout');
?>

Krijg je nu notices/warnings/errors/... te zien?

Je zult ons anders van wat meer informatie moeten voorzien, bijvoorbeeld hoe je een connectie maakt (met uitzondering van je database-credentials, uiteraard) want de bovenstaande code biedt (mij iig) weinig extra inzicht.
Gewijzigd op 31/07/2015 01:13:40 door Thomas van den Heuvel
 
Gijs VO

Gijs VO

31/07/2015 01:21:10
Quote Anchor link
Nu krijg ik inderdaad (en gelukkig) de errors te zien.
Op mijn test pagina is dit de error:
'Fatal error: Call to undefined function getschema()'

Voor de databaseconnectie gebruik ik de mysqli api, dit is de connectiestring hiervan:
$mysqli = new mysqli(HOST, USER, PASSWORD, DATABASE);

Ik ben wel zeker dat de sessie gestart is, hiervan kan ik de inhoud wel echo'en.

Gijs
 
Thomas van den Heuvel

Thomas van den Heuvel

31/07/2015 01:29:27
Quote Anchor link
Je maakt een verbinding met MySQLi-functionaliteit, en behandelt dit object vervolgens als een PDO-object.

Dat gaat niet werken.

Je haalt twee dingen door elkaar.
 
Gijs VO

Gijs VO

31/07/2015 01:32:33
Quote Anchor link
Kan je me helpen aan te wijzen waar ik de 2 methodes dan met elkaar verwissel?
 
Thomas van den Heuvel

Thomas van den Heuvel

31/07/2015 01:45:13
Quote Anchor link
Je moet het zo zien: er zijn verschillende manieren om met je MySQL-database te communiceren. Deze staan helemaal los van elkaar.

Een manier is via MySQLi.
En dan is daar PDO met zijn specifieke MySQL-driver.

Elke manier heeft zijn eigen regels en gebruik.

Wat jij doet is je database-connectie opzetten middels MySQLi, en vervolgens behandel je dit aangemaakte object ($mysqli) op de PDO-manier. Dat gaat nooit ofte nimmer werken.

Kies één van de twee. MySQLi of PDO.
 
Gijs VO

Gijs VO

31/07/2015 02:09:57
Quote Anchor link
Met deze code lukt het uiteindelijk wel. Had inderdaad pdo met mysqli gemixt.
function getschema($mysqli){
$id = $_SESSION['user_id'];
$stmt = $mysqli->prepare("SELECT a.naam
FROM schemes AS a, aankoop AS b
WHERE b.aankoop_username_id = ? AND b.aankoop_schema_id = a.id");
$stmt->bind_param("i", $id);
$stmt->execute();
$resultset = $stmt->get_result();
$result = $resultset->fetch_all();
return($result);
}
 



Overzicht Reageren

 
 

Om de gebruiksvriendelijkheid van onze website en diensten te optimaliseren maken wij gebruik van cookies. Deze cookies gebruiken wij voor functionaliteiten, analytische gegevens en marketing doeleinden. U vindt meer informatie in onze privacy statement.