database update met datum
Zonder deze regels werkt het prima.
Code (php)
1
2
3
4
5
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();
$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
Ik gebruik zelf geen PDO, maar moet je niet ook bind_param() gebruiken?
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().
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)
On a sidenote, het is ook mogelijk om aan 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
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)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
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();
}
{
$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();
}
DATETIME als database type dus. Je moet wel lezen wat er gezegd wordt voordat je wat doet.
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
Code (php)
1
2
3
4
5
6
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();
?>
$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)
1
2
3
4
5
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']));
?>
$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
Dit werkt !
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