[PHP & MySQL] Syntax error

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

  • Maxman1850
  • Registratie: Augustus 2009
  • Niet online
Hallo allemaal!

Ik ben bezig met een bezoekersteller op mijn website, en nu loop ik vast.
Dit is een stukje van mijn code:
PHP:
1
2
3
4
5
6
7
8
$sql = "ALTER TABLE teller ADD ";
$sql .= $datum;
$sql .= " INT";

if(!$res = mysql_query($sql))
{
    trigger_error(mysql_error());
}


Maar nu blijf ik de volgende error krijgen:
Notice: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '2009-08-11 INT' at line 1 in C:\xampp\htdocs\chris\index2.php on line 53
Hij maakt de column ook niet aan, maar wat is er dan fout aan mijn syntax? Ik heb al gegoogled en kan er nog niet uitkomen.

Hopelijk kan iemand me helpen, alvast bedankt!

Max

Acties:
  • 0 Henk 'm!

  • disjfa
  • Registratie: April 2001
  • Laatst online: 03-07 14:47

disjfa

be

Ik zou alles vergeten wat je ooit aan mysql hebt geleerd en opnieuw beginnen met een goed boek. Wat je nu aan het doen bent klopt helemaal niet.

disjfa - disj·fa (meneer)
disjfa.nl


Acties:
  • 0 Henk 'm!

  • Maxman1850
  • Registratie: Augustus 2009
  • Niet online
want..? wat doe ik fout dan?
ik had de $sql in stukken gesplist omdat ik dacht dat het dan misschien wel zou werken, als je dat bedoelt..

Acties:
  • 0 Henk 'm!

  • Raynman
  • Registratie: Augustus 2004
  • Nu online
Strings (in dit geval de naam van de kolom) moeten tussen aanhalingstekens hier backticks inderdaad; ik moet weer eens wat met SQL gaan doen en geheugen opfrissen. Verder is '2009-08-11' een erg vreemde naam (zie disjfa hierboven). Normaal zou je een dit als waarde in een veld met een naam als 'datum' zetten.

[ Voor 17% gewijzigd door Raynman op 11-08-2009 13:46 ]


Acties:
  • 0 Henk 'm!

  • frickY
  • Registratie: Juli 2001
  • Laatst online: 18-09 14:42
Eens met disjfa.

Enige onderbouwing; Je probeert een fysieke kolom toe te voegen (ALTER), in plaats van een nieuwe waarde toe te voegen (INSERT) of een bestaande waarde bij te werken (UPDATE).
Als je, om wat voor ongure reden dan ook, echt een kolomnaam wilt van een datum, gebruik dan backticks.

Acties:
  • 0 Henk 'm!

  • cariolive23
  • Registratie: Januari 2007
  • Laatst online: 18-10-2024
En wat voor kolom had je in gedachten? Een kolom met de naam 2009 minus 08 minus 11 slaat nergens op en gaat ook nog eens fout omdat het een verboden naam is. Je vergeet ook te melden dat je een kolom wilt aanmaken, de database kan dit niet raden.

Kortom, wat wil je nu aanmaken en zorg voor correcte SQL. Zie de MySQL handleiding welke statements MySQL precies nodig heeft en ga deze statements eerst even testen voordat je de boel dynamisch wilt gaan maken.

Mocht je verboden woorden (keywords) e.d. willen toestaan als kolomnamen (hoeveel problemen wil je hebben?), ga dan wel een paar vieze backticks ` om de namen zetten, anders loopt de boel ook weer fout. Hiermee ben je wel veroordeeld tot het eeuwige gebruik van overbodige backticks, je hoeft ze maar 1x te vergeten om de meest gruwelijke bugs in je systeem te krijgen. Maar goed, it's up to you! Het is niet mijn probleem wanneer jouw database ineens is verdwenen...

Acties:
  • 0 Henk 'm!

  • Maxman1850
  • Registratie: Augustus 2009
  • Niet online
Ok, iig bedankt voor de reacties!
Het is de eerste keer dat ik een kolom wil toevoegen met MySQL, dus daarom kom ik dus op zulke fouten als dit..
Ik wilde de naam van de kolom inderdaad de naam geven van een datum, dankzij cariolive23 zie ik dat dit helaas niet werkt, de naam heb ik aangepast, ook alles binnen enkele quotes gezet, nu krijg ik de error niet meer, wel wat andere errors, maar dat ligt niet aan mijn SQL zie ik..
Bedankt voor de feedback!!

Acties:
  • 0 Henk 'm!

  • Voutloos
  • Registratie: Januari 2002
  • Niet online
Maxman1850 schreef op dinsdag 11 augustus 2009 @ 13:38:
Hij maakt de column ook niet aan, maar wat is er dan fout aan mijn syntax? Ik heb al gegoogled en kan er nog niet uitkomen.
Lees ALTER TABLE syntax nog maar een keer. :>

edit:
O wacht, je gaat voor het kolom per datum datamodel. In dat geval: succes, je zal het nodig hebben.

[ Voor 13% gewijzigd door Voutloos op 11-08-2009 13:56 ]

{signature}


Acties:
  • 0 Henk 'm!

  • NMe
  • Registratie: Februari 2004
  • Laatst online: 09-09 13:58

NMe

Quia Ego Sic Dico.

Datums en getallen in kolomnamen zijn in 99,9999% van de gevallen een teken van rampzalig slecht databaseontwerp!

Sorry, die moest even heel duidelijk geroepen worden. :P Als je een kolom wil maken per datum dan ben je zeer waarschijnlijk verkeerd bezig. Doorgaans kan wat jij wil ook met een koppeltabel of misschien zelfs zonder, afhankelijk van wat je precies wil. Maar een steeds maar groeiende/veranderende database databaselayout is het foutste en minst onderhoudbare dat je kan doen.

Ter illustratie: schrijf voor mij eens een query die alle records ophaalt uit de maand januari van dit jaar, ongeacht de precieze datum. Gaat je niet lukken zonder 31 kolommen tweemaal uit te schrijven in je query. ;)

[ Voor 18% gewijzigd door NMe op 11-08-2009 13:57 ]

'E's fighting in there!' he stuttered, grabbing the captain's arm.
'All by himself?' said the captain.
'No, with everyone!' shouted Nobby, hopping from one foot to the other.


Acties:
  • 0 Henk 'm!

  • disjfa
  • Registratie: April 2001
  • Laatst online: 03-07 14:47

disjfa

be

Maar waarom wil je een kolom toevoegen met een datum als naam?

Heb je uberhaupt geleerd wat een database zou moeten doen. Of wil je gewoon knutselen omdat het leuk klinkt?

disjfa - disj·fa (meneer)
disjfa.nl


Acties:
  • 0 Henk 'm!

  • Maxman1850
  • Registratie: Augustus 2009
  • Niet online
Omdat ik per dag het aantal bezoekers in de database zet, dus ik moet wel zien terug te vinden in de kolomnaam om welke dag het gaat.

Wat een database zou moeten doen snap ik wel, maar ik ben nog niet zo heel lang bezig met PHP en MySQL, dus ik heb nog een heleboel dingen die ik moet leren..

Acties:
  • 0 Henk 'm!

  • sariel
  • Registratie: Mei 2004
  • Laatst online: 22-05-2024
Maak een teller-tabel aan met slechts 1 veld, een integer. Die integer verhoog je met een update gewoon iedere keer als iemand een pagina bekijkt. Stuk makkelijker.

Wat je ook kan doen is een teller-tabel aanmaken en iedere keer een insert doen met de laatste tijd. Dit is trager dan de bovenstaande maar meer gedetaileerd. Eventueel zou je ook andere gegevens bij kunnen houden dan, zoals welke pagina, browser-gegevens, etc.

Copy.com


Acties:
  • 0 Henk 'm!

  • disjfa
  • Registratie: April 2001
  • Laatst online: 03-07 14:47

disjfa

be

Maak dan een kolom genaamd "datum" en gebruik bv een datetime.

Dan kan je naderhand alles ophalen wat je maar wilt en op welke datum je maar wilt. Sorteren op datums en alles wat je eigenlijk maar zou willen.

disjfa - disj·fa (meneer)
disjfa.nl


Acties:
  • 0 Henk 'm!

  • NMe
  • Registratie: Februari 2004
  • Laatst online: 09-09 13:58

NMe

Quia Ego Sic Dico.

Maxman1850 schreef op dinsdag 11 augustus 2009 @ 13:57:
Omdat ik per dag het aantal bezoekers in de database zet, dus ik moet wel zien terug te vinden in de kolomnaam om welke dag het gaat.
Zie mijn post en mijn edit. Je slaat gewoon de datum op in een datumveld zoals dat bedoeld is. Je kan die vervolgens erg makkelijk ophalen met een WHERE DatumVeld = '2009-08-11' of zelfs een WHERE DatumVeld BETWEEN '2009-01-01' AND '2009-01-31' om bij mijn voorbeeld van hierboven te blijven...
sariel schreef op dinsdag 11 augustus 2009 @ 13:57:
Maak een teller-tabel aan met slechts 1 veld, een integer. Die integer verhoog je met een update gewoon iedere keer als iemand een pagina bekijkt. Stuk makkelijker.
En hoe zie je dat dan per dag? En waarom zou je dat niet gewoon met een COUNT doen? De meeste sites zijn niet zó druk bezocht dat dat de performance drukt...

[ Voor 28% gewijzigd door NMe op 11-08-2009 14:00 ]

'E's fighting in there!' he stuttered, grabbing the captain's arm.
'All by himself?' said the captain.
'No, with everyone!' shouted Nobby, hopping from one foot to the other.


Acties:
  • 0 Henk 'm!

  • cariolive23
  • Registratie: Januari 2007
  • Laatst online: 18-10-2024
Kortom, leer normaliseren. Dan had je nooit bedacht dat je iedere dag een nieuwe kolom zou moeten toevoegen. Gaat je ook niet lukken, vrijwel iedere database kent beperkingen op het maximaal aantal kolommen. En dat is ook geen probleem, je gaat (bij normaal gebruik) niet voor ieder record (daar hebben we het over) een nieuwe kolom of zelfs een nieuwe tabel aanmaken.

Wanneer tijdens het gebruik van de applicatie/het script het datamodel verandert, weet je vrijwel zeker dat je een kapitale fout hebt gemaakt.

Een tellertje bijhouden is evenmin noodzakelijk, databases kunnen uitstekend tellen. Dat hoef jij niet te doen.

Acties:
  • 0 Henk 'm!

  • Maxman1850
  • Registratie: Augustus 2009
  • Niet online
Ooooh, nu snap ik wat jullie bedoelen, ik snapte dus niet wat je bedoelde met dat dynamische databaseontwerp, bedankt NMe!!!
Ik ga er meteen aan werken, bedankt!!!!

Acties:
  • 0 Henk 'm!

  • Enfer
  • Registratie: Februari 2004
  • Laatst online: 18-09 16:32
NMe schreef op dinsdag 11 augustus 2009 @ 13:54:
Datums en getallen in kolomnamen zijn in 99,9999% van de gevallen een teken van rampzalig slecht databaseontwerp!

Sorry, die moest even heel duidelijk geroepen worden. :P Als je een kolom wil maken per datum dan ben je zeer waarschijnlijk verkeerd bezig. Doorgaans kan wat jij wil ook met een koppeltabel of misschien zelfs zonder, afhankelijk van wat je precies wil. Maar een steeds maar groeiende/veranderende database databaselayout is het foutste en minst onderhoudbare dat je kan doen.

Ter illustratie: schrijf voor mij eens een query die alle records ophaalt uit de maand januari van dit jaar, ongeacht de precieze datum. Gaat je niet lukken zonder 31 kolommen tweemaal uit te schrijven in je query. ;)
offtopic:
Daarvoor heb je een programmeertaal >:)

code:
1
2
3
4
5
6
7
8
9
10
<?php
$query = "SELECT ";
$dag = 1;
while( $dag < 32 ){
 $query .= $dag++ . "-01,";
}
//laatste komma stippen code
$query = stripLastComma( $query ); //made up
$query.= " FROM tabel";
?>

offtopic:
Just kidding natuurlijk :+


Mee eens met de meeste anderen hier. Lees een goed boek over MySQL, doe een paar voorbeelden / tutorials, want zo gaat het nog niet echt lukken.

Acties:
  • 0 Henk 'm!

  • NMe
  • Registratie: Februari 2004
  • Laatst online: 09-09 13:58

NMe

Quia Ego Sic Dico.

Enfer schreef op dinsdag 11 augustus 2009 @ 14:28:
[...]

offtopic:
Daarvoor heb je een programmeertaal >:)

code:
1
2
3
4
5
6
7
8
9
10
<?php
$query = "SELECT ";
$dag = 1;
while( $dag < 32 ){
 $query .= $dag++ . "-01,";
}
//laatste komma stippen code
$query = stripLastComma( $query ); //made up
$query.= " FROM tabel";
?>

offtopic:
Just kidding natuurlijk :+
Niet compleet ook, want daarmee haal je alsnog alle records op. ;) Je zal ook nog eens in je where moeten kijken dat er tenminste één van die velden niet leeg is. :P

'E's fighting in there!' he stuttered, grabbing the captain's arm.
'All by himself?' said the captain.
'No, with everyone!' shouted Nobby, hopping from one foot to the other.


Acties:
  • 0 Henk 'm!

  • Yoozer
  • Registratie: Februari 2001
  • Laatst online: 03-08 17:53

Yoozer

minimoog

Oh, maar ik snap precies wat je aan het doen bent. Deze techniek heet perpendicular tables. Het is goed dat je MySQL hebt - dat heeft namelijk ondersteuning voor tabellen met 4096 kolommen.

Je zult dan wel eens in de 12 jaar (11.91) je tabel leeg moeten gooien, maar daarvoor kun je een check doen om te kijken of je al zoveel kolommen hebt. Schrijf dan een functie die weer een nieuwe tabel aanmaakt, met bijv. de naam teller_1.

[ Voor 9% gewijzigd door Yoozer op 11-08-2009 15:13 ]

teveel zooi, te weinig tijd


Acties:
  • 0 Henk 'm!

  • Noork
  • Registratie: Juni 2001
  • Niet online
Yoozer schreef op dinsdag 11 augustus 2009 @ 15:12:
Oh, maar ik snap precies wat je aan het doen bent. Deze techniek heet perpendicular tables. Het is goed dat je MySQL hebt - dat heeft namelijk ondersteuning voor tabellen met 4096 kolommen.

Je zult dan wel eens in de 12 jaar (11.91) je tabel leeg moeten gooien, maar daarvoor kun je een check doen om te kijken of je al zoveel kolommen hebt. Schrijf dan een functie die weer een nieuwe tabel aanmaakt, met bijv. de naam teller_1.
:') Geweldige oplossing.

Acties:
  • 0 Henk 'm!

  • cariolive23
  • Registratie: Januari 2007
  • Laatst online: 18-10-2024
Het is goed dat je MySQL hebt - dat heeft namelijk ondersteuning voor tabellen met 4096 kolommen.
Het begrip "goed" zal ik hier niet ter discussie stellen (we hebben het hier over MySQL...), die 4096 kolommen wel. Het maximum aantal kolommen is namelijk afhankelijk van de data die je in de kolommen wilt gaan opslaan. Zie de uitleg van MySQL , dan kun je zelf gaan berekenen wat in jouw situatie het maximaal aantal kolommen is.

Acties:
  • 0 Henk 'm!

Verwijderd

Volgens mij moet je je sarcasme-meter even activeren :)

Acties:
  • 0 Henk 'm!

  • Noork
  • Registratie: Juni 2001
  • Niet online
Verwijderd schreef op dinsdag 11 augustus 2009 @ 15:25:
[...]

Volgens mij moet je je sarcasme-meter even activeren :)
orly? :p

Acties:
  • 0 Henk 'm!

  • Morrar
  • Registratie: Juni 2002
  • Laatst online: 12:59
Mocht het nog niet overduidelijk zijn; je maakt dus een tabel met twee kolommen

Tabel: bezoekers
datumaantal_bezoekers
2009-09-112

Vervolgens doe je in je PHP script de volgende 2 stappen:

Stap 1) Met SQL zoek je of er een record in de tabel staat van de huidige dag:
SELECT `aantal_bezoekers` FROM `bezoekers` WHERE `datum` = '2009-09-11'

Als dat record er is krijg je nu meteen het aantal bezoekers terug, als dat niet zo is krijg je een leeg resultaat terug. Voor het voorbeeld slaan we het bezoekersaantal in PHP even op in een variabele $aantal

Vervolgens doe je:

Stap 2a) Als de SQL een resultaatset teruggeeft, verhoog $aantal met 1 en doe de volgende query:
UPDATE `bezoekers` SET `aantal_bezoekers` = ' . $aantal . ' WHERE `datum` = '20009-09-11'

Stap 2b) Als de SQL geen resultaatset teruggeeft:
INSERT INTO `bezoekers` VALUES ('2009-09-11', 1)\

De datum kun je natuurlijk heel makkelijk variabel maken door deze in PHP in een variabele te stoppen en deze in je query te gebruiken.

Edit: Table-tag... zo handig 8)7

[ Voor 21% gewijzigd door Morrar op 11-08-2009 15:48 ]


Acties:
  • 0 Henk 'm!

  • MueR
  • Registratie: Januari 2004
  • Laatst online: 13:47

MueR

Admin Tweakers Discord

is niet lief

Je zou stappen 2a en 2b ook gewoon kunnen oplossen door zoiets als INSERT ... ON DUPLICATE KEY te gebruiken. In hoeverre het goed is, meh.

Anyone who gets in between me and my morning coffee should be insecure.


Acties:
  • 0 Henk 'm!

  • Yoozer
  • Registratie: Februari 2001
  • Laatst online: 03-08 17:53

Yoozer

minimoog

Bedankt, u was een geweldig publiek :P.
Morrar schreef op dinsdag 11 augustus 2009 @ 15:42:
Vervolgens doe je in je PHP script de volgende 2 stappen:
Veel te veel werk. Gewoon dom in een tabel inserten met een keiharde timestamp en aan het eind van de dag condenseren. Waar je in geinteresseerd bent zijn lokale pieken (e.g. wanneer werd ik geslashdot?) en dan mag je aan het eind van de dag over de tabel heenrennen om een drilldown te maken - GROUP BY HOUR(date) en zo.

Vervolgens gooi je -dat- in een grafiek en mik je de tabel voor die datums leeg. Compact, snel, en gedetailleerd. Aan de andere kant ben je dan het wiel weer opnieuw aan het uitvinden, omdat AWStats en Google Analytics het beter doen. Kan de topicstarter ook meer focussen op de zaken waar 'ie wel goed in is (en ik mag hopen dat dat webdesign of e-business is).

[ Voor 4% gewijzigd door Yoozer op 11-08-2009 15:50 ]

teveel zooi, te weinig tijd


Acties:
  • 0 Henk 'm!

  • MueR
  • Registratie: Januari 2004
  • Laatst online: 13:47

MueR

Admin Tweakers Discord

is niet lief

Yoozer schreef op dinsdag 11 augustus 2009 @ 15:48:
(e.g. wanneer werd ik geslashdot?)
Dat merk je met dit soort code aan de downtime van de server :Y)

Anyone who gets in between me and my morning coffee should be insecure.


Acties:
  • 0 Henk 'm!

  • Maxman1850
  • Registratie: Augustus 2009
  • Niet online
Mocht het nog niet overduidelijk zijn
Zoals in mijn eerdere post, is het me wel duidelijk (klik)
Pagina: 1