jaartal uit form in sql zoeken

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

  • efan
  • Registratie: Januari 2001
  • Niet online
ik heb een tabel order en wil via een formulier een jaartal invullen, zodat daarmee alleen resultaten uit de database worden weergegeven met dat ingevulde jaartal. de datums in de tabel order staan in een textveld, in een kolom genaamd indatum.

bovenin mn index.php heb ik de volgende regel:
<?$jaartal=$_REQUEST['jaartal'];?>

daarna het formulier:
<form action="index.php" name="jaartalForm">
Jaar: <input type="text" name="jaartal" value="<?=$jaartal?>">
<input type="submit" value="OK" />
</form>

en de volgende sql query:
$getOrders = mysql_query("SELECT * FROM order WHERE 'indatum' LIKE '%$jaartal'"); if(mysql_num_rows($getOrders) > 0)
{ lap met code om alle resultaten te laten zien}
else { echo 'Geen open orders gevonden in de database.';}

Hiermee krijg ik echter geen enkel resultaat? Wat doe ik nu mis en wie kan me op weg helpen?

Acties:
  • 0 Henk 'm!

  • Icekiller2k6
  • Registratie: Februari 2005
  • Laatst online: 11-09 22:37
doe eens het volgende:
PHP:
1
2
3
4
5
$query="SELECT * FROM order WHERE 'indatum' LIKE '%$jaartal'";
echo $query;
$getOrders = mysql_query($query); if(mysql_num_rows($getOrders) > 0)
{ lap met code om alle resultaten te laten zien}
else { echo 'Geen open orders gevonden in de database.';}



en zeg me eens wat hij daar heeft staan?
(trouwens de datum wordt in de database opgeslagen als 2010-12-30 bv dus zou het $jaartal% moeten zijn..)

MT Venus E 5KW (V151) P1 HomeWizard | Hackerspace Brixel te Hasselt (BE) - http://www.brixel.be | 9800X3D, 96GB DDR5 6000MHZ, NVIDIA GEFORCE 4090, ASRock X670E Steel Legend, Seasonic GX1000


Acties:
  • 0 Henk 'm!

  • Mercatres
  • Registratie: September 2009
  • Laatst online: 11-09 12:17
Gebruik eens
PHP:
1
mysql_query($query) or die(mysql_error());

en kijk dan of er überhaupt wel iets gebeurt.

[ Voor 6% gewijzigd door Mercatres op 02-03-2011 15:40 . Reden: mysql_error() vergeten toe te voegen :( ]


Acties:
  • 0 Henk 'm!

  • KennieNL
  • Registratie: Mei 2007
  • Laatst online: 10-09 22:39
indatum behandel je hier als string omdat er quote teken omstaat, dus dat geeft idd geen resultaat.

try
PHP:
1
$query="SELECT * FROM order WHERE indatum LIKE '%$jaartal'";


is het niet verstandiger indatum als timestamp te defineren en dan YEAR gebruiken?

Acties:
  • 0 Henk 'm!

Verwijderd

Ik gebruik geen php maar kent deze geen sql parameters? SQL injectie is dan ook niet mogelijk en dat zou nu wel kunnen.

Acties:
  • 0 Henk 'm!

  • efan
  • Registratie: Januari 2001
  • Niet online
OK, volgens hetgeen van Icekiller2k6: hiermee krijg ik niks te zien.
volgens hetgeen van Mercatres: dan crash de pagina, met http-fout 500 volgens Chrome
hetgeen van KennieNL heb ik inderdaad veranderd naar indatum in plaats van 'indatum' maar levert helaas ook niks op.
Klopt het bij de form dat ik action="index.php" moet hebben of moet ik action="post" gebruiken?

Acties:
  • 0 Henk 'm!

  • efan
  • Registratie: Januari 2001
  • Niet online
Verwijderd schreef op woensdag 02 maart 2011 @ 13:53:
Ik gebruik geen php maar kent deze geen sql parameters? SQL injectie is dan ook niet mogelijk en dat zou nu wel kunnen.
hoe bedoel je dit precies?

Acties:
  • 0 Henk 'm!

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

NMe

Quia Ego Sic Dico.

LIKE werkt niet op velden met het type DATE.

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

  • efan
  • Registratie: Januari 2001
  • Niet online
NMe schreef op woensdag 02 maart 2011 @ 14:01:
LIKE werkt niet op velden met het type DATE.
het is geen type DATE maar gewoon text :) als ik via phpmyadmin kijk, dan staat er achter indatum varchar(255)

[ Voor 14% gewijzigd door efan op 02-03-2011 14:06 ]


Acties:
  • 0 Henk 'm!

  • ShitHappens
  • Registratie: Juli 2008
  • Laatst online: 15:16
ido schreef op woensdag 02 maart 2011 @ 13:57:
OK, volgens hetgeen van Icekiller2k6: hiermee krijg ik niks te zien.
volgens hetgeen van Mercatres: dan crash de pagina, met http-fout 500 volgens Chrome
hetgeen van KennieNL heb ik inderdaad veranderd naar indatum in plaats van 'indatum' maar levert helaas ook niks op.
Klopt het bij de form dat ik action="index.php" moet hebben of moet ik action="post" gebruiken?
method="post" en action="de-naam-van-het-bestand-dat-de-afhandeling-verzorgt-(in dit geval dezelfde naam als het bestand waar het form in staat)"

Acties:
  • 0 Henk 'm!

  • Icekiller2k6
  • Registratie: Februari 2005
  • Laatst online: 11-09 22:37
geef eens je email adres ofzo..

method moet POST zijn
ophalen mbv $_POST['varnaam']

mogen we weten WAT er in indatum staat? een voorbeeld,


als je niets krijgt met echo $query doe dan eens echo "Hier staat een query: ".$query."<br />";


edit:
Neen.. method is POST of GET.. post is mbv een "sessie" om het zo maar te noemen en GET via de url..

action is de pagina waar je naar toegaat wanneer je op submit klikt.
als je echo $_POST['jaartal'] doet krijg je dan wel wat?

[ Voor 110% gewijzigd door Icekiller2k6 op 02-03-2011 14:15 ]

MT Venus E 5KW (V151) P1 HomeWizard | Hackerspace Brixel te Hasselt (BE) - http://www.brixel.be | 9800X3D, 96GB DDR5 6000MHZ, NVIDIA GEFORCE 4090, ASRock X670E Steel Legend, Seasonic GX1000


Acties:
  • 0 Henk 'm!

  • efan
  • Registratie: Januari 2001
  • Niet online
ShitHappens schreef op woensdag 02 maart 2011 @ 14:09:
[...]

method="post" en action="de-naam-van-het-bestand-dat-de-afhandeling-verzorgt-(in dit geval dezelfde naam als het bestand waar het form in staat)"
ja maar maakt dit in mijn geval nog uit? op beide manieren wordt de variabele $jaartal toch gevuld? Maar de sql query staat in hetzelfde bestand, dus ik geloof dat ik toch goed zit met method="index.php" ?

Acties:
  • 0 Henk 'm!

  • CptAwesome
  • Registratie: September 2010
  • Laatst online: 20-08 13:41
Zoals Mercatres al zegt is het handig om er "or die()" bij te zetten, verder is het ook handig als je daarin nog: "mysql_error()" zet dus zo:
PHP:
1
 mysql_query($query) or die(mysql_error());

Als het bij de mysql fout gaat zal hij aangeven wat dat het probleem is en dat zou je een end verder moeten helpen.

Acties:
  • 0 Henk 'm!

  • Voutloos
  • Registratie: Januari 2002
  • Niet online
ido schreef op woensdag 02 maart 2011 @ 14:01:
[...]


het is geen type DATE maar gewoon text :) als ik via phpmyadmin kijk, dan staat er achter indatum varchar(255)
Dan is dat het echte probleem. Verbeter eerst maar het datatype.

{signature}


Acties:
  • 0 Henk 'm!

  • KennieNL
  • Registratie: Mei 2007
  • Laatst online: 10-09 22:39
Echo je query eens om te debuggen

PHP:
1
2
3
$query = "SELECT .....";
echo $query;
mysql_query($query) or die(mysql_error());


sowieso moet je je $_POST controleren of deze valid is, nu kan er natuurlijk alles mee gedaan/misbruikt worden ;)

Acties:
  • 0 Henk 'm!

  • efan
  • Registratie: Januari 2001
  • Niet online
Voutloos schreef op woensdag 02 maart 2011 @ 14:17:
[...]
Dan is dat het echte probleem. Verbeter eerst maar het datatype.
is het niet mogelijk dan om ondanks dat de datum als text staat, om daarin te zoeken of er in die text (bijv. 27-08-2009) of daar 2009 in voorkomt?

Acties:
  • 0 Henk 'm!

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

NMe

Quia Ego Sic Dico.

ido schreef op woensdag 02 maart 2011 @ 14:24:
[...]

is het niet mogelijk dan om ondanks dat de datum als text staat, om daarin te zoeken of er in die text (bijv. 27-08-2009) of daar 2009 in voorkomt?
Tuurlijk wel, maar stiekem denk ik dat YEAR(indatum) een stuk makkelijker is om op te zoeken en veel sneller gaat. Not to mention dat VARCHAR(255) wel héél erg ruim gekozen is voor een datum. En dan heb ik het nog niet over de mogelijkheid om incorrecte data op te slaan of zelfs compleet random strings...

Jouw probleem begint bij het verkeerde datatype, fix dat eerst maar eens. Welke functie je daarna nodig hebt zeg ik in de vorige paragraaf.

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

  • efan
  • Registratie: Januari 2001
  • Niet online
NMe schreef op woensdag 02 maart 2011 @ 14:35:
[...]

Tuurlijk wel, maar stiekem denk ik dat YEAR(indatum) een stuk makkelijker is om op te zoeken en veel sneller gaat. Not to mention dat VARCHAR(255) wel héél erg ruim gekozen is voor een datum. En dan heb ik het nog niet over de mogelijkheid om incorrecte data op te slaan of zelfs compleet random strings...

Jouw probleem begint bij het verkeerde datatype, fix dat eerst maar eens. Welke functie je daarna nodig hebt zeg ik in de vorige paragraaf.
Is dat achteraf nog aan te passen? Het is namelijk een bestaande (al behoorlijk) gevulde tabel die door iemand anders destijds is gemaakt en waar ik nu dus wil kunnen filteren op jaar. En zou je me mischien toch willen uitleggen hoe het nu eventueel wel mogelijk is?

[ Voor 5% gewijzigd door efan op 02-03-2011 14:41 ]


Acties:
  • 0 Henk 'm!

Verwijderd

ido schreef op woensdag 02 maart 2011 @ 13:58:
[...]


hoe bedoel je dit precies?
Als iemand in het invoerveld sql toevoegd ( SQL injection) dan wordt dit zo meegenomen in je SQL statement en dit is onveilig. Dus vroeg ik mij af of je ook een parameter kan aanmaken dus where veld = :parameter.

Acties:
  • 0 Henk 'm!

  • efan
  • Registratie: Januari 2001
  • Niet online
als ik het jaar zelf in de code "vast" zet , dan krijg ik wel alle resultaten te zien uit de databse uit het bijbehorende jaar:
$getOrders = mysql_query('SELECT * FROM `order` WHERE `uitdatum` LIKE "%2008"');

maar hoe krijg ik in plaats van de "%2008" de variabele $jaartal hierin? zodra ik dit probeer dan crasht het gelijk...

Acties:
  • 0 Henk 'm!

  • borft
  • Registratie: Januari 2002
  • Laatst online: 16:42
Misschien moet je eens een kijkje nemen op google, en zoeken naar prepared statements, sql injection, string escaping, input validation, etc.

een andere optie (aangezien het om een string gaat), is fatsoenlijke escaping te gebruiken.

dus bv:
PHP:
1
2
3
4
5
6
7
8
9
10
11
if ( array_key_exists('jaartal', $_POST) ){
  $jaartal = intval($_POST['jaartal']);
} else {
  $jaartal = date('Y');
}
$query = sprintf('SELECT * FROM `orders` WHERE uitdatum LIKE \'%%%d\'', mysql_real_escape_string($jaartal));
if ( !mysql_query($query) ){
  print "Query is gefaald!\n";
  print mysql_error();
  exit();
}


Overigens zou ik zelf sowieso je tabel aanpassen en de jusite datatypes aanpassen. Dat zorgt ervoor dat je makkelijker kunt queryen, je minder ruimte verspeelt, queries sneller worden (bv door de mogelijkheid van indeces), er minder kans is op verkeerde data is je db.

[ Voor 22% gewijzigd door borft op 02-03-2011 15:28 ]


Acties:
  • 0 Henk 'm!

  • Voutloos
  • Registratie: Januari 2002
  • Niet online
ido schreef op woensdag 02 maart 2011 @ 15:16:
maar hoe krijg ik in plaats van de "%2008" de variabele $jaartal hierin? zodra ik dit probeer dan crasht het gelijk...
1. Het is geen crash. 2. Wat staat er dan wel in de query?

{signature}


Acties:
  • 0 Henk 'm!

  • Mercatres
  • Registratie: September 2009
  • Laatst online: 11-09 12:17
Als ik jou was zou ik me nog een keer verdiepen in:
1. POST-variabelen
2. Forms verwerken
3. Datatypes in SQL en php.
4. SQL-injection

Acties:
  • 0 Henk 'm!

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

NMe

Quia Ego Sic Dico.

ido schreef op woensdag 02 maart 2011 @ 14:38:
[...]

Is dat achteraf nog aan te passen? Het is namelijk een bestaande (al behoorlijk) gevulde tabel die door iemand anders destijds is gemaakt en waar ik nu dus wil kunnen filteren op jaar.
Vrij simpel. Even een PHP-scriptje (of een SQL-query als je dat makkelijker vindt) schrijven die de volgorde verandert van dd-mm-yyyy naar yyyy-mm-dd, en vervolgens kun je zo het datatype omzetten als het goed is.
En zou je me mischien toch willen uitleggen hoe het nu eventueel wel mogelijk is?
Op de manier die je nu doet, maar dan wel ná het debuggen van wat er nu écht in je query terecht komt. Dus: druk je query af, en vertel ons eens wat daarin staat.

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

  • kluyze
  • Registratie: Augustus 2004
  • Niet online
ido schreef op woensdag 02 maart 2011 @ 13:32:
en de volgende sql query:
$getOrders = mysql_query("SELECT * FROM order WHERE 'indatum' LIKE '%$jaartal'");
die indatum staat die echt tussen single quotes? Of zijn dat ` (schuine) quotes (ik ken de naam niet) Als dat dezelfde single quotes zijn als rond %jaartal dan behandeld die dat als een string ipv. een kolom met de waarde. Veel kans dat de mysql_query functie daar ook een fout op genereert.

Acties:
  • 0 Henk 'm!

  • borft
  • Registratie: Januari 2002
  • Laatst online: 16:42
"schuine quotes" noem je backticks, en php behandelt het dan inderdaad als string literal. Tenzij het tussen dubbel quotes staat ;)

Acties:
  • 0 Henk 'm!

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

NMe

Quia Ego Sic Dico.

borft schreef op woensdag 02 maart 2011 @ 16:23:
"schuine quotes" noem je backticks, en php behandelt het dan inderdaad als string literal. Tenzij het tussen dubbel quotes staat ;)
PHP heeft er in dit geval niks mee te maken, MySQL wel. ;)

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

  • borft
  • Registratie: Januari 2002
  • Laatst online: 16:42
php heeft er alles mee te maken. Hij bouwt zijn query namelijk als een string op in php, waarbij ie voor de string double quotes gebruikt. Als hij daar single quotes had gebruikt, adn was dat een mogelijke reden waarom de variabele niet werkte.

Acties:
  • 0 Henk 'm!

  • Mercatres
  • Registratie: September 2009
  • Laatst online: 11-09 12:17
borft schreef op woensdag 02 maart 2011 @ 16:58:
php heeft er alles mee te maken. Hij bouwt zijn query namelijk als een string op in php, waarbij ie voor de string double quotes gebruikt. Als hij daar single quotes had gebruikt, adn was dat een mogelijke reden waarom de variabele niet werkte.
Wat?
Die string wordt gewoon naar de database gestuurd waar MySQL de verdere afhandeling doet. MySQL interpreteert dan de content tussen de single quotes als literal. In dat geval kan je veel beter backtiks (`) gebruiken (of niets).

http://dev.mysql.com/doc/refman/5.0/en/identifiers.html
http://dev.mysql.com/doc/refman/5.0/en/string-syntax.html
Pagina: 1