datum blijft op 0000 staan in gastenboek
Bij de eerste "echte" opdracht loop ik nu tegen een probleem aan wat ik niet uitgevogeld krijg.
De opdracht is om een gastenboek te maken met een pagina voor de berichten en een pagina voor de invoer.
Tabel is aangemaakt en er moet een veld: datum inkomen met het type date.
Voor de pagina's heb ik gebruik gemaakt van een voorbeeld wat ik ergens vond (
Als ik nu een bericht schrijf krijg ik allemaal nullen inplaats van de datum.
Wijzig ik het type in text, dan krijg ik wel de juiste datum en tijd te zien.
Ik heb al van alles geprobeerd en ben al 3 dagen aan het Googlen, ook op NOW(), ook hier gezocht, maar kom er niet uit.
Dit zijn mijn codes:
gastenboek.php
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
"http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<title>Gastenboek boodschappen</title>
<meta http-equiv="content-type" content="text/html; charset=iso-8859-1" />
<style>
<!--
a{text-decoration:none}
//-->
</style>
</head>
<body bgcolor="#FFFFFF">
<table width="90%" border="0" cellspacing="0" cellpadding="3" align="center">
<tr>
<td>
<strong>Druk op onderstaande knop om een boodschap achter te laten. </strong><br><br>
<a href="invoer.php"><input type="button" value="Boodschap"></a> <br><br>
</td>
</tr>
<tr>
<td >
<strong>Eerder geschreven berichten in het gastenboek. </strong><br>
</td>
</tr>
</table>
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
<?php
mysql_connect("","","");
mysql_select_db("");
$query = "SELECT * FROM gastenboek ORDER BY id DESC";
$sql=mysql_query($query) or die (mysql_error());
if($query > 0)
{
// hier de boodschappen
}
else
{
echo "Er is nog niet in het gastenboek geschreven";
}
while ($obj=mysql_fetch_object($sql)) {
$naam = $obj->naam;
$datum = $obj->datum;
$boodschap = $obj->boodschap;
?>
mysql_connect("","","");
mysql_select_db("");
$query = "SELECT * FROM gastenboek ORDER BY id DESC";
$sql=mysql_query($query) or die (mysql_error());
if($query > 0)
{
// hier de boodschappen
}
else
{
echo "Er is nog niet in het gastenboek geschreven";
}
while ($obj=mysql_fetch_object($sql)) {
$naam = $obj->naam;
$datum = $obj->datum;
$boodschap = $obj->boodschap;
?>
<br>
<table width="90%" border="0" cellspacing="0" cellpadding="3" align="center">
<tr>
<td >
<strong>Geschreven door </strong>
op
</td>
</tr>
<tr>
<td >
</td>
</tr>
</table>
invoer.php
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
"http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<title>Gastenboek invoerpagina</title>
<meta http-equiv="content-type" content="text/html; charset=iso-8859-1" />
<style>
<!--
a{text-decoration:none}
//-->
</style>
</head>
<body bgcolor="#FFFFFF">
<form action="" method="post" >
<br><table width="90%" border="0" cellspacing="0" cellpadding="3" align="center">
<tr>
<td>
<strong>Naam </strong><br />
<input value="" type="text" name="naam">
</td>
</tr>
<tr>
<td>
<strong>Boodschap </strong><br />
<textarea name="boodschap" rows="8" cols="50"></textarea><br>
<input type="submit" value="Verstuur">
</td>
</tr>
</table>
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
<?php
mysql_connect("","","");
mysql_select_db("");
if(isset($_POST['naam']) and isset($_POST['boodschap']) and $_POST['naam']!='naam' and $_POST['boodschap']!='boodschap' ) {
$boodschap = $_POST['boodschap'];
$naam = $_POST['naam'];
$datum = date("d-m-Y | H:i", time());
$boodschap = str_replace("\n", "<br>", $boodschap);
$query = "INSERT INTO gastenboek(boodschap, naam , datum) VALUES ('".$boodschap."', '".$naam."', '".$datum."')";
$sql=mysql_query($query) or die (mysql_error());
}
?>
mysql_connect("","","");
mysql_select_db("");
if(isset($_POST['naam']) and isset($_POST['boodschap']) and $_POST['naam']!='naam' and $_POST['boodschap']!='boodschap' ) {
$boodschap = $_POST['boodschap'];
$naam = $_POST['naam'];
$datum = date("d-m-Y | H:i", time());
$boodschap = str_replace("\n", "<br>", $boodschap);
$query = "INSERT INTO gastenboek(boodschap, naam , datum) VALUES ('".$boodschap."', '".$naam."', '".$datum."')";
$sql=mysql_query($query) or die (mysql_error());
}
?>
Code (php)
</body>
</html>
Ik heb geprobeerd om bovenstaande op de juiste manier te plaatsen, maar heb geen idee hoe ik op dit forum de code kan "inpakken".
Toevoeging op 29/12/2012 22:02:33:
Gaat vanzelf zie ik ;-)
Gewijzigd op 29/12/2012 22:07:11 door Marianne M
Over je probleem... Gebruik de MySQL NOW() functie en maak het veld een DATETIME type.
gewoon even naar de functie date() kijken op de php website ;)
wat is de waarde va de tabel in de database (int, text, date, datetime, timestamp,...)
ps. je sql wordt niet gecontroleerd op fouten (toch niet op de juiste manier )
zoek eens op phphulp op sql gebruikershandleiding (gebruik ik ook nog regelmatig )
Je hebt als je het goed wilt doen, de date() functie niet eens nodig.
maar waarop is date() niet goed? dat werkt toch ook?
Omdat NOW() in MySQL al de juiste waarde geeft, met date() sta je deze opnieuw te construeren.
azo bedankt
(dit is geen verwijt, hier doe ik zelf ook heel hard aan mee).
Marianne, als ik je code zie staat hij bomvol met fouten en maakt het me 1 ding duidelijk: Jou cursus is eigenlijk te oud om nu nog te gebruiken.
En omdat je dingen in queries het beste met SQL kunt oplossen ipv PHP, PHP developers hebben weinig kennis van SQL en gaan daardoor veel te veel in PHP oplossen Marianne, als ik je code zie staat hij bomvol met fouten en maakt het me 1 ding duidelijk: Jou cursus is eigenlijk te oud om nu nog te gebruiken.
- Aar - op 29/12/2012 22:14:34:
Niet helemaal, daarom zijn er ook [code][/code] tags op het forum om je relevante code (t/m 20 regels) te kunnen plaatsen.
Over je probleem... Gebruik de MySQL NOW() functie en maak het veld een DATETIME type.
Over je probleem... Gebruik de MySQL NOW() functie en maak het veld een DATETIME type.
Misschien goed om dan het volledige antwoord te geven. De functie NOW() geeft de huidige datum en tijd van de server. CURDATE() geeft de huidige datum van de server. Gezien de opdracht zou dat dus de juiste zijn. Verder is het van belang om te weten hoe een datum wordt opgeslagen in MySQL, want dat is waar het hier fout gaat. Een datum staat in de database als '2012-12-29'. Jaar, maand, dag dus en als je het invoert doe je dat als string en heb je dus ook de quotes eromheen nodig.
$datum = date("d-m-Y | H:i", time());
vervangen door:
$date = date ('d-m-y');
om het even makkelijk te houden zegmaar?
Nee Joop. Ten eerste zit je dan nog steeds met de verkeerde dateformat, ten tweede ben je dan dingen in php aan het doen die je in de database kunt afhandelen.
Heb wel gewoon datum erin staan en tijd ook
En hij print het ook weer goed terug op de website
Ma zal is gaan kijken naar de now() functie
Interessant
Wouter J op 30/12/2012 14:18:38:
Jooop, leuke tutorial voor je± http://phptuts.nl/view/1/
Jaja geweldig!!! Ga ik helemaal uitpluizen en toepassen
Haha @ het kan altijd beter!!!
Code (php)
1
$query = "INSERT INTO gastenboek(boodschap, naam , datum) VALUES ('".$boodschap."', '".$naam."', '".$datum."')";
Ik had hieronder al deze regel toegevoegd:
Nu krijg ik wel een datum, maar geen naam of bericht meer.
@Erwin H, Inderdaad is de opdracht om gebruik te maken van DATE, dus CURDATE() zou beter zijn dan NOW?
Waar en hoe moet ik het schrijven? Heeft iemand een voorbeeld?
En je schrijft: Verder is het van belang om te weten hoe een datum wordt opgeslagen in MySQL, want dat is waar het hier fout gaat.
Kun je dit wat uitleggen?
@Wouter J, Ik was er na de eerste paar lessen al achter dat dit een cursus van niks is. De cursus bestaat uit: lees die en die paragrafen van het boek (PHP5 en MySQL, het complete handboek) en vervolgens een opdracht om iets te maken wat niet eens, of heel summier is beschreven. Na een heel hoofdstuk met voornamelijk code voor het inrichten van een uitgebreid formulier met radiobuttens, checkboxes en textvelden moet je dan een gastenboek met twee pagina's kunnen maken.
De code heb ik dan ook van http://www.sitemasters.be/scripts/1/6/507/PHP/Een_eenvoudig_gastenboek
Deze heb ik omgebouwd tot de twee pagina's zoals in de opdracht staat.
PHP beginnershandleiding en SQL handleiding.
En nog een tip: Kopieer nooit code! Doe op zijn minst 2 dingen:
1) Typ de code over, de code gaat dan via je hersenen en daardoor leer je er ook nog echt wat van;
2) Leg per regel aan jezelf uit wat er gebeurd en vooral waarom het gebeurd.
Oké, laten we even rustig bij het begin beginnen. Kun jij me uitleggen wat de eerste regel code doet, die je hiervoor gegeven hebt? Mocht je dat niet kunnen dan raad ik je aan eerst wat tutorials rustig door te lezen en over een week of 2 à 3 weer terug te komen, deze tutorials heten En nog een tip: Kopieer nooit code! Doe op zijn minst 2 dingen:
1) Typ de code over, de code gaat dan via je hersenen en daardoor leer je er ook nog echt wat van;
2) Leg per regel aan jezelf uit wat er gebeurd en vooral waarom het gebeurd.
Als ik DATE verander in TEXT gaat het wel goed, maar dat is niet de bedoeling.
Gewijzigd op 30/12/2012 17:48:46 door Marianne M
NOW() en CURDATE() zijn ingebouwde mysql functies en de datum en/of tijd is zoals die is ingesteld op het systeem waar mysql op draait.
Marianne M op 30/12/2012 17:26:22:
@Erwin H, Inderdaad is de opdracht om gebruik te maken van DATE, dus CURDATE() zou beter zijn dan NOW?
Waar en hoe moet ik het schrijven? Heeft iemand een voorbeeld?
En je schrijft: Verder is het van belang om te weten hoe een datum wordt opgeslagen in MySQL, want dat is waar het hier fout gaat.
Kun je dit wat uitleggen?
Waar en hoe moet ik het schrijven? Heeft iemand een voorbeeld?
En je schrijft: Verder is het van belang om te weten hoe een datum wordt opgeslagen in MySQL, want dat is waar het hier fout gaat.
Kun je dit wat uitleggen?
Datums worden op vele manier geschreven.
30 december 2012
30-12-2012
30-12-12
12-30-2012
2012-30-12
Betekenen allemaal hetzelfde. In veel gevallen kunnen die verschillende schrijfwijze echter verwarrend zijn. Denk maar aan 9/11. Voor de Amerikanen is dat 11 september, voor ons Hollanders en Belgen is dat eigenlijk 9 november.
Voor programmeurs is dit een bekend en vervelend probleem, waardoor er eigenlijk altijd wordt gezocht naar standaarden. De standaard schrijfwijze die MySQL aanhoudt voor datums is dus 2012-30-12 (yyyy-mm-dd). Het formaat dat jij nu gebruikt in je voorbeeld zal een datum echter weergeven als dd-mm-yyyy. Dat is een formaat dat MySQL dus niet kent en dus zal je de datum niet verwerkt krijgen.
Wat betreft CURDATE() en NOW() klopt het zoals hierboven al vermeld. CURDATE geeft alleen datum, NOW geeft datum en tijd. Heb je alleen datum veld dan kan je overigens wel NOW() gebruiken, echter je krijgt dan wel een warning van de database server dat je input waarde is afgebroken (truncated). Dit stopt je script niet, maar uiteraard is het altijd beter om dit soort warnings te voorkomen daar waar mogelijk is.
Marianne M op 30/12/2012 17:47:35:
Alleen waar haalt de database de datum vandaan?
De database? Jij geeft in je query $datum mee. Die bepaal je zelf in je code.
Marianne M op 30/12/2012 17:47:35:
Als ik DATE verander in TEXT gaat het wel goed, maar dat is niet de bedoeling.
De opmaak van een datumveld in een database is YYYY-MM-DD
Jouw opmaak van $datum is date("d-m-Y | H:i", time());
Zie verschil in opmaak.
Daarom accepteert de database het niet (wel als je het als TEXT-veld markeert, maar dan staat er (dus) tekst en geen datum (al zou je dat misschien vermoeden).
Je zult in je query dus $datum moeten vervangen door CURDATE()
Verder nog een aantal opmerkingen:
Gebruik aub code-tags, zodat duidelijk is wat bij wat hoort en het script als zodanig herkenbaar is.
In een script: eerst PHP (controle, verwerking), dan HTML.
Bouw controles in. Je controleert nergens of de verbinding met de database is gelukt en of er een tabel geselecteerd is. Or die, bij je query, is geen (nette) foutafhandeling.
Selecteren in een query van 1 of meer velden doe je door ze te benoemen, niet door * te gebruiken.
$_SERVER['PHP_SELF'] wordt als onveilig gezien; kwaadwillende zouden je formulier/site kunnen misbruiken. Laat liever leeg.
Een formulier hoor je eigenlijk niet met een table op te maken, maar met css.
Je controle of een formulier verzonden is, doe je met if($_SERVER['REQUEST_METHOD'] == 'POST') en daarna controleer je of ook alle (vereiste) velden een waarde hebben.
Het aanmaken van $naam en $boodschap is zinloos; die waarden zitten al in $_POST.
Je INSERT-query is 'lek'; mensen kunnen nu ook bv javascript in je database zetten. Iets wat je zult moeten controleren / beveiligen (mysql_real_escape_string).
Dit is wat Wouter bedoelt met verouderd cursusmateriaal.
Gewijzigd op 30/12/2012 18:47:10 door Obelix Idefix
("d-m-Y | H:i", time()); had ik al gewijzigd in ('d-m-y'); maar dan werkte het nog niet, denk dat ik nu snap waarom.
Morgen om 5 uur op (werken), maar daarna ga ik bovenstaande verder bestuderen en zien toe te passen.
En 1 van de dingen waar ik me bij deze cursus en het bijbehorende boek inderdaad aan stoor is, behalve de taalfouten en fouten in codes (als je al in 2006 in een les durft te schrijven dat x de operator is voor vermenigvuldigen en dit in 2012 nog steeds beweert, ik bedoel maar), het gebruik van tabellen om een pagina op te maken + het overvloedige gebruik van hoofdletters en verouderde html.
Als je al een paar jaar gewend bent om alles te doen in xhtml en de opmaak in stylesheets, is dit gewoon tenenkrommend. Maar ja, zo te zien is deze cursus dus ontwikkeld in 2006 en daarna nooit meer gewijzigd. Nou ja, ontwikkeld, lesmateriaal is er niet, slechts opdrachten om delen van het boek te lezen en dan iets in elkaar zien te draaien.
Ik zal hem echter toch helemaal moeten doorlopen om aan het eind een certificaat te kunnen bemachtigen (waar ik in de praktijk denk ik niet veel aan zal hebben), maar voor mezelf gewoon een stukje "ergens aan beginnen en het dan ook af maken".