[PHP/MySQL] mysql_real_escape_string met datum notatie

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

  • Swanfield
  • Registratie: Juni 2004
  • Laatst online: 23-06 13:57
Ik zit nu al een tijd vast op een overzichtsformuliertje. Hij werkt alleen moet ik in het zoekveld op datum moet ik zoeken op de volgende methode: Y-m-d. $q is mijn vraag zeg maar en deze is als volgt in een query gezet:
PHP:
1
2
3
$query="SELECT ...FROM .... 
                  WHERE table1.STARTTIME LIKE '%$q%'
      AND table1.STARTTIME>CURDATE();


Ik heb de query even verkort omdat deze werkt en er een hoop overbodige informatie instaat. Heb even alleen de stukjes gekozen die van toepassing zijn op dit probleem.

Voor $q geef ik ook nog op:
PHP:
1
$q=mysql_real_escape_string(date("Y-m-d", strtotime($_GET['q'])));


Als ik Y-m-d verander in d-m-Y dan zorgt dat er niet voor dat ik in het zoekveld d-m-Y in kan vullen. Het blijft dan zoeken op Y-m-d.
Het zoeken gaat dmv een javascript:
Java:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
var xmlHttp
function searchDate(str)
{
    xmlHttp=GetXmlHttpObject()
    if (xmlHttp==null)
    {
        alert ("Browser does not support HTTP Request")
        return
        }
        var url="searchresult4.php"
        url=url+"?q="+str
        url=url+"&sid="+Math.random()
        xmlHttp.onreadystatechange=stateChanged
        xmlHttp.open("GET",url,true)
        xmlHttp.send(null)
        } 


Wat ik graag zou willen weten is er misschien een optie in de javascript om de invoer te veranderen? Of kan mysql_real_escape_string wel gewoon om gaan met d-m-Y maar doe ik iets fout. Of is er iets anders wat niet klopt?
Mocht er nog informatie ontbreken dan kan ik die verstrekken uiteraard :)

Je hoeft niet goed te zijn om de beste te zijn, zolang je maar beter bent dan de rest || Het is niet belangrijk om te winnen, maar het is het enige dat telt


Acties:
  • 0 Henk 'm!

  • Creepy
  • Registratie: Juni 2001
  • Laatst online: 12:16

Creepy

Tactical Espionage Splatterer

Als je STARTTIME een datum veld is dan komt het zoeken met een LIKE wat vreemd op me over. Standaard in MySQL zul je in je query een datum altijd als yyy-mm-dd moeten neerzetten. Als je in een ander formaat je datum binnenkrijgt zul je deze dus zelf moeten omzetten naar yyyy-mm-dd.

"I had a problem, I solved it with regular expressions. Now I have two problems". That's shows a lack of appreciation for regular expressions: "I know have _star_ problems" --Kevlin Henney


Acties:
  • 0 Henk 'm!

  • gvdh
  • Registratie: December 2009
  • Nu online
Volgens mij is strtotime niet geschikt om gebruikersinvoer om te zetten naar een datum. Je zal op een of andere manier moeten controleren of de datum geldig is en deze omzetten naar yyyy-mm-dd.

Acties:
  • 0 Henk 'm!

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

NMe

Quia Ego Sic Dico.

Waarom zou je het in javascript omzetten? Dat wil je in PHP doen, waar je toch sowieso de invoer zou moeten checken. Verder slaat die LIKE zoals Creepy al zegt niet echt ergens op. ;)

'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!

  • Swanfield
  • Registratie: Juni 2004
  • Laatst online: 23-06 13:57
NMe schreef op vrijdag 07 mei 2010 @ 11:15:
Waarom zou je het in javascript omzetten? Dat wil je in PHP doen, waar je toch sowieso de invoer zou moeten checken. Verder slaat die LIKE zoals Creepy al zegt niet echt ergens op. ;)
Ik wil het idd in PHP maar heb te weinig kennis van Java om te kunnen beoordelen of het daar ook niet zou kunnen.
Wat zou ik verders kunnen gebruiken voor LIKE dan? De LIKE word nu, zover ik begrijp gebruikt om aan te geven dat STARTTIME $q is. Of begrijp ik het gewoon verkeer? :|

Je hoeft niet goed te zijn om de beste te zijn, zolang je maar beter bent dan de rest || Het is niet belangrijk om te winnen, maar het is het enige dat telt


Acties:
  • 0 Henk 'm!

  • Voutloos
  • Registratie: Januari 2002
  • Niet online
Dude javascript != java. En je wilt het sowieso serverside.

En 'is gelijk aan' in queries kan je gewoon met de = operator doen. ;)

{signature}


Acties:
  • 0 Henk 'm!

  • Swanfield
  • Registratie: Juni 2004
  • Laatst online: 23-06 13:57
Ok heb volgens mij de oplossing :) Zal wel een dirty oplossing zijn maar het lijkt te werken.
Java:
1
2
3
var xmlHttp
var searchDate=getDateFromFormat("dd-mm-yyyy") 
function searchDate(str)


Hopelijk is dit acceptable :)

Je hoeft niet goed te zijn om de beste te zijn, zolang je maar beter bent dan de rest || Het is niet belangrijk om te winnen, maar het is het enige dat telt


Acties:
  • 0 Henk 'm!

Verwijderd

De kern van je probleem zit in
PHP:
1
$q=mysql_real_escape_string(date("Y-m-d", strtotime($_GET['q'])));

Je zet eerst je invoer om m.b.v. strtotime(), deze geeft dus de eisen aan wat de gebruiker/javascript mag invoeren.
Daarna formatteer je dat naar een yyyy-mm-dd formaat m.b.v. date().
Tot slot doe je daar een mysql_real_escape_string() op, dat is niet zo zinnig, aangezien voorgaande functies al hebben gegeven dat het een datum formaat is.

Om je datum op andere wijze in te kunnen voeren zal je dus met de parameters van strtotime() moeten spelen, of een andere functie gebruiken. Let erop dat PHP 01-10-2010 als 10 januari, niet als 1 oktober zal interpreteren. Bovendien kan strtotime() ook de waarde FALSE teruggeven als het niet lukt de datum te interpreteren.

Ik zou trouwens bij je XmlRequest eerder kiezen om de datum mee te geven als data i.p.v. header:
JavaScript:
1
2
3
        xmlHttp.onreadystatechange=stateChanged 
        xmlHttp.open("GET","searchresult4.php",true) 
        xmlHttp.send(str)

En in PHP m.b.v. het header() commando er voor zorgen dat de pagina nooit uit cache gehaald wordt.

edit
Wat dacht je van strptime() gebruiken?
PHP:
1
$q=mysql_real_escape_string(date("Y-m-d", strptime($_GET['q'], "d-m-Y")));

[ Voor 6% gewijzigd door Verwijderd op 07-05-2010 12:15 ]


Acties:
  • 0 Henk 'm!

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

NMe

Quia Ego Sic Dico.

Damien2004 schreef op vrijdag 07 mei 2010 @ 12:08:
Ok heb volgens mij de oplossing :) Zal wel een dirty oplossing zijn maar het lijkt te werken.
Java:
1
2
3
var xmlHttp
var searchDate=getDateFromFormat("dd-mm-yyyy") 
function searchDate(str)


Hopelijk is dit acceptable :)
Nee, want je doet het alsnog alleen in javascript. Je hoort te checken in PHP. Wat nou als ik javascript uit heb staan en poep naar je server stuur? Gaat je hele applicatie over zijn nek. ;)

'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!

Verwijderd

NMe schreef op vrijdag 07 mei 2010 @ 12:31:
[...]

Nee, want je doet het alsnog alleen in javascript. Je hoort te checken in PHP. Wat nou als ik javascript uit heb staan en poep naar je server stuur? Gaat je hele applicatie over zijn nek. ;)
Ja, dat gaat dus niet he. Je kan niet javascript uitzetten en vervolgens XmlRequests versturen.

Acties:
  • 0 Henk 'm!

  • RobIII
  • Registratie: December 2001
  • Niet online

RobIII

Admin Devschuur®

^ Romeinse Ⅲ ja!

(overleden)
Verwijderd schreef op vrijdag 07 mei 2010 @ 12:32:
[...]

Ja, dat gaat dus niet he. Je kan niet javascript uitzetten en vervolgens XmlRequests versturen.
En wat nou als ik gewoon met (ik roep wat) Curl, VBScript, C# of hell, Telnet voor mijn part een HTTP request maak en daar eens leuke data mee ga sturen?

Never. Trust. (User). Input. PERIOD.

[ Voor 15% gewijzigd door RobIII op 07-05-2010 12:42 ]

There are only two hard problems in distributed systems: 2. Exactly-once delivery 1. Guaranteed order of messages 2. Exactly-once delivery.

Je eigen tweaker.me redirect

Over mij


Acties:
  • 0 Henk 'm!

Verwijderd

RobIII schreef op vrijdag 07 mei 2010 @ 12:36:
[...]

En wat nou als ik gewoon met (ik roep wat) Curl, VBScript, C# of whatever een HTTP request maak en daar eens leuke data mee ga sturen?

Never. Trust. (User). Input. PERIOD.
Klopt, daarom ga je het ook verder parsen met PHP, maar het heeft weinig zin om in je PHP nog te gaan controleren of de datum niet toevallig in m-d-Y formaat is, want je gaat er vanuit dat het in d-m-Y formaat is. Als iemand dan op de een of andere wijze 10-30-2010 doorgeeft (10e van de 30e maand) dan vang je dat gewoon af met PHP (bijvoorbeeld door de bovengenoemde strptime() die een FALSE teruggeeft).
Je kan malafide data erheen sturen, maar het enige wat je dan hoeft te doen is zeggen dat je de data niet snapt. Als iemand de gewone interface gebruikt mag je er dus vanuit gaan dat er niet tegelijk javascript uit staat en XmlRequest aan, gewoon omdat het niet kan!

Acties:
  • 0 Henk 'm!

  • Swanfield
  • Registratie: Juni 2004
  • Laatst online: 23-06 13:57
Het stukje java is eigenlijk voor Livesearch. Dus direct bij het invullen van je zoekterm resultaat tonen. Voor zover ik begrepen heb gaat dit alleen via java/ajax/ect maar niet met PHP.
Als ik dit verkeerd heb dan word ik graag gewezen op een PHP oplossing :)

Je hoeft niet goed te zijn om de beste te zijn, zolang je maar beter bent dan de rest || Het is niet belangrijk om te winnen, maar het is het enige dat telt


Acties:
  • 0 Henk 'm!

  • Serenity
  • Registratie: Oktober 2005
  • Laatst online: 14-01-2023
Zoals Voutloos zei, Java != JavaScript :)

Anyway, JS zoekt niet, dat doet je PHP-script. Zie je JS gewoon als doorgeefluik: iemand zoekt; met JS roep je je PHP-script aan en stuur je de zoekvariabelen mee; in PHP valideer je de variabelen, voer je het zoeken uit, en geef je het gepaste resultaat terug; het JS script ontvangt wat het PHP-script teruggeeft en hier doe je iets mee (zoekresultaten weergeven of een error aan de user dat z'n input niet klopt).

Edit: je kunt natuurlijk in JS al wel de datum of whatever controleren met een simpele check, zodat je heel het PHP-script niet aan hoeft te roepen als je al weet dat het formaat van de datum niet klopt. Dan geef je dit direct terug als melding aan de user zodat dit aangepast kan worden. Maar zoals hiervoor al wordt aangegeven door anderen, er zijn veel manieren om custom scripts naar jouw server te sturen, iets waar je geen controle over hebt. Dus ook al doe je een simpele check in jouw eigen JavaScript, dit wil niet zeggen dat die check altijd volstaat of gebruikt wordt. Zodra er data bij je PHP-script binnenkomt moet je dit dus áltijd opnieuw checken.

[ Voor 41% gewijzigd door Serenity op 07-05-2010 13:11 ]


Acties:
  • 0 Henk 'm!

  • Voutloos
  • Registratie: Januari 2002
  • Niet online
Je hebt alles verkeerd begrepen.

Javascript != Java (nogmaals :X ), clientside != serverside, PHP krijgt toch echt input en die moet je echt controleren.

Lees je aub even in, want je mist dusdanig veel basiskennis dat je een kant en klare PHP oplossing ook niet zou begrijpen.

{signature}

Pagina: 1