PDO-API en prepared statements werkt bij mij niet

Overzicht Reageren

Sponsored by: Vacatures door Monsterboard

Pagina: « vorige 1 2 3 volgende »

Patrick vollenbroek

patrick vollenbroek

02/12/2012 21:10:12
Quote Anchor link
Dus hoe moet het er dan uitzien in mijn script?
 
PHP hulp

PHP hulp

24/05/2024 04:45:35
 
Ivo Breeden

Ivo Breeden

02/12/2012 21:17:44
Quote Anchor link
Probeer eerst mijn "werkstuk" eens en zie of het werkt. Ik ben benieuwd of je foutmeldingen krijgt.
Als het werkt probeer dan te begrijpen hoe en waarom het werkt en probeer dan of je de verkorte methode van Wouter kunt implementeren.
 
Patrick vollenbroek

patrick vollenbroek

03/12/2012 19:39:51
Quote Anchor link
Dank je Wouter J en Ivo Breeden het werkt.
Mijn uiteindelijke script ziet er zo uit:

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
<?php
try {
    $pdo = new PDO(sprintf('mysql:host=%s;dbname=%s', localhost, beveileging), '*****', '**********');
    $pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);

    $stmt = $pdo->prepare('SELECT * FROM gebruikers WHERE gebruikersnaam = :gebruikersnaam AND geslacht = :geslacht');
    $stmt->setFetchMode(PDO::FETCH_ASSOC);
    $stmt->execute(array(
    ':gebruikersnaam' => $_GET['user'],
    ':geslacht' => $_GET['geslacht']
    ));


    foreach ($stmt as $row) {
        echo $row['gebruikersnaam'];
    }

}
catch (PDOException $e) {
    echo $e->getMessage();
}

?>
 
Ivo Breeden

Ivo Breeden

03/12/2012 21:04:13
Quote Anchor link
Goed gedaan Patrick!
 
Nicky Monsma

Nicky Monsma

03/12/2012 23:20:30
Quote Anchor link
Probeer mijn class ook te leren je kan er makkelijk mee werken als je doorheb hoe het werkt
snippet hoe ik mijn querys maak via mijn class

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
9
10
11
12
<?php
function GetData($key, $username)
{

        $query = "SELECT * FROM users WHERE username = ? LIMIT 1";

        $query = Core::$DB->Query($query)->Bind(array($username))->Run();

    $data = $query->fetch_array();

    return $data[$key];
}

?>
 
Patrick vollenbroek

patrick vollenbroek

04/12/2012 21:13:15
Quote Anchor link
Oke, maar nu wil ik een update kunnen doen.
Dit dacht ik zo te doen:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
<?php
//db updaten
$db = new PDO(sprintf('mysql:host=%s;dbname=%s', localhost, beveileging), '*****', '**********');

$naam = $db->quote($_GET['naam']);
$sql = "UPDATE gebruikers SET gebruikersnaam = 'admin' WHERE gebruikersnaam = '".$naam."'";
?>


Alleen hij doet niks wat doe ik verkeerd?
Gewijzigd op 04/12/2012 21:13:50 door patrick vollenbroek
 
Wouter J

Wouter J

04/12/2012 21:58:57
Quote Anchor link
Krijg je een error, wat is je script, ect.
 
Ivo Breeden

Ivo Breeden

04/12/2012 23:42:45
Quote Anchor link
Patrick, je moet wel je $sql uitvoeren met $db->exec($sql).
En zet er een try-catch omheen voor de exception handling.
 
Patrick vollenbroek

patrick vollenbroek

05/12/2012 16:14:20
Quote Anchor link
Oké 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
<?php
try {
    $db = new PDO(sprintf('mysql:host=%s;dbname=%s', localhost, beveileging), '*****', '*********');
    
    $naam = $db->quote($_GET['naam']);
    $sql = "UPDATE gebruikers SET gebruikersnaam = 'admin' WHERE gebruikersnaam = '".$naam."'";
    $db->exec($sql);
    
}
catch (PDOException $e) {
    echo $e->getMessage();
}

?>


Alleen het werkt nog steeds niet, wat moet ik doen?
Gewijzigd op 05/12/2012 16:15:00 door patrick vollenbroek
 
Ger van Steenderen
Tutorial mod

Ger van Steenderen

05/12/2012 16:24:46
Quote Anchor link
een $ voor localhost en beveile(i?)ging
 
Patrick vollenbroek

patrick vollenbroek

05/12/2012 16:31:14
Quote Anchor link
wat bedoel je?
 
Kris Peeters

Kris Peeters

05/12/2012 16:40:01
Quote Anchor link
Om het een beetje simpel uit te drukken ...

Kijk eens in dat code vak.
Dingen die daar rood kleuren, zijn strings.
Dingen die groen kleuren, zijn operatoren (functies die geen ronde haakjes vereisen).

en dan de blauwe code ...
Als het onderlijnd is, is het een bekende functie (met referentie op php.net). Als er een $ voor staat, is het een variabele.
In het andere geval zijn het defines. Dingen die gedefinieerd geweest zijn.

localhost staat blauw en zou rood moeten zijn (als je letterlijk 'localhost' bedoelt); ofwel moet die waarde in een variabele $localhost steken en moet er dus een $ voor
Gewijzigd op 05/12/2012 16:42:45 door Kris Peeters
 
Ger van Steenderen
Tutorial mod

Ger van Steenderen

05/12/2012 16:40:53
Quote Anchor link
Ik neem aan dat op regel 3 localhost en beveileging geen constanten zijn, dus dan moet het zijn $localhost en $beveileging.
 
Patrick vollenbroek

patrick vollenbroek

05/12/2012 16:49:48
Quote Anchor link
Dat zijn ze wel.

in dit script.
Gewijzigd op 05/12/2012 16:50:18 door patrick vollenbroek
 
Ivo Breeden

Ivo Breeden

05/12/2012 17:21:06
Quote Anchor link
Patrick vollenbroek op 05/12/2012 16:49:48:
Dat zijn ze wel.

in dit script.

Dan moet je ze misschien quoten om duidelijk te maken dat het strings zijn. 'localhost', 'beveiliging'.
Enne hij doet het niet? Krijg je geen melding? Doe eens een `echo $sql` om te zien of de query klopt.
Het resultaat van PDO::exec() is het aantal rijen dat ge-update is. Dat kun je ook nog gebruiken.
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
<?php
// ...
$aantalUpdates = $db->exec($sql);
echo 'Aantal rijen ge-update: '. $aantalUpdates .'\n';
...

?>

Is het resultaat 0? En als je de $sql direct op de database uitvoert?
 
Patrick vollenbroek

patrick vollenbroek

05/12/2012 17:27:32
Quote Anchor link
Het resultaat is:

Aantal rijen ge-update: \n

En wat bedoel je met:
En als je de $sql direct op de database uitvoert?
 
Ger van Steenderen
Tutorial mod

Ger van Steenderen

05/12/2012 17:39:16
Quote Anchor link
Je query uittesten in een tool zoals PHPMyAdmin, Workbench e.v.a.
Dus echo je $sql, sleur en pleur naar je tool en kijk wat er gebeurt.
Gewijzigd op 05/12/2012 17:39:33 door Ger van Steenderen
 
Ivo Breeden

Ivo Breeden

05/12/2012 17:42:25
Quote Anchor link
Dat is vreemd. De exec method moet altijd een getal teruggeven: 0 of meer. Kennelijk wordt de $db->exec($sql) helemaal niet uitgevoerd.
Met: "$sql rechtstreeks op de database uitvoeren" bedoel ik het volgende. Als je een `echo $sql` in je programma opneemt dan weet je precies wat het statement is.
Rechtstreeks op de database uitvoeren betekent dat je op de database inlogt met een ander programma. Voor Oracle zou dat bijvoorbeeld `sqlplus` kunnen zijn, voor MySQL `mysql` of `phpMyAdmin`. Heb je zo'n tool? Je kunt dan de $sql die je hebt geprint direct op de database uitvoeren. Mogelijk krijg je dan een duidelijker foutmelding.

Toevoeging op 05/12/2012 17:48:55:

Merk trouwens op dat "UPDATE gebruikers SET gebruikersnaam = 'admin' WHERE gebruikersnaam = '".$naam."'" maar 1 keer goed gaat voor een bepaalde $naam. De volgende keren komt $naam niet meer voor in de database en wordt er niets ge-update. (Dan is $naam 'admin' geworden.)
 
Patrick vollenbroek

patrick vollenbroek

08/12/2012 08:29:44
Quote Anchor link
Beste mensen,
Nu wil ik een db aansluiten met een streepje.
Hoe moet ik dat doen?
Dus in deze richting:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
<?php
$pdo
= new PDO(sprintf('mysql:host=%s;dbname=%s', localhost, the-game), '***', '**********');
?>


Alvast bedankt.
Gewijzigd op 08/12/2012 08:30:13 door patrick vollenbroek
 
Moose -

Moose -

08/12/2012 10:15:37
Quote Anchor link
Patrick, neem anders eens een kijkje hier: http://nl1.php.net/manual/en/book.pdo.php

Op je vraag, een db aansluiten met een streepje kan gewoon zo

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
new PDO('mysql:host=localhost;dbname=the-game', 'username', 'password');
 

Pagina: « vorige 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.