PDO-API en prepared statements werkt bij mij niet
Hallo mensen,
Ik wil mijn systeem veiliger maen door PDO-API en prepared statements te gebruiken.
Maar het werkt niet dit zijn de foutmeldingen:
Parse error: syntax error, unexpected '[', expecting ')' in
on line 7
(dus $stmt->execute([ deze lijn.)
En dit is mijn script
Ik wil mijn systeem veiliger maen door PDO-API en prepared statements te gebruiken.
Maar het werkt niet dit zijn de foutmeldingen:
Parse error: syntax error, unexpected '[', expecting ')' in
on line 7
(dus $stmt->execute([ deze lijn.)
En dit is mijn script
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
<?php
$username = '******';
$password = '******';
$conn = new PDO("mysql:host=localhost;dbname=the-game", $username, $password);
$conn->setAttribute(PDO::ATTR_EMULATE_PREPARES, false);
$stmt = $conn->prepare('SELECT * from gebruiker WHERE gebruikersnaam = :gebruikersnaam and land = :wachtwoord');
$stmt->execute([
':gebruikersnaam' => $_GET['user'],
':wachtwoord' => $_GET['password']
]);
$results = $stmt->fetchAll(PDO::FETCH_OBJ);
while($row = mysql_fetch_array($results))
{
//tekst
}
?>
$username = '******';
$password = '******';
$conn = new PDO("mysql:host=localhost;dbname=the-game", $username, $password);
$conn->setAttribute(PDO::ATTR_EMULATE_PREPARES, false);
$stmt = $conn->prepare('SELECT * from gebruiker WHERE gebruikersnaam = :gebruikersnaam and land = :wachtwoord');
$stmt->execute([
':gebruikersnaam' => $_GET['user'],
':wachtwoord' => $_GET['password']
]);
$results = $stmt->fetchAll(PDO::FETCH_OBJ);
while($row = mysql_fetch_array($results))
{
//tekst
}
?>
Gewijzigd op 30/11/2012 16:26:51 door Patrick vollenbroek
en zo?
$stmt->execute(array(
':gebruikersnaam' => $_GET['user'],
':wachtwoord' => $_GET['password']
));
$stmt->execute(array(
':gebruikersnaam' => $_GET['user'],
':wachtwoord' => $_GET['password']
));
Dan krijg ik deze foutmelding
Parse error: syntax error, unexpected T_DOUBLE_ARROW on line 8
Parse error: syntax error, unexpected T_DOUBLE_ARROW on line 8
Gewijzigd op 30/11/2012 16:27:11 door patrick vollenbroek
De [] voor arrays zijn mogelijk sinds 5.4.x, ik vermoed dat je een 5.3.x versie hebt? Gebruik dan array(), zoals Kris aangeeft.
De code is nu:
En nu krijg ik deze foutmelding:
Fatal error: Call to a member function execute() on a non-object on line 7
Toevoeging op 30/11/2012 16:31:37:
wat moet ik doen?
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
<?php
$username = '**********';
$password = '**********';
$conn = new PDO("mysql:host=localhost;dbname=the-game", $username, $password);
$conn->setAttribute(PDO::ATTR_EMULATE_PREPARES, false);
$stmt = $conn->prepare('SELECT * from gebruiker WHERE gebruikersnaam = :gebruikersnaam and land = :wachtwoord');
$stmt->execute(array(
':gebruikersnaam' => $_GET['user'],
':wachtwoord' => $_GET['password']
));
$results = $stmt->fetchAll(PDO::FETCH_OBJ);
while($row = mysql_fetch_array($results))
{
//tekst
}
?>
$username = '**********';
$password = '**********';
$conn = new PDO("mysql:host=localhost;dbname=the-game", $username, $password);
$conn->setAttribute(PDO::ATTR_EMULATE_PREPARES, false);
$stmt = $conn->prepare('SELECT * from gebruiker WHERE gebruikersnaam = :gebruikersnaam and land = :wachtwoord');
$stmt->execute(array(
':gebruikersnaam' => $_GET['user'],
':wachtwoord' => $_GET['password']
));
$results = $stmt->fetchAll(PDO::FETCH_OBJ);
while($row = mysql_fetch_array($results))
{
//tekst
}
?>
En nu krijg ik deze foutmelding:
Fatal error: Call to a member function execute() on a non-object on line 7
Toevoeging op 30/11/2012 16:31:37:
wat moet ik doen?
Gewijzigd op 30/11/2012 16:27:29 door patrick vollenbroek
Dat wil zeggen dat de SQL-string niet gelukt is (waarna $stmt dus false wordt en je die false niet kan execute()'en).
Zet eens een try/catch rond je pdo-statements.
Wat voor errors krijg je?
Trouwens ... WHERE land = :wachtwoord
Weet je zeker? Heet dat db-veld land?
PS.
By the way, deze tutorial al gezien? http://www.phphulp.nl/php/tutorial/overig/pdo-verbinden-met-verschillende-databases/534/
Zet eens een try/catch rond je pdo-statements.
Code (php)
1
2
3
4
5
6
7
8
9
10
2
3
4
5
6
7
8
9
10
<?php
try
{
// alles van code waar iets van pdo gebruikt wordt
}
catch(PDOException $e)
{
echo $e->getMessage();
}
?>
try
{
// alles van code waar iets van pdo gebruikt wordt
}
catch(PDOException $e)
{
echo $e->getMessage();
}
?>
Wat voor errors krijg je?
Trouwens ... WHERE land = :wachtwoord
Weet je zeker? Heet dat db-veld land?
PS.
By the way, deze tutorial al gezien? http://www.phphulp.nl/php/tutorial/overig/pdo-verbinden-met-verschillende-databases/534/
Gewijzigd op 30/11/2012 16:46:13 door Kris Peeters
Voeg bij de code van kris wel nog even dit toe na $conn = new PDO(...):
Wat is nou de functie van regel 2 en 3?
Behalve dat die later eventueel nog een keer geëchoëd kunnen worden?
Behalve dat die later eventueel nog een keer geëchoëd kunnen worden?
Maar nu krijg ik deze foutmelding:
Warning: mysql_fetch_array(): supplied argument is not a valid MySQL result resource on line 14
En dit is de code nu:
Warning: mysql_fetch_array(): supplied argument is not a valid MySQL result resource on line 14
En dit is de code nu:
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
<?php
// Maken van verbinding
$db = new PDO('mysql:host=localhost;dbname=beveileging', '*********', '**************');
$db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
$db->setAttribute(PDO::ATTR_EMULATE_PREPARES, false);
$stmt = $db->prepare('SELECT * from gebruikers WHERE gebruikersnaam = :gebruikersnaam and wachtwoord = :wachtwoord');
**************** //wachtwoord cordering
$stmt->execute(array(
':gebruikersnaam' => $_GET['user'],
':wachtwoord' => $wachtwoord
));
$result = $stmt->fetchAll(PDO::FETCH_OBJ);
while($row = mysql_fetch_array($result))
{
//tekst
}
// Sluiten van verbinding
$db = NULL;
?>
// Maken van verbinding
$db = new PDO('mysql:host=localhost;dbname=beveileging', '*********', '**************');
$db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
$db->setAttribute(PDO::ATTR_EMULATE_PREPARES, false);
$stmt = $db->prepare('SELECT * from gebruikers WHERE gebruikersnaam = :gebruikersnaam and wachtwoord = :wachtwoord');
**************** //wachtwoord cordering
$stmt->execute(array(
':gebruikersnaam' => $_GET['user'],
':wachtwoord' => $wachtwoord
));
$result = $stmt->fetchAll(PDO::FETCH_OBJ);
while($row = mysql_fetch_array($result))
{
//tekst
}
// Sluiten van verbinding
$db = NULL;
?>
Maar dat is ook wel logisch. Je gebruikt PDO en daar hoort mysql_fetch_array() niet bij. $result bevat een objecten-tree en die zul je moeten doorlopen.
Klopt die PDO::FETCH_OBJ trouwens? Ik zie die beschreven staan bij PDO::fetch maar niet bij PDO::fetchAll.
Klopt die PDO::FETCH_OBJ trouwens? Ik zie die beschreven staan bij PDO::fetch maar niet bij PDO::fetchAll.
OKé Ivo Breeden, maar welke dan en hoe?
En Nicky Monsma ik snap nit wat ik daar mee moet.
En Nicky Monsma ik snap nit wat ik daar mee moet.
Patrick, ik kan het even niet goed testen maar volgens mij moet het zo. Je moet de fetchAll vervangen door fetch en die in een while opnemen.
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
13
2
3
4
5
6
7
8
9
10
11
12
13
<?php
// ... voorafgaande code
while ($result = $stmt->fetch(PDO::FETCH_ASSOC) {
// nu een for om alle kolommen van de rij af te drukken
foreach ($result as $kolom=>$waarde) {
echo $kolom .': '. $waarde ."<br>\n";
}
//alle kolommen zijn afgedrukt, nu een streep
echo "<hr>\n";
//en eventueel verder met de volgende rij
}
// ... en volgende code zoals sluiten van verbinding.
?>
// ... voorafgaande code
while ($result = $stmt->fetch(PDO::FETCH_ASSOC) {
// nu een for om alle kolommen van de rij af te drukken
foreach ($result as $kolom=>$waarde) {
echo $kolom .': '. $waarde ."<br>\n";
}
//alle kolommen zijn afgedrukt, nu een streep
echo "<hr>\n";
//en eventueel verder met de volgende rij
}
// ... en volgende code zoals sluiten van verbinding.
?>
Gewijzigd op 02/12/2012 14:15:59 door Ivo Breeden
Die foreach enzo is natuurlijk niet nodig, alleen de while is nodig. Sinds PDOStatement (wat je terugkrijgt van $stmt->execute()) een Iterator is kun je hem ook meteen in een foreach loop plaatsen en is de fetch niet nodig:
Wouter, ik ben het er niet mee eens. De returnvalue van PDOStatement::execute is een bool.
Ah, dan moet je $stmt in een foreach stoppen.
Beste Wouter, ik zie het niet helemaal voor me, kun je een uitgewerkt voorbeeld geven? Bedoel je dat je moet doen:
$stmt is een object, en bevat al properties. En waar zijn dan deze methods voor?
$stmt is een object, en bevat al properties. En waar zijn dan deze methods voor?
Code (php)
1
2
3
4
2
3
4
PDOStatement::fetch ��� Fetches the next row from a result set
PDOStatement::fetchAll ��� Returns an array containing all of the result set rows
PDOStatement::fetchColumn ��� Returns a single column from the next row of a result set
PDOStatement::fetchObject ��� Fetches the next row and returns it as an object.
PDOStatement::fetchAll ��� Returns an array containing all of the result set rows
PDOStatement::fetchColumn ��� Returns a single column from the next row of a result set
PDOStatement::fetchObject ��� Fetches the next row and returns it as an object.
Dus nu heb ik dit:
En dan krijg ik deze foutmeldingen:
Warning: PDOStatement::execute() expects parameter 1 to be array, integer given on line 11
Warning: Invalid argument supplied for foreach() on line 13
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
<?php
// Maken van verbinding
$db = new PDO('mysql:host=localhost;dbname=beveileging', '*********', '******************');
$db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
$db->setAttribute(PDO::ATTR_EMULATE_PREPARES, false);
$stmt = $db->prepare('SELECT * from gebruikers WHERE gebruikersnaam = :gebruikersnaam and wachtwoord = :wachtwoord');
$stmt->execute(array(
':gebruikersnaam' => $_GET['user'],
':wachtwoord' => $_GET['password']
));
$result = $stmt->execute(PDO::FETCH_OBJ);
foreach ($result as $row) {
echo $row['gebruikersnaam'];
}
// Sluiten van verbinding
$db = NULL;
?>
// Maken van verbinding
$db = new PDO('mysql:host=localhost;dbname=beveileging', '*********', '******************');
$db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
$db->setAttribute(PDO::ATTR_EMULATE_PREPARES, false);
$stmt = $db->prepare('SELECT * from gebruikers WHERE gebruikersnaam = :gebruikersnaam and wachtwoord = :wachtwoord');
$stmt->execute(array(
':gebruikersnaam' => $_GET['user'],
':wachtwoord' => $_GET['password']
));
$result = $stmt->execute(PDO::FETCH_OBJ);
foreach ($result as $row) {
echo $row['gebruikersnaam'];
}
// Sluiten van verbinding
$db = NULL;
?>
En dan krijg ik deze foutmeldingen:
Warning: PDOStatement::execute() expects parameter 1 to be array, integer given on line 11
Warning: Invalid argument supplied for foreach() on line 13
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
<?php
try {
// Maken van verbinding
$db = new PDO('mysql:host=localhost;dbname=beveileging', '*********', '******************');
$db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
$db->setAttribute(PDO::ATTR_EMULATE_PREPARES, false);
$stmt = $db->prepare('SELECT * from gebruikers WHERE gebruikersnaam = :gebruikersnaam and wachtwoord = :wachtwoord');
$stmt->execute(array(
':gebruikersnaam' => $_GET['user'],
':wachtwoord' => $_GET['password']
));
while ($result = $stmt->fetch(PDO::FETCH_ASSOC) {
// nu een for om alle kolommen van de rij af te drukken
foreach ($result as $kolom=>$waarde) {
echo $kolom .': '. $waarde ."<br>\n";
}
//alle kolommen zijn afgedrukt, nu een streep
echo "<hr>\n";
//en eventueel verder met de volgende rij
}
} catch(PDOException $e)
{
echo $e->getMessage();
}
// Sluiten van verbinding
$db = NULL;
?>
try {
// Maken van verbinding
$db = new PDO('mysql:host=localhost;dbname=beveileging', '*********', '******************');
$db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
$db->setAttribute(PDO::ATTR_EMULATE_PREPARES, false);
$stmt = $db->prepare('SELECT * from gebruikers WHERE gebruikersnaam = :gebruikersnaam and wachtwoord = :wachtwoord');
$stmt->execute(array(
':gebruikersnaam' => $_GET['user'],
':wachtwoord' => $_GET['password']
));
while ($result = $stmt->fetch(PDO::FETCH_ASSOC) {
// nu een for om alle kolommen van de rij af te drukken
foreach ($result as $kolom=>$waarde) {
echo $kolom .': '. $waarde ."<br>\n";
}
//alle kolommen zijn afgedrukt, nu een streep
echo "<hr>\n";
//en eventueel verder met de volgende rij
}
} catch(PDOException $e)
{
echo $e->getMessage();
}
// Sluiten van verbinding
$db = NULL;
?>
Gewijzigd op 02/12/2012 20:32:55 door Ivo Breeden
Ivo, $stmt is een instance van het PDOStatement object. Deze implementeert Traversable, en alles wat die implementeert kun je in een loopje gooien. Hij zal dan het object omzetten in een array en klaar ben je.
Met PDOStatement::setFetchMode() (pdostatement.setfetchmode) kun je instellen welke methode je wilt gebruiken om te fetchen, anders zal hij PDO::FETCH_ARRAY gebruiken.
Voorbeeldje:
Met PDOStatement::setFetchMode() (pdostatement.setfetchmode) kun je instellen welke methode je wilt gebruiken om te fetchen, anders zal hij PDO::FETCH_ARRAY gebruiken.
Voorbeeldje:
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
<?php
try {
$pdo = new PDO(sprintf('mysql:host=%s;dbname=%s', $host, $db), $user, $pass);
$pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
$stmt = $pdo->prepare('SELECT * FROM page');
$stmt->setFetchMode(PDO::FETCH_ASSOC);
$stmt->execute();
foreach ($stmt as $row) {
var_dump($row);
}
} catch (PDOException $e) {
echo $e->getMessage();
}
?>
try {
$pdo = new PDO(sprintf('mysql:host=%s;dbname=%s', $host, $db), $user, $pass);
$pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
$stmt = $pdo->prepare('SELECT * FROM page');
$stmt->setFetchMode(PDO::FETCH_ASSOC);
$stmt->execute();
foreach ($stmt as $row) {
var_dump($row);
}
} catch (PDOException $e) {
echo $e->getMessage();
}
?>
Dank je wel, Wouter. Ik knoop het in mijn oren en bij de eerstvolgende gelegenheid ga ik het toepassen.




