zoeken in mysql database
Ik ben op zoek een scriptje waarmee ik kan zoeken in een mysql databas. Ik heb een database waarin allemaal prijzen staan. b.v. €10 , €17,50 etc. Nu zou ik willen dat er met een zoekfunctie gezocht kan worden, en dann dat iemand b.v. ingeeft dat hij iets zoekt van minder dan €20 en dat hij dan die 2 resultaten krijgt. Hoe kan ik dat doen ?
Ik hoop dat je je bedragen opslaat als int (dus bedrag * 100) of als decimal?
In ieder geval dus niet met het € erbij.
je kan dan in iedergeval een sql select doen met een where statement:
SELECT kolom_namen FROM tabel_naam WHERE price < --GIVENPRICE--
Dus:
je maakte een form waarbij je action post is.
je hebt een dropdownlist met maxprices (of invulveld).
je hebt een dropdownlist met minprices (of invulveld).
(wil je geen min laat dit scirpt 't altijd 0 - best is wel het te verwijderen uit de sql, onnodig opzoekwerk voor je server enzo)
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
<?php
$maxprice = mysql_real_escape_string($_POST['maxPrice']);
$maxprice = $maxprice?$maxprice:0;
$minprice = (mysql_real_escape_string($_POST['minPrice']);
$maxprice = $minprice?$minprice:0;
if (is_numeric($maxprice) && is_numeric($minprice))
{
/*put you db conn here*/
$link = mysql_connect('localhost', 'mysql_user', 'mysql_password');
/*put you db conn above*/
if (!$link) {
die('Could not connect: ' . mysql_error());
}
$selectItemsForRightPrice = "SELECT itemId, price FROM itemPrices WHERE price < ".$maxprice." AND price > ".$minprice;
$resultItemsForRightPrice = mysql_fetch(selectItemsForRightPrice);
if (!$result)
{
die('Could not query:' . mysql_error());
}
if (mysql_num_rows($result) == 0)
{
echo "No rows found, nothing to print so am exiting";
exit;
}
while ($row = mysql_fetch_assoc($result))
{
echo "the item ".$row["itemId"]." costs "..$row["price "];
}
mysql_close($link);
unset($selectItemsForRightPrice );
unset($result);
unset($row );
}
else
{
echo "you naugthy boy";
}
?>
$maxprice = mysql_real_escape_string($_POST['maxPrice']);
$maxprice = $maxprice?$maxprice:0;
$minprice = (mysql_real_escape_string($_POST['minPrice']);
$maxprice = $minprice?$minprice:0;
if (is_numeric($maxprice) && is_numeric($minprice))
{
/*put you db conn here*/
$link = mysql_connect('localhost', 'mysql_user', 'mysql_password');
/*put you db conn above*/
if (!$link) {
die('Could not connect: ' . mysql_error());
}
$selectItemsForRightPrice = "SELECT itemId, price FROM itemPrices WHERE price < ".$maxprice." AND price > ".$minprice;
$resultItemsForRightPrice = mysql_fetch(selectItemsForRightPrice);
if (!$result)
{
die('Could not query:' . mysql_error());
}
if (mysql_num_rows($result) == 0)
{
echo "No rows found, nothing to print so am exiting";
exit;
}
while ($row = mysql_fetch_assoc($result))
{
echo "the item ".$row["itemId"]." costs "..$row["price "];
}
mysql_close($link);
unset($selectItemsForRightPrice );
unset($result);
unset($row );
}
else
{
echo "you naugthy boy";
}
?>
Zo, ik hoop dat dit je verder helpt.
Cha Né
Gewijzigd op 01/01/1970 01:00:00 door Sven
Thanks ! ziet er goed uit zo. Heb de getallen nu helaas nog met € erbij opgeslagen. dit moet dus anders. Alleen mijn vraag is jij geeft aan dit als int te doen en en dan *100. Wat bedoel je daar precies mee ?
Ik denk dat hij bedoelt dat je het als centen gaat opslaan. Stel je hebt 1 euro * 100 = 100 cent ;)
http://dev.mysql.com/doc/refman/5.1/en/comparison-operators.html#operator_between
Hier zie je dat je kan zoeken tussen 2 waarden bv prijs BETWEEN 0 AND 20 of BETWEEN 20 AND 50
ook kan WHERE prijs < 20 de juiste resultaten geven..
Nog even één vraagje. Ik zou eigenlijk ook willen dat hij nog een andere kolom erbij neemt. Dus je hebt nu prijs tussen de 10 en 20 bijvoorbeeld. En dat hij dan uit de kolom "retentie" ook weer kan kiesen tussen 50 en 100 of tussen 100 en 200 etc. Hoe kan ik dat dan doen ?
Gewijzigd op 01/01/1970 01:00:00 door roy marijnissen
Je wil dus bij prijs zeggen tussen de 10 en 20
en bij retentie tussen de 50 en 100?
Als ik het goed begrijp krijg je ongeveer zo:
WHERE (prijs BETWEEN 10 AND 20) AND (retentie BETWEEN 50 AND 100)
Ik dacht dat het ongeveer zo was.
dat is idd precies wat ik bedoelde. Bedankt !
edit: ben niet heel goed met ternary operators, dus schrijf beginnetje even iets uitgebreider, maar is misschien ook wat makkelijker te begrijpen. edit2 bevat goede versie
edit2:
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
<?php
/*Hier uitgaande van een apart bestand waar de connectie gemaakt word*/
require_once "connect_db.php";
/* Als de maximale prijs of minimale prijs niet gegeven is de prijs op 0 zetten*/
if(empty($_POST['maxprice'])){
$_POST['maxprice'] = 0;
}
if(empty($_POST['minprice'])){
$_POST['minprice'] = 0;
}
/*Als de variabelen niet numeriek zijn, dit melden*/
if (!is_numeric($_POST['maxprice') OR !is_numeric($_POST['minprice')){
echo 'De opgegeven waarden zijn niet numeriek, probeer opnieuw.';
}
else {
/* Query opbouwen met de gegevens*/
$sql = "SELECT itemID, price FROM itemPrices WHERE price < ".mysql_real_escape_string($_POST['maxprice'])." AND price > ".mysql_real_escape_string($_POST['minprice'])."";
$result = mysql_query($sql);
/* Als query mislukt is dit melden*/
if(!$result){
trigger_error(mysql_error());
}
else {
$count = mysql_num_rows($result);
/* Als query gelukt is, maar er geen rijen zijn, dit melden*/
if($count == 0){
echo 'Geen resultaten gevonden helaas. Probeer opnieuw.';
}
else {
/* Het resultaat laten zien*/
while($rows = mysql_fetch_assoc($result)){
echo 'Het artikel '.$rows['itemId'].' kost '.$rows['price'].'<br />';
}
}
}
}
?>
/*Hier uitgaande van een apart bestand waar de connectie gemaakt word*/
require_once "connect_db.php";
/* Als de maximale prijs of minimale prijs niet gegeven is de prijs op 0 zetten*/
if(empty($_POST['maxprice'])){
$_POST['maxprice'] = 0;
}
if(empty($_POST['minprice'])){
$_POST['minprice'] = 0;
}
/*Als de variabelen niet numeriek zijn, dit melden*/
if (!is_numeric($_POST['maxprice') OR !is_numeric($_POST['minprice')){
echo 'De opgegeven waarden zijn niet numeriek, probeer opnieuw.';
}
else {
/* Query opbouwen met de gegevens*/
$sql = "SELECT itemID, price FROM itemPrices WHERE price < ".mysql_real_escape_string($_POST['maxprice'])." AND price > ".mysql_real_escape_string($_POST['minprice'])."";
$result = mysql_query($sql);
/* Als query mislukt is dit melden*/
if(!$result){
trigger_error(mysql_error());
}
else {
$count = mysql_num_rows($result);
/* Als query gelukt is, maar er geen rijen zijn, dit melden*/
if($count == 0){
echo 'Geen resultaten gevonden helaas. Probeer opnieuw.';
}
else {
/* Het resultaat laten zien*/
while($rows = mysql_fetch_assoc($result)){
echo 'Het artikel '.$rows['itemId'].' kost '.$rows['price'].'<br />';
}
}
}
}
?>
Gewijzigd op 01/01/1970 01:00:00 door Afra ca
(wou het overzichtelijk en in makkelijke stappen houden (en had niet direct men editor bij de hand))
Dit laatste scirpt ziet er inderdaat goed uit.
@ Roy: Ik hou niet van floats noch decimals in de db. Noem het persoonlijke voorkeur of net iets teveel afrondingsfouten meegemaakt.
Sorry voor m'n late responce.
Code (php)
1
$sql="SELECT * FROM aanbieders_nieuw WHERE snelheid > ".mysql_real_escape_string($_POST['van'])." ORDER BY snelheid DESC";
In de DB staat bij snelheid b.v. 5mbit , 20mbit, etc. Maar er staan ook soms in "unlimited". Bij het zoeken kan gekozen worden uit 5mbit,20mbit etc. dit gaat dus goed, alleen nu wil ik dat hij ALTIJD de informatie meeneemt als de snelheid unlimited is. Hoe doe ik dat dan aan deze string toevoegen ?
Code (php)
1
2
3
2
3
<?php
$sql="SELECT * FROM aanbieders_nieuw WHERE snelheid > ".mysql_real_escape_string($_POST['van'])." OR snelheid = 'unlimited' ORDER BY snelheid DESC";
?>
$sql="SELECT * FROM aanbieders_nieuw WHERE snelheid > ".mysql_real_escape_string($_POST['van'])." OR snelheid = 'unlimited' ORDER BY snelheid DESC";
?>
zo lijkt mij?
Maar kan je > doen bij dingen die geen getallen zijn? 5mbit is een string.
-edit- Maak anders de unlimited dingen 0 dan is het ook een INT.
Gewijzigd op 01/01/1970 01:00:00 door Niels DB
Sla de snelheid gewoon als integer op, dus gewoon 5, 10, 20 zonder die mbit toevoeging. Voor een onbeperkte snelheid kun je de snelheid leeglaten (NULL). In dat geval kun je gewoon de grootte van verschillende waarden vergelijken.
Oja tuurlijk kan alleen bij een int stom. Zal ik de tabel toch moeten omzetten :)
Als bij snelheid Meer dan 100 wordt gekozen worden in de resultaten 100 niet meegenomen. Hoe zorg ik er ervoor dat dit wel zo is ? ">" vervangen voor ...
Gebruik dan het >= (groter dan of gelijk aan) teken.