PDO-API en prepared statements werkt bij mij niet
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
$stmt->execute(array(
':gebruikersnaam' => $_GET['user'],
':wachtwoord' => $_GET['password']
));
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.
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
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
Behalve dat die later eventueel nog een keer geëchoëd kunnen worden?
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;
?>
Klopt die PDO::FETCH_OBJ trouwens? Ik zie die beschreven staan bij PDO::fetch maar niet bij PDO::fetchAll.
En Nicky Monsma ik snap nit wat ik daar mee moet.
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
Ah, dan moet je $stmt in een foreach stoppen.
$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.
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
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.