database update met datum

Overzicht Reageren

Sponsored by: Vacatures door Monsterboard

Theo Huitema

Theo Huitema

05/06/2018 22:22:46
Quote Anchor link
In mijn poging loop ik tegen foutmelding als ik onderstaande regels in mijn script heb opgenomen.
Zonder deze regels werkt het prima.

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
        $started= date("Y/m/d H:i:s");
        $update_query = "UPDATE gebruikers SET lastactive = $started WHERE username=:username";
        $pdoResult->bindValue(':started', $started);
        $pdoResult = $pdoConnect->prepare($update_query);
        $pdoResult->execute();


Ik probeer de gebruiker tabel bij te werken met de datum dat die de laatste keer online was.

De fout die ik krijg is:
Fatal error: Uncaught PDOException: SQLSTATE[HY093]: Invalid parameter number: no parameters were bound in safe.php:41 Stack trace: #0 safe.php(41): PDOStatement->execute() #1 {main} thrown in safe.php on line 41
 
PHP hulp

PHP hulp

18/12/2024 15:09:00
 
- Ariën  -
Beheerder

- Ariën -

05/06/2018 22:38:11
Quote Anchor link
Ik gebruik zelf geen PDO, maar moet je niet ook bind_param() gebruiken?
 
Ben van Velzen

Ben van Velzen

05/06/2018 22:54:04
Quote Anchor link
Het grootste probleem is dat je :started probeert te binden, maar die bestaat niet binnen je query, en je bindt :username niet en die bestaat WEL binnen je query. Waarom gebruik je trouwens niet gewoon de datumtypen van je database? DATETIME in dit geval, en updaten met NOW().
 
Thomas van den Heuvel

Thomas van den Heuvel

05/06/2018 23:22:02
Quote Anchor link
On a sidenote, het is ook mogelijk om aan execute() een genummerd of associatief array mee te geven (zie voorbeeld #2 en #3) in plaats van alles te binden. Scheelt je wel wat code, maar dat heeft natuurlijk wel wat implicaties, als er fouten in het formaat van je invoer zitten dan loopt de code pas spaak als je de query probeert uit te voeren. Dit in tegenstelling tot wanneer je eerst bind(), PHP zal dan al eerder zeuren dat e.e.a. niet goed geformateerd is.

Voeg nooit variabelen rechtstreeks in de SQL-string toe, hier zijn prepared statements niet voor bedoeld!

En wat @Ben zegt: sla geen geformatteerde datums op (Y/m/d H:i:s) maar maak van de daarvoor bestemde kolomtypen gebruik met de daarbij behorende formats.

Op het moment dat je van PDO gebruik maakt ben je wel gebonden (:D) aan wat regels. Zo zou je voor de goede orde ook van een try-catch blok gebruik moeten maken om eventuele exceptions op te vangen.

Ook is PDO ietwat verraderlijk in die zin dat het handjevol klasses niet echt ingewikkeld is, het venijn zit em in de staart (specifiek, in de configuratie en het gebruik van de specifieke database-driver).

(en dan is PDO ook nog eens niet geoptimaliseerd voor gebruik van een specifieke database, simpelweg omdat PDO niet geschreven is voor gebruik van een specifieke database)
Gewijzigd op 05/06/2018 23:23:33 door Thomas van den Heuvel
 
Theo Huitema

Theo Huitema

06/06/2018 09:57:44
Quote Anchor link
Ik probeer jullie adviezen op te volgen. Heb nu onderstaand script.

Recoverable fatal error: Object of class DateTime could not be converted to string in safe.php on line 41
line 41 is: $pdoResult->bindValue(':datum', $datum);

In phpmyadmin in de tabel staat: lastactive - datetime - Nee - 0000-00-00 00:00:00
Wat doe ik dan fout met die datum?


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
        try
        {
        $update_query = "UPDATE gebruikers SET lastactive=:datum WHERE username=:username";
        $datum = new DateTime();
//        $dateTime->format('Y/m/d H:i:s');
        $pdoResult->bindValue(':datum', $datum);
        $pdoResult->bindValue(':username', $_SESSION['username']);
        $pdoResult = $pdoConnect->prepare($update_query);
        $pdoResult->execute();
          }     // einde try

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

Ben van Velzen

06/06/2018 10:05:45
Quote Anchor link
DATETIME als database type dus. Je moet wel lezen wat er gezegd wordt voordat je wat doet.
 
Theo Huitema

Theo Huitema

06/06/2018 10:15:38
Quote Anchor link
Ben, ik ben een beginner hier in, zeker in PDO. Ik zou willen dat ik alles al begreep wat er gezegd werd.
Dus ja .. ik doe veel trial en error.

Wat bedoel je precies met je advies? Kun je misschien in code aangeven wat is verkeerd doe?

Volgens myphpadmin staat in de tabel staat het als datetime.
naam veld : lastactive
type : DATETIME
standaardwaarde : 0000-00-00 00:00:00
 
Ben van Velzen

Ben van Velzen

06/06/2018 10:24:39
Quote Anchor link
Dan is het helemaal mooi, daar kun je geen standaard tijd in zetten, maar een tijd die de database herkent. Gelukkig heeft de database daar zijn eigen voorzieningen voor dus kun je iets als volgt doen:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
<?php
$update_query
= "UPDATE gebruikers SET lastactive = NOW() WHERE username = :username";
$pdoResult = $pdoConnect->prepare($update_query);
$pdoResult->bindValue(':username', $_SESSION['username']);
$pdoResult->execute();
?>

Let vooral op de volgorde van wat je doet, je kunt geen parameters binden voordat je hebt geprepared.
1. Prepare
2. Bind
3. Execute

Of nog wat korter:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
<?php
$update_query
= "UPDATE gebruikers SET lastactive = NOW() WHERE username = :username";
$pdoResult = $pdoConnect->prepare($update_query);
$pdoResult->execute(array(':username' => $_SESSION['username']));
?>
Gewijzigd op 06/06/2018 10:29:00 door Ben van Velzen
 
Theo Huitema

Theo Huitema

06/06/2018 10:42:03
Quote Anchor link
Bedankt Ben, die volgorde had ik nog niet ergens op internet gelezen. Weer wat geleerd.
Dit werkt !
 
Thomas van den Heuvel

Thomas van den Heuvel

06/06/2018 13:36:18
Quote Anchor link
Volgens mij heeft @Theo niets verkeerd gedaan @Ben, behalve dit:
Quote:
Recoverable fatal error: Object of class DateTime could not be converted to string in safe.php on line 41

Het enige wat @Theo daar nog hoefde te doen is een DateTime-object omzetten naar een datum-string.

Dit doe je met de format()-methode.

En dan was je klaar geweest.

Iets waar je misschien nog over na moet denken is het volgende: wie dicteert hoe laat het is? PHP of je database? Want er kunnen best (kleine) verschillen zijn tussen deze twee klokken. Zorg dus altijd dat je consequent van ofwel het een (PHP) ofwel het ander (database) gebruik maakt, maar niet van een combinatie van beide.
Gewijzigd op 06/06/2018 13:37:02 door Thomas van den Heuvel
 



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.