Probleem met WHERE clausules
na lange tijd niets meer gedaan te hebben met PHP MySQL
ben ik paar dagen geleden terug gestart op vraag van
een vriend om voor hem snel even een site in elkaar
te steken.
Data wordt via form in tabel gezet, kan hem ook uitlezen
dus dit loopt allemaal vlot. gene probleem.
Nu zit ik met het probleem dat ik probeer records in de tabel te filteren
als volgt.
Heb form gemaakt met 4 inputvelden in ( author, title, type en datum )
als je 1 of meerdere van deze velden input en de form verstuurt zou
hij enkel de records mogen weergeven op basis van de gegeven input.
Dit werkt echter niet zoals ik het zou willen, telkens geeft hij gewoon
de volledige lijst weer...
Heb al verschillende forums nagelezen maar vind niet echt de oplossing
vandaar deze post.
Mijn SQL ziet er als volgt uit
$result = mysql_query("SELECT * FROM events WHERE datum = '$_POST[datum]' OR author = '$_POST[author]' OR type = '$_POST[type]' OR title = '$_POST[title]' ");
Kan er iemand wat hulp bieden om dit werkend te krijgen?
thanks alvast;
Yannick
mysql_real_escape_string, selecteer wat je wilt selecteren en echo de query eens.
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
<?php
$datum = mysql_real_escape_string($_POST['datum']);
$author = mysql_real_escape_string($_POST['author']);
$type = mysql_real_escape_string($_POST['type']);
$title = mysql_real_escape_string($_POST['title']);
$sql = "
SELECT *
FROM events
WHERE
datum = '".$datum."' OR
author = '".$author."' OR
type = '".$type."' OR
title = '".$title."'";
$result = mysql_query($sql);
?>
$datum = mysql_real_escape_string($_POST['datum']);
$author = mysql_real_escape_string($_POST['author']);
$type = mysql_real_escape_string($_POST['type']);
$title = mysql_real_escape_string($_POST['title']);
$sql = "
SELECT *
FROM events
WHERE
datum = '".$datum."' OR
author = '".$author."' OR
type = '".$type."' OR
title = '".$title."'";
$result = mysql_query($sql);
?>
Pim, op die manier heb je dus 4x een overbodige variabele aangemaakt!
Dus?
Gewijzigd op 16/09/2010 20:05:52 door Yannick Bogaert
http://www.php.net/sprintf
En vergeet vooral niet:
http://www.php.net/mysql_query
http://www.php.net/mysql_fetch_array, je dient de 2de parameter mee te geven ook al is deze optioneel!! of je gebruikt gewoon http://www.php.net/mysql_fetch_assoc
-> foutafhandeling!!
-> strings qoute je met enkele quotes en dan wordt je gelijk gedwongen php variabelen naar buiten te halen. UIteraard uitzonderingen daar gelaten:
- SQL statements
- \r \n \t
Pim: Dus?
Wel wat heb je aan een extra variabele totaal niets,
- je hebt dan 2x een variabele met dezelfde waarde
- je dient zuinig te zijn op de beschikbaar gestelde mem
Gewijzigd op 16/09/2010 20:08:12 door Noppes Homeland
bedankt voor je idee maar ook hier geeft hij alle records weer
die in de tabel zitten...
NO luck spijtig genoeg iemand nog een idee ?
greetz
Yannick
Wat ik wil doen is als je op www.showlight.be/report/query_e.php 1 of meerdere van de
velden invult en hij daarop filtert.
De velden die niet ingevuld worden blijven dus ook blanco...
Ja en geef nu een een duidelijk voorbeeld, want met dat antwoord kan je nog alle kanten op.
- ik vul het veld 'author' met JEME en ik krijg alle records waar in de table bij 'author' JEME staat
- ik vul het veld 'type' in met Initial notification ik krijg alle records waar in de table bij 'type' Initial notification staat
- ik vul zowel 'author' in met JEME EN type met Initial notification en krijg alle records waar deze BEIDEN in vermeld staan
- en alle andere mogelijke combinaties ...
Nu duidelijk?
Alvast hartelijk bedankt voor de hulp !
Gewijzigd op 16/09/2010 20:30:46 door Yannick Bogaert
Velden die niet ingevuld zijn moet je niet betrekken in de WHERE-CLAUSE
wat niet ingevuld is moet niet in de WHERE.
Dus bv:
ik wil filteren op author dan ziet de query er als volgt uit:
$result = mysql_query("SELECT * FROM events WHERE author = '$_POST[author]'....
half uur later bv wil ik opzoeking op type dan is de query:
$result = mysql_query("SELECT * FROM events WHERE type = '$_POST[type]'
uur later wil ik filteren op author EN type dan is de query:
$result = mysql_query("SELECT * FROM events WHERE type = '$_POST[type]' AND
author = '$_POST[author]'
Hoe kan ik dan voorkomen dat ik telkens weer opnieuw die WHERE-clause moet gaan aanpassen door de niet ingevulde velden...
Daar mag je x nachten rustig over nadenken....
Selecteer nouw eens een keer wat je wilt hebben, gebruik geen *.
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
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
<?php
// De mogelijke velden
$array = array('datum', 'author', 'type', 'title');
$field = $value = null;
// Ga alle mogelijke velden langs en kijk of ze niet leeg zijn
foreach($array as $index)
if(!empty($_POST[$index])) {
$field = $index;
$value = mysql_real_escape_string($_POST[$index]);
break;
}
// Als ze alle leeg zijn, geef dan een fout
if(is_null($field))
throw new Exception;
// En dan de sql
$sql = "
SELECT *
FROM events
WHERE
".$field." = '".$value."'
";
$stmt = mysql_query($sql);
?>
// De mogelijke velden
$array = array('datum', 'author', 'type', 'title');
$field = $value = null;
// Ga alle mogelijke velden langs en kijk of ze niet leeg zijn
foreach($array as $index)
if(!empty($_POST[$index])) {
$field = $index;
$value = mysql_real_escape_string($_POST[$index]);
break;
}
// Als ze alle leeg zijn, geef dan een fout
if(is_null($field))
throw new Exception;
// En dan de sql
$sql = "
SELECT *
FROM events
WHERE
".$field." = '".$value."'
";
$stmt = mysql_query($sql);
?>
@Noppes,
Die variabelen voegen duidelijkheid toe. Leesbaarheid is ongelooflijk belangrijk, zeker voor beginners. En verder scheelt het vrijwel niets en iig te weinig om in een applicatie van deze schaal ook maar iets te merken.
Gewijzigd op 16/09/2010 21:16:37 door Pim -
ja inderdaad zo ben ik het ook aan het aanleren terug beginnen met veel variabelen
en naarmate de kennis terug toeneemt terug beginnen verfijnen...
Heb je script geprobeerd maar nu krijg ik geen records te zien en er zitten
er zeker in de dbase :-d
Je zegt ook // Als ze alle leeg zijn, geef dan een fout, het is echter mogelijk
dat sommige velden natuurlijk leeg blijven...
bedankt voor de hulp!
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
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
<?php
// De mogelijke velden
$array = array('datum', 'author', 'type', 'title');
$whereParts = array();
// Ga alle mogelijke velden langs en kijk of ze niet leeg zijn
foreach($array as $index)
if(!empty($_POST[$index]))
$whereParts[] = "\t".$index." = '".mysql_real_escape_string($_POST[$index]))."'";
$whereClause = implode(" AND \n", $whereParts);
// En dan de sql
$sql = "
SELECT *
FROM events
WHERE ".
$whereClause;
// Als debugging
echo $sql;
$stmt = mysql_query($sql);
?>
// De mogelijke velden
$array = array('datum', 'author', 'type', 'title');
$whereParts = array();
// Ga alle mogelijke velden langs en kijk of ze niet leeg zijn
foreach($array as $index)
if(!empty($_POST[$index]))
$whereParts[] = "\t".$index." = '".mysql_real_escape_string($_POST[$index]))."'";
$whereClause = implode(" AND \n", $whereParts);
// En dan de sql
$sql = "
SELECT *
FROM events
WHERE ".
$whereClause;
// Als debugging
echo $sql;
$stmt = mysql_query($sql);
?>
Gewijzigd op 16/09/2010 21:40:01 door Pim -