In mijn poging loop ik tegen foutmelding als ik onderstaande regels in mijn script heb opgenomen.
Zonder deze regels werkt het prima.
$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
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().
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.
[size=xsmall](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)[/size]
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?
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();
}
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:
<?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:
<?php
$update_query = "UPDATE gebruikers SET lastactive = NOW() WHERE username = :username";
$pdoResult = $pdoConnect->prepare($update_query);
$pdoResult->execute(array(':username' => $_SESSION['username']));
?>
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.