date() probleem
Stel de waarde van $_POST[maand] is 11.
Om een query uit te voeren heb ik de maand nodig met voorloopnul, onderstaand leek mij een geschikte manier.
$maand = date("m", mktime (0, 0, 0, $_POST[maand], 0, 0));
Echter, de waarde van $maand is nu 10. Bij iedere andere waarde van $_POST[maand] wordt de resultaat van $maand 1 waarde lager dan het zou moeten zijn.
Weet iemand wat er misgaat? Ik zou wellicht $_POSTmaand] + 1 neer kunnen zetten, maar dat vind ik geen oplossing.
Wim schreef op 05.12.2006 10:24:
Om een query uit te voeren heb ik de maand nodig met voorloopnul
Dan heb je vast geen DATE of DATETIME in je database gebruikt.
In de eerste plaats heb je helemaal geen voorloopnul nodig, tenminste niet wanneer jij de datum in een DATE of DATETIME hebt opgeslagen (heb je dat niet, dan heb je een veel groter probleem dan een lullige voorloopnul). En in de tweede plaats ga je echt geen datum-functies gebruiken om een getal (want dat is het) op te maken. In dit geval zou sprinf() je van dienst kunnen zijn:
Jij hebt dit echter helemaal niet nodig!
Probleem is dat mijn query alsvolgt wil uitvoeren:
SELECT * FROM table WHERE field='$_POST[field]' AND datum LIKE '$_POST[jaar]-$_POST[maand]-%' ORDER BY datum
Alleen dit geeft problemen bij maanden die overlappende getallen hebben, dus bijv. 1 en 11, daarom wil ik dus graag dat de waardes van de maandtallen onder de 10 een voorloopnul krijgen, dan heb ik dat probleem niet.
Ik zal eens naar sprintf() kijken. Ik ging er ook vanuit dat het anders zou moeten kunnen, maar ik kon er geen geschikte functie voor vinden.
Bedankt voor de reakties.
Wim schreef op 05.12.2006 10:44:
Niet doen!@Frank.
Ik zal eens naar sprintf() kijken. Ik ging er ook vanuit dat het anders zou moeten kunnen, maar ik kon er geen geschikte functie voor vinden.
Bedankt voor de reakties.
Ik zal eens naar sprintf() kijken. Ik ging er ook vanuit dat het anders zou moeten kunnen, maar ik kon er geen geschikte functie voor vinden.
Bedankt voor de reakties.
Ga niet lopen prutsen met een LIKE, gebruik de juiste datumfuncties. Zie ook hoofdstuk 12.5 van de MySQL-handleiding.
Edit: $_POST[field] is natuurlijk fout (zet de error_reporting maar eens op E_ALL), dat moet zijn $_POST['field']. Met quotes om de key van de array POST.
Edit 2: YEAR en MONTH aangepast, was de kolomnamen vergeten...
Gewijzigd op 01/01/1970 01:00:00 door Frank -
Maar in je voorbeeld ga je volgens mij uit van 2 velden, nl. year en month, ik heb enkel 1 datum veld in mijn db.
Maar ook op die manier zit ik volgens mij nog met die voorloopnul. Maar ik ga hfdstk 12.5 MySQL ook nog ff doorspitten.
FROM `table`
WHERE YEAR( table.datum ) = '2006'
AND MONTH( table.datum ) = '11'
LIMIT 0 , 30;
Dit is idd beter dat de LIKE variant.
Bedankt voor de tip Frank.
2006 en 11 hoeven/horen niet tussen quotes, het zijn integers en geen strings. Het gebruik van quotes is echter niet fout, hooguit overbodig.
Ik weet het zo ff niet zeker meer, maar ik kan me herinneren dat het niet gebruiken van quotes wel eens problemen geeft als je een spatie of ander "raar" teken moet gebruiken.
Maar voor die gevallen zou je dan natuurlijk een uitzondering kunnen maken.
Wim schreef op 05.12.2006 11:49:
Ik zou niet weten wat voor raar teken jij bij het jaartal of maandnummer neer zou willen zetten. Dit zal altijd een integer zijn, dat kan gewoon niet anders.Ik had de query getest in mysqladmin, die had de backtics er bij gezet. :)
Ik weet het zo ff niet zeker meer, maar ik kan me herinneren dat het niet gebruiken van quotes wel eens problemen geeft als je een spatie of ander "raar" teken moet gebruiken.
Maar voor die gevallen zou je dan natuurlijk een uitzondering kunnen maken.
Ik weet het zo ff niet zeker meer, maar ik kan me herinneren dat het niet gebruiken van quotes wel eens problemen geeft als je een spatie of ander "raar" teken moet gebruiken.
Maar voor die gevallen zou je dan natuurlijk een uitzondering kunnen maken.
En dat geldt ook voor andere integers, nadat jij het datamodel hebt opgesteld, is precies duidelijk welke kolommen een string bevatten en welke een integer. Een integer blijft altijd een integer en daar zullen nooit 'rare' tekens of spaties bij komen. Dat gaat gewoon niet omdat je dan plotseling een verandering van je datamodel zou hebben. En wanneer dat het geval is, dan heb je een enorm probleem!
Wim schreef op 05.12.2006 10:38:
Jawel, een DATE veld.
Probleem is dat mijn query alsvolgt wil uitvoeren:
SELECT * FROM table WHERE field='$_POST[field]' AND datum LIKE '$_POST[jaar]-$_POST[maand]-%' ORDER BY datum
Alleen dit geeft problemen bij maanden die overlappende getallen hebben, dus bijv. 1 en 11, daarom wil ik dus graag dat de waardes van de maandtallen onder de 10 een voorloopnul krijgen, dan heb ik dat probleem niet.
Probleem is dat mijn query alsvolgt wil uitvoeren:
SELECT * FROM table WHERE field='$_POST[field]' AND datum LIKE '$_POST[jaar]-$_POST[maand]-%' ORDER BY datum
Alleen dit geeft problemen bij maanden die overlappende getallen hebben, dus bijv. 1 en 11, daarom wil ik dus graag dat de waardes van de maandtallen onder de 10 een voorloopnul krijgen, dan heb ik dat probleem niet.
Ik heb een tabel waarop ik alleen de dingen vanaf de huidige maand wil zien, de maand is in mijn tabel een INT, en ik sorteer als volgt:
$ditjaar=date("Y");
$dezemaand=date("m");
$sql = "SELECT * FROM diensten WHERE (jaar>=$ditjaar AND maand>=$dezemaand) OR (jaar>$ditjaar) order BY jaar,maand,dag,tijd";
Vervolgens zet ik het getal van de maand gewoon om in de benaming:
switch ($maand) {
case '1':$maandnaam='januari';break;
case '2':$maandnaam='februari';break;
case '3':$maandnaam='maart';break;
case '4':$maandnaam='april';break;
case '5':$maandnaam='mei';break;
case '6':$maandnaam='juni';break;
case '7':$maandnaam='juli';break;
case '8':$maandnaam='augustus';break;
case '9':$maandnaam='september';break;
case '10':$maandnaam='oktober';break;
case '11':$maandnaam='november';break;
case '12':$maandnaam='december';break;
default :$maandnaam='n/a';break;
};
in de uitvoer op het scherm dus een echo "maandnaam";
Misschien zijn er veel andere optie, maar voor een INT in een tabel is een 1 iets anders dan een 11, dus probleem opgelost lijkt me.
Dan heb je dus een apostrophe in je query, en volgens mij ontkom je er dan niet aan om het tussen quotes te zetten, of mysql_escape_string te gebruiken. Maar dat laatste zou weer niet kunnen als je op de zoekterm "75%" zou zoeken.
Maar uiteraard, het is wel te vermijden, hetzij door mysql_escape_string of je datamodel.
Quote:
Dat doe je toch al, lijkt me dus geen enkel probleem. of mysql_escape_string te gebruiken
@Sankop: Een datum sla je op in een DATE of DATETIME. Niet in verschillende velden, ook niet wanneer je een INT gebruikt.
Nederlandse dag- en maandnamen kun je met de volgende query ophalen:
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
SELECT
CONCAT(
ELT(DAYOFWEEK(datum),
'zondag', 'maandag', 'dindsag', 'woensdag', 'donderdag', 'vrijdag', 'zaterdag'
),
' ',
DAYOFMONTH(datum),
' ',
ELT(MONTH(datum),
'januari', 'februari', 'maart', 'april', 'mei', 'juni', 'juli', 'augustus', 'september', 'oktober', 'november', 'december'
),
' ',
YEAR(datum)
)
FROM
tabelnaam
CONCAT(
ELT(DAYOFWEEK(datum),
'zondag', 'maandag', 'dindsag', 'woensdag', 'donderdag', 'vrijdag', 'zaterdag'
),
' ',
DAYOFMONTH(datum),
' ',
ELT(MONTH(datum),
'januari', 'februari', 'maart', 'april', 'mei', 'juni', 'juli', 'augustus', 'september', 'oktober', 'november', 'december'
),
' ',
YEAR(datum)
)
FROM
tabelnaam