Probleem met WHERE clausules

Overzicht Reageren

Sponsored by: Vacatures door Monsterboard

Yannick Bogaert

Yannick Bogaert

16/09/2010 19:16:15
Quote Anchor link
Hallo allemaal,

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
 
PHP hulp

PHP hulp

24/04/2024 17:00:30
 

16/09/2010 19:28:07
Quote Anchor link
mysql_real_escape_string, selecteer wat je wilt selecteren en echo de query eens.
 
Pim -

Pim -

16/09/2010 19:36:26
Quote Anchor link
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
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);
?>
 
Noppes Homeland

Noppes Homeland

16/09/2010 19:52:20
Quote Anchor link
Pim, op die manier heb je dus 4x een overbodige variabele aangemaakt!
 
Pim -

Pim -

16/09/2010 19:55:40
Quote Anchor link
Dus?
 
Yannick Bogaert

Yannick Bogaert

16/09/2010 19:59:58
Quote Anchor link
ok zal het eens proberen bedankt alvast :-)
Gewijzigd op 16/09/2010 20:05:52 door Yannick Bogaert
 
Noppes Homeland

Noppes Homeland

16/09/2010 20:05:59
Quote Anchor link
GVD als je een functie gebruikt en je weet niet hoe wat waar dan kijk je op
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
 
Yannick Bogaert

Yannick Bogaert

16/09/2010 20:08:35
Quote Anchor link
Pim,

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
 
Noppes Homeland

Noppes Homeland

16/09/2010 20:10:05
Quote Anchor link
Je hebt nu of of of misschien dat je bedoelt en en en of een combi?

Zie ook post dd: 16/09/2010 20:05:59
Gewijzigd op 16/09/2010 20:17:42 door Noppes Homeland
 
Yannick Bogaert

Yannick Bogaert

16/09/2010 20:15:04
Quote Anchor link
Goh ja denk dat ik daar een beetje in de mist ga met die AND en OR's

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...
 
Noppes Homeland

Noppes Homeland

16/09/2010 20:22:16
Quote Anchor link
Ja en geef nu een een duidelijk voorbeeld, want met dat antwoord kan je nog alle kanten op.
 
Yannick Bogaert

Yannick Bogaert

16/09/2010 20:28:54
Quote Anchor link
Wat moet kunnen:
- 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
 
Noppes Homeland

Noppes Homeland

16/09/2010 20:32:10
Quote Anchor link
wel je hebt het uiteindelijk zelf uitgeschreven dus kun je nu ook de juiste WHERE-clause maken.

Velden die niet ingevuld zijn moet je niet betrekken in de WHERE-CLAUSE
 
Yannick Bogaert

Yannick Bogaert

16/09/2010 20:43:00
Quote Anchor link
Jup inderdaad daar ging mijn eerste idee ook naar uit
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...
 
Noppes Homeland

Noppes Homeland

16/09/2010 20:45:09
Quote Anchor link
Daar mag je x nachten rustig over nadenken....
 

16/09/2010 20:47:44
Quote Anchor link
Selecteer nouw eens een keer wat je wilt hebben, gebruik geen *.
 
Pim -

Pim -

16/09/2010 21:16:24
Quote Anchor link
Code (php)
PHP script in nieuw venster Selecteer het PHP script
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
<?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);
?>

@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 -
 
Yannick Bogaert

Yannick Bogaert

16/09/2010 21:27:43
Quote Anchor link
@ 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!
 
Pim -

Pim -

16/09/2010 21:37:50
Quote Anchor link
Als je meerdere velden wil kunnen gebruiken moet het zo:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
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
<?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);
?>
Gewijzigd op 16/09/2010 21:40:01 door Pim -
 



Overzicht Reageren

 
 

Om de gebruiksvriendelijkheid van onze website en diensten te optimaliseren maken wij gebruik van cookies. Deze cookies gebruiken wij voor functionaliteiten, analytische gegevens en marketing doeleinden. U vindt meer informatie in onze privacy statement.