29. oktober 2006 - 14:51Der er
14 kommentarer og 1 løsning
Fejl i MYSQL Syntax efter serverskifte
Hej. Efter at jeg har skiftet til anden server (one.com), har jeg et enkelt "udtræk", der giver fejl: Jeg får følgende fejl:
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 '(CONCAT(start_d, '/', start_m, '/', start_aar), '%d/%m/%Y') > D
Koden ser sådan her ud:
$query = mysql_query("SELECT * FROM kalender_aftale Where elektronisk = '1' AND STR_TO_DATE(CONCAT(start_d, '/', start_m, '/', start_aar), '%d/%m/%Y') > DATE_ADD(now(), INTERVAL -60 DAY) ORDER BY start_aar DESC, start_m DESC, start_d DESC");
De 3 felter "start_d", "Start_m", "start_aar" er alle 3 af typen Int(11) og har hhv. værdier som dato, måned og år.
Blot til orientering: det er ikke CONCAT der er problemet - det er derimord STR_TO_DATE, da denne først kom i 4.1.1.
Hvad med at udelade den konvertering og så i stedet bare bruge det "rigtige" format, nemlig YYYY-MM-DD? MySQL skulle nok kunne finde ud af det på den måde:
SELECT * FROM kalender_aftale Where elektronisk = '1' AND CONCAT(start_aar, '-', start_m, '-', start_d) > DATE_ADD(now(), INTERVAL -60 DAY) ORDER BY start_aar DESC, start_m DESC, start_d DESC
Dette forudsætter så at måned og dag altid er skrevet med to cifre, ellers skal der lidt mere til - noget i denne stil (dog utestet):
SELECT * FROM kalender_aftale Where elektronisk = '1' AND CONCAT(start_aar, '-', CASE start_m>9 THEN '0' ELSE '' END, start_m, '-', CASE start_d>9 THEN '0' ELSE '' END, start_d) > DATE_ADD(now(), INTERVAL -60 DAY) ORDER BY start_aar DESC, start_m DESC, start_d DESC
Har prøvet med pidgeot's forslag, men får følgende fejl:
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 'THEN '0' ELSE '' END, start_m, '-', CASE start_d>9 THEN '0' ELS
Ah, min fejl - er ikek vant til at arbejde med CASE i SQL, så der manglede lige et ord.
Det må i stedet skulle være følgende: SELECT * FROM kalender_aftale Where elektronisk = '1' AND CONCAT(start_aar, '-', CASE WHEN start_m>9 THEN '0' ELSE '' END, start_m, '-', CASE WHEN start_d>9 THEN '0' ELSE '' END, start_d) > DATE_ADD(now(), INTERVAL -60 DAY) ORDER BY start_aar DESC, start_m DESC, start_d DESC
Tak fordi du giver dig tid til at hjælpe mig:) Nu virker det næsten, men det lader ikke til at Intervallet ikke virker korrekt. Jeg har nemlig 3 poster, der ikke kommer med i udtrækket. Datoerne er: 17-11-2006, 02-12-2006 og 15-12-2006. Det er i øvrigt de eneste poster fra november og december måned. Derudover kommer "gamle" aftaler også med. Meningen er at den skal vise alle poster med udgangspunkt i dagsdato minus 60 dage svarende til ca. d. 01-09-2006 og fremefter. Altså udtrækket skal vise alle aftaler fra 01-09-2006 og fremefter.
Håber du kan se en løsning, da jeg ikke kan gennemskue det.
Der må jeg desværre lige melde pas. Den eneste måde jeg kan se det gå galt på er hvis der står noget forkert i et af felterne, eller året er skrevet med 2 cifre (omend det ikke helt forklarer de gamle).
Overvej evt. at skifte det hele ud med et enkelt DATE-felt, det bliver nok nemmere at arbejde med.
Jeg har testet en hel del her til morgen og tjekket lidt: 1. Alle årstal er med 4 cifte 2. Alle datoer eller måneder er 1 eller 2 cifre (ingen foranstillet "0") 3. Jeg har oprettet mange flere poster. Poster med datoer fra 01-10-2006 til 31-12-2006 kommer ikke med i udtrækket. Altså oktober, november og december i 2006 kommer ikke med, men poster fra samme måneder i 2007 kommerr med. 4. Jeg har prøvet at udskifte "DATE_ADD(now(), INTERVAL -60 DAY)" med " '2006-10-15' ". Det er fortsat alle poster der trækkes ud, bortset fra aftaler i måned 10,11 og 12 2006. Samme resultat hvis jeg bruger datoen " '2006-08-08' "
Håber at du vil tjekke 1 gang mere, da jeg ikke ved, hvad jeg ellers skal gøre?
PS. Jeg er godt klar over, at det er nemmere med et enkelt DATE-felt. Men der er tale om et færdig programmeret kalender- og bookingsystem på flere tusinde kodelinjer - det kan jeg slet ikke overskue, at skulle ændre.
Jeg er stadig lidt usikker på koden, men når du i koden sætter et '0', er det så ikke på de datoer/måneder der på 1 cifre. Jeg vil derfor mene, at koden skal være sådan her for at foranstille '0':
Ah, for pokker - jo, selvfølgelig er det sådan det skal være :)
SELECT * FROM kalender_aftale Where elektronisk = '1' AND CONCAT(start_aar, '-', CASE WHEN start_m<=9 THEN '0' ELSE '' END, start_m, '-', CASE WHEN start_d<=9 THEN '0' ELSE '' END, start_d) > DATE_ADD(now(), INTERVAL -60 DAY) ORDER BY start_aar DESC, start_m DESC, start_d DESC
Jamen - din hjælp har nu været rigtig god. Tusind tak for dine input. Sender du et svar!
PS. Jeg vælger nok at lave et datofelt i MySQL. Jeg behøver jo ikke, at ændre alt kode, da jeg blot i PHP kan sammensætte datoen og smide din i et nyt datofelt i Mysql. Så bliver det noget mere enkelt at lave "Select" fremover.
Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.