PDO-API en prepared statements werkt bij mij niet

Overzicht Reageren

Sponsored by: Vacatures door Monsterboard

Pagina: 1 2 3 volgende »

Patrick vollenbroek

patrick vollenbroek

30/11/2012 16:14:48
Quote Anchor link
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
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
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
  }
?>
Gewijzigd op 30/11/2012 16:26:51 door Patrick vollenbroek
 
PHP hulp

PHP hulp

22/12/2024 08:19:17
 
Kris Peeters

Kris Peeters

30/11/2012 16:17:34
Quote Anchor link
en zo?

$stmt->execute(array(
':gebruikersnaam' => $_GET['user'],
':wachtwoord' => $_GET['password']
));
 
Patrick vollenbroek

patrick vollenbroek

30/11/2012 16:19:55
Quote Anchor link
Dan krijg ik deze foutmelding

Parse error: syntax error, unexpected T_DOUBLE_ARROW on line 8
Gewijzigd op 30/11/2012 16:27:11 door patrick vollenbroek
 
Wouter J

Wouter J

30/11/2012 16:20:41
Quote Anchor link
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.
 
Patrick vollenbroek

patrick vollenbroek

30/11/2012 16:23:46
Quote Anchor link
De code is nu:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
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
  }
?>


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
 
Kris Peeters

Kris Peeters

30/11/2012 16:42:19
Quote Anchor link
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.

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
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();
}

?>


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
 
Wouter J

Wouter J

30/11/2012 17:00:42
Quote Anchor link
Voeg bij de code van kris wel nog even dit toe na $conn = new PDO(...):
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
<?php
$conn
->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
?>
 
Eddy E

Eddy E

30/11/2012 19:41:48
Quote Anchor link
Wat is nou de functie van regel 2 en 3?
Behalve dat die later eventueel nog een keer geëchoëd kunnen worden?
 
Patrick vollenbroek

patrick vollenbroek

01/12/2012 07:00:19
Quote Anchor link
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:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
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;
?>
 
Ivo Breeden

Ivo Breeden

01/12/2012 13:07:21
Quote Anchor link
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.
 
Nicky Monsma

Nicky Monsma

01/12/2012 20:01:05
 
Patrick vollenbroek

patrick vollenbroek

02/12/2012 07:00:10
Quote Anchor link
OKé Ivo Breeden, maar welke dan en hoe?

En Nicky Monsma ik snap nit wat ik daar mee moet.
 
Ivo Breeden

Ivo Breeden

02/12/2012 14:12:45
Quote Anchor link
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)
PHP script in nieuw venster Selecteer het PHP script
1
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.
?>
Gewijzigd op 02/12/2012 14:15:59 door Ivo Breeden
 
Wouter J

Wouter J

02/12/2012 14:40:15
Quote Anchor link
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:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
9
10
11
<?php
// ...

$stmt = $pdo->prepare(...);
// ...
$result = $stmt->execute(...);

foreach ($result as $row) {
    echo $row['mijn veld'];
}

?>
 
Ivo Breeden

Ivo Breeden

02/12/2012 17:33:14
Quote Anchor link
Wouter, ik ben het er niet mee eens. De returnvalue van PDOStatement::execute is een bool.
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
bool PDOStatement::execute ([ array $input_parameters ] )
 
Wouter J

Wouter J

02/12/2012 17:39:49
Quote Anchor link
Ah, dan moet je $stmt in een foreach stoppen.
 
Ivo Breeden

Ivo Breeden

02/12/2012 18:58:11
Quote Anchor link
Beste Wouter, ik zie het niet helemaal voor me, kun je een uitgewerkt voorbeeld geven? Bedoel je dat je moet doen:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
<?php
//...
foreach ($stmt as $row) { ... }
?>

$stmt is een object, en bevat al properties. En waar zijn dan deze methods voor?
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
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.
 
Patrick vollenbroek

patrick vollenbroek

02/12/2012 20:18:11
Quote Anchor link
Dus nu heb ik dit:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
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;
?>


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
 
Ivo Breeden

Ivo Breeden

02/12/2012 20:23:26
Quote Anchor link
Code (php)
PHP script in nieuw venster Selecteer het PHP script
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
<?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;
?>
Gewijzigd op 02/12/2012 20:32:55 door Ivo Breeden
 
Wouter J

Wouter J

02/12/2012 20:38:20
Quote Anchor link
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:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
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();
}

?>
 
Ivo Breeden

Ivo Breeden

02/12/2012 20:42:26
Quote Anchor link
Dank je wel, Wouter. Ik knoop het in mijn oren en bij de eerstvolgende gelegenheid ga ik het toepassen.
 

Pagina: 1 2 3 volgende »



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.