[PHP/MYSQL] variabelen vergelijken

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Hoi,

Een lange zoektocht heeft heel nog geen resultaten opgeleverd , vandaar dat ik het hier even probeer. Mijn naam is Arnold en ben druk bezig een website te maken met daaraan gekoppeld een database. Nou komt mijn vraag :

Via een php formulier worden 4 variabelen opgegeven die worden gekozen uit jumpmenu's
(provincie, plaats, categorie en soort)

Als er op "submit" gedrukt wordt de volgende opdracht gestart.

$opdracht = "SELECT * from $tabelnaam WHERE provincie = '$_POST[provincie]' AND plaats = '$_POST[plaats]' AND categorie = '$_POST[categorie]' AND soort = '$_POST[soort]' ORDER by datum ASC";

Er word dus gezocht in de tabel naar rijen waarin alle variabelen overeenkomen.
Dit werkt allemaal goed, maar nou het probleem.

Als er op de php pagina alleen een waarde aan bijvoorbeeld "provincie" wordt meegegeven en niet aan de overige variabelen (plaats, categorie en soort) dan word er niks gevonden in de database. Dit omdat de opdracht geen enkele match vindt.

Hoe kan ik er nou voor zorgen dat als er maar 1 variabele wordt ingevuld hij alles uit de database haalt dat overenkomt met deze variabele, zonder dat hij de andere variabelen met elkaar gaat vergelijken.

Ik weet dat de vraagstelling misschien een beetje onduidelijk is, maar ik hoop toch dat iemand voor mij het licht ziet. _/-\o_

mvg

Acties:
  • 0 Henk 'm!

  • Gonadan
  • Registratie: Februari 2004
  • Laatst online: 12:37

Gonadan

Admin Beeld & Geluid, Harde Waren
PHP:
1
2
3
4
5
6
$opdracht = "SELECT * from $tabelnaam 
                      WHERE provincie = '$_POST[provincie]' 
                      OR plaats = '$_POST[plaats]' 
                      OR categorie = '$_POST[categorie]' 
                      OR soort = '$_POST[soort]' 
                      ORDER by datum ASC";

Maar dan krijg je wel meer resultaten die minder gericht geselecteerd zijn. :)

[ Voor 17% gewijzigd door Gonadan op 27-10-2006 12:47 ]

Look for the signal in your life, not the noise.

Canon R6 | 50 f/1.8 STM | 430EX II
Sigma 85 f/1.4 Art | 100-400 Contemporary
Zeiss Distagon 21 f/2.8


Acties:
  • 0 Henk 'm!

  • Fatamorgana
  • Registratie: Augustus 2001
  • Laatst online: 21-07 01:24

Fatamorgana

Fietsen is gezond.

Ik zou de query opbouwen aan de hand van de wel aanwezige variabelen. De query is dus afhankelijk van wat de gebruiker kiest en zo krijg je precies wat je wilt.

Acties:
  • 0 Henk 'm!

  • Orion84
  • Registratie: April 2002
  • Laatst online: 02:46

Orion84

Admin General Chat / Wonen & Mobiliteit

Fotogenie(k)?

Verwijderd schreef op vrijdag 27 oktober 2006 @ 12:44:
Hoi,

Een lange zoektocht heeft heel nog geen resultaten opgeleverd , vandaar dat ik het hier even probeer. Mijn naam is Arnold en ben druk bezig een website te maken met daaraan gekoppeld een database. Nou komt mijn vraag :

Via een php formulier worden 4 variabelen opgegeven die worden gekozen uit jumpmenu's
(provincie, plaats, categorie en soort)

Als er op "submit" gedrukt wordt de volgende opdracht gestart.

$opdracht = "SELECT * from $tabelnaam WHERE provincie = '$_POST[provincie]' AND plaats = '$_POST[plaats]' AND categorie = '$_POST[categorie]' AND soort = '$_POST[soort]' ORDER by datum ASC";

Er word dus gezocht in de tabel naar rijen waarin alle variabelen overeenkomen.
Dit werkt allemaal goed, maar nou het probleem.

Als er op de php pagina alleen een waarde aan bijvoorbeeld "provincie" wordt meegegeven en niet aan de overige variabelen (plaats, categorie en soort) dan word er niks gevonden in de database. Dit omdat de opdracht geen enkele match vindt.

Hoe kan ik er nou voor zorgen dat als er maar 1 variabele wordt ingevuld hij alles uit de database haalt dat overenkomt met deze variabele, zonder dat hij de andere variabelen met elkaar gaat vergelijken.

Ik weet dat de vraagstelling misschien een beetje onduidelijk is, maar ik hoop toch dat iemand voor mij het licht ziet. _/-\o_

mvg
Voeg bij elke vergelijking een soort else toe voor het geval die variabele leeg is :?

dus:
SQL:
1
2
3
4
5
6
SELECT * from $tabelnaam 
WHERE ( provincie = '$_POST[provincie]' OR $_POST[provincie] = '' )
AND  ( plaats = '$_POST[plaats]' OR $_POST[plaats] = '' )
AND  ( categorie = '$_POST[categorie]' OR $_POST[categorie] = '' )
AND  ( soort = '$_POST[soort]' OR $_POST[soort] = '' )
ORDER by datum ASC


(syntax fouten voorbehouden)

The problem with common sense is that it's not all that common. | LinkedIn | Flickr


Acties:
  • 0 Henk 'm!

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

NMe

Quia Ego Sic Dico.

Gonadan schreef op vrijdag 27 oktober 2006 @ 12:45:
PHP:
1
2
3
4
5
6
$opdracht = "SELECT * from $tabelnaam 
                      WHERE provincie = '$_POST[provincie]' 
                      OR plaats = '$_POST[plaats]' 
                      OR categorie = '$_POST[categorie]' 
                      OR soort = '$_POST[soort]' 
                      ORDER by datum ASC";

Maar dan krijg je wel meer resultaten die minder gericht geselecteerd zijn. :)
Als je zou devven met error_reporting op E_ALL (zoals het hoort), dan word je hier om de oren gesmeten met notices. ;)

'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

Topicstarter
thx, ik ga er gelijk mee aan de slag en zal laten weten of het gelukt is.

Acties:
  • 0 Henk 'm!

  • Genoil
  • Registratie: Maart 2000
  • Laatst online: 12-11-2023
Met OR zoek je natuurlijk ook ineens heel anders. en die tweede oplossing snap ik niet, los van de syntax fouten. Je zoekt zoiets als dit:
PHP:
1
2
3
4
5
6
7
$criteria = array("provincie", "plaats", "categorie", "soort");
$clauses = array();
foreach($criteria as $c) {
    if(isset($_POST[$c]) && !empty($_POST[$c])) 
        $clauses[] = $c." = '".$_POST[$c]."'";
}
$query = "SELECT * FROM $tablenaam WHERE ".implode(" AND ", $clauses)." ORDER by datum ASC";

Acties:
  • 0 Henk 'm!

  • Gonadan
  • Registratie: Februari 2004
  • Laatst online: 12:37

Gonadan

Admin Beeld & Geluid, Harde Waren
-NMe- schreef op vrijdag 27 oktober 2006 @ 12:49:
[...]

Als je zou devven met error_reporting op E_ALL (zoals het hoort), dan word je hier om de oren gesmeten met notices. ;)
Hoe bedoel je?
Omdat er geen evaluation brackets om de arrays zitten, en geen quotes?
Dat heb ik gewoon van de TS overgenomen. ;)

Look for the signal in your life, not the noise.

Canon R6 | 50 f/1.8 STM | 430EX II
Sigma 85 f/1.4 Art | 100-400 Contemporary
Zeiss Distagon 21 f/2.8


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
ben ik weer, bedankt voor de vele reactie. Om het eenvoudig te maken ben ik begonnen te kijken naar maar 1 variabel, namelijk provincie.

Wat ik geprobeerd heb is het volgende :

$opdracht = "SELECT * from $tabelnaam WHERE provincie = '$_POST[provincie]' OR $_POST[provincie] = ' ' ORDER by datum ASC";

Dit werkte niet. Als er dan bijvoorbeeld niks wordt ingevuld bij provincie krijg ik ook geen resultaten terwijl ik dan juist alles tevoorschijn moet komen.

Ga nu de oplossing proberen die hierboven staat. Tips blijven natuurlijk welkom.

mvg

Acties:
  • 0 Henk 'm!

Verwijderd

Volgens mij dragen jullie hier allemaal niet de oplossingen aan voor het probleem. Het lijkt me dat je voor elk van de mogelijke invoerwaarden een AND aan de WHERE clause moet toevoege.

Wil je alleen postcode dan is t:

PHP:
1
WHERE postcode = $_POST['postcode']


wil je postcode en plaats:

PHP:
1
2
WHERE postcode = $_POST['postcode']
AND plaats = $_POST['plaats']


Je kan dan dus beter de WHERE clause dynamisch opbouwen
PHP:
1
2
3
4
5
6
7
$where_clause = "WHERE ";

if(!empty($_POST['plaats']) {
$where_clause .= "plaats = " .$_POST['plaats'];
}
if...
// und so weiter, alleen nog even iets doen om de AND's er tussen te voegen

}

Acties:
  • 0 Henk 'm!

Verwijderd

Genoil schreef op vrijdag 27 oktober 2006 @ 12:58:
Met OR zoek je natuurlijk ook ineens heel anders. en die tweede oplossing snap ik niet, los van de syntax fouten. Je zoekt zoiets als dit:
PHP:
1
2
3
4
5
6
7
$criteria = array("provincie", "plaats", "categorie", "soort");
$clauses = array();
foreach($criteria as $c) {
    if(isset($_POST[$c]) && !empty($_POST[$c])) 
        $clauses[] = $c." = '".$_POST[$c]."'";
}
$query = "SELECT * FROM $tablenaam WHERE ".implode(" AND ", $clauses)." ORDER by datum ASC";
die werkt natuurlijk ook, lijkt me een mooie oplossing!

Acties:
  • 0 Henk 'm!

  • Genoil
  • Registratie: Maart 2000
  • Laatst online: 12-11-2023
Welkom op GoT trouwens ;)

Mijn oplossing werkt overigens (, los van evt. syntaxfouten). Eigenlijk moet ik dat niet doen, zomaar de hele oplossing geven, want dat wekt scriptrequests in de hand en zo doen we dat niet op GoT. Ik hoop dat je iig begrijpt waarom dit wel werkt. En als het niet werkt, ook mooi, dan zou je op z'n minst een eind in de goede richting moeten zijn ;)

Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Dit gaat me iets te snel. Ik heb

<?php
$criteria = array("provincie", "plaats", "categorie", "soort");
$clauses = array();
foreach($criteria as $c) {
if(isset($_POST[$c]) && !empty($_POST[$c]))
$clauses[] = $c." = '".$_POST[$c]."'";
}
$query = "SELECT * FROM $tablenaam WHERE ".implode(" AND ", $clauses)." ORDER by datum ASC";
?>

geprobeerd maar dit werkt niet. Kan natuurlijk ook aan mij liggen :)

www.pokertoernooien.info is trouwens waar het om gaat. Als men niks aanklikt dan wordt er niks gevonden. Moet ik misschien een value geven als de keuzee "Provincie" is ( dus eigenlijk geen keuze)

En anders, hoe geef ik een variabele de waarde "" mee ( empty )

mvg

[ Voor 5% gewijzigd door Verwijderd op 27-10-2006 13:25 ]


Acties:
  • 0 Henk 'm!

  • Genoil
  • Registratie: Maart 2000
  • Laatst online: 12-11-2023
Ja dat komt omdat je standaard bv "Provincie" als waarde van $_POST['provincie'] doorstuurt. Je kunt twee dingen doen:

1. <option value="">Provincie</option> , zodat die leeg is als je niets selecteert.
2. of je test ipv !empty op resp. de woorden "Provincie", "Plaats" etc.

1. is gemakkelijker :)

Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Ik heb het gedaan, maar ik krijg de volgende foutmelding :

Warning: mysql_fetch_array(): supplied argument is not a valid MySQL result resource in /home/pokertoe/public_html/PHP/weergeven.php on line 35


In regel 35 staat :

while ($rij = mysql_fetch_array ($resultaat) ) {

Sorry dat ik jullie kostbare tijd zo verbruik

Acties:
  • 0 Henk 'm!

  • Genoil
  • Registratie: Maart 2000
  • Laatst online: 12-11-2023
Dan zit er waarschijnlijk een fout in de query. echo die eens en dan zie vast snel waar mijn syntaxfout zat.

Wij verspelen hier overigens onze tijd aan uit vrije wil ;)

Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
$criteria = array("provincie", "plaats", "categorie", "soort");
$clauses = array();
foreach($criteria as $c) {
if(isset($_POST[$c]) && !empty($_POST[$c]))
$clauses[] = $c." = '".$_POST[$c]."'";
}

$opdracht = "SELECT * FROM $tablenaam WHERE ".implode(" AND ", $clauses)." ORDER by datum ASC";

Schiet mij maar lek, maar ik kan het lek nog niet vinden.

Acties:
  • 0 Henk 'm!

  • Blacksnak
  • Registratie: Oktober 2001
  • Laatst online: 07-07-2024
Echo de query eens en post die hier, zoals Genoil vraagt. Is makkelijker om de fout op te sporen.

Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Ik ga me nou wel en leek voelen.

Echo de query ??

Acties:
  • 0 Henk 'm!

  • Genoil
  • Registratie: Maart 2000
  • Laatst online: 12-11-2023
Ja nu wordt het wel een beetje te gortig hoor ;)

met query bedoelen we jou $opdracht. dus

PHP:
1
echo $opdracht;

Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
SELECT * FROM toernooi WHERE ORDER by datum ASC
Warning: mysql_fetch_array(): supplied argument is not a valid MySQL result resource in /home/pokertoe/public_html/PHP/weergeven.php on line 37

Als ik bijvoorbeeld kies voor Zuid Holland werkt alles wel, het enige wat nu nog fout gaat is als ik nergens wat invul. Dan krijg ik bovenstaande "echo"

Het syntaxfoutje zat hem in tablenaam ipv tabelnaam :*)

Ik voel dat het einde in zicht is.

Acties:
  • 0 Henk 'm!

Verwijderd

@Pythagoras: Als er tussen WHERE & ORDER niets komt te staan... ook niet als je een van de drop downs selecteerd, is er toch iets mis... maar dat had je zelf al bedacht zeker ;)

ps. Als je nou een voorbeeld query heeft... geef dan ook even aan wat de input ervan is! Dus welke dropdowns heb je geselecteerd.

Acties:
  • 0 Henk 'm!

Verwijderd

Sorry... ben te lui om te lezen vandaag :D

Het probleem is dus dat hij dan alles moet laten zien: twee oplissingen:

* voorkomen dat dat kan, aangezien hij dan alles queryd, misschien niet wenselijk
* zorgen dat er geen WHERE komt te staan als er geen variabelen zijn doorgestuurd

PHP:
1
2
3
4
5
6
7
8
9
10
11
12
<?php
$criteria = array("provincie", "plaats", "categorie", "soort");
$clauses = array();
$empty = true;
foreach($criteria as $c) {
if(isset($_POST[$c]) && !empty($_POST[$c])) {
$clauses[] = $c." = '".$_POST[$c]."'";
$empty = false;
}
}
$query = "SELECT * FROM $tablenaam" if(!$empty) { echo " WHERE "; } ".implode(" AND ", $clauses)." ORDER by datum ASC";
?>


of iets netter O-)

Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Alles werkt, alleen als ik helemaal niks selecteer. Alleen dan gaat het fout.

Zie http://www.pokertoernooien.info/

mvg Arnold

Acties:
  • 0 Henk 'm!

Verwijderd

Verwijderd schreef op vrijdag 27 oktober 2006 @ 14:09:
Alles werkt, alleen als ik helemaal niks selecteer. Alleen dan gaat het fout.

Zie http://www.pokertoernooien.info/

mvg Arnold
*edit: dit was stom :S

[ Voor 34% gewijzigd door Verwijderd op 27-10-2006 14:12 ]


Acties:
  • 0 Henk 'm!

  • ID-College
  • Registratie: November 2003
  • Laatst online: 15:55
Verwijderd schreef op vrijdag 27 oktober 2006 @ 14:09:
Alles werkt, alleen als ik helemaal niks selecteer. Alleen dan gaat het fout.

Zie http://www.pokertoernooien.info/

mvg Arnold
PHP:
1
if(!empty() && !empty() //eznovoorts)

Kan je toch controleren welke wel en niet geselecteerd zijn :?

[ Voor 3% gewijzigd door ID-College op 27-10-2006 14:21 ]


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Parse error: syntax error, unexpected T_VARIABLE in /home/pokertoe/public_html/PHP/weergeven.php on line 32

Er zit iets fout in de query :

$query = "SELECT * FROM $tabelnaam" if(!$empty) { echo " WHERE "; } ".implode(" AND ", $clauses)." ORDER by datum ASC";

Acties:
  • 0 Henk 'm!

Verwijderd

je moet een x die aanhalingstekens weg halen na " WHERE "; } ---> " <---- (moet dus weg)

dat had je dan wel weer zelf kunnen debuggen of niet??

Acties:
  • 0 Henk 'm!

  • user109731
  • Registratie: Maart 2004
  • Niet online
Als $clauses[] leeg is wil je geen WHERE, dus zoiets:

PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
$criteria = array("provincie", "plaats", "categorie", "soort");
$clauses = array();
foreach($criteria as $c) {
  if(isset($_POST[$c]) && !empty($_POST[$c]))
    $clauses[] = $c." = '".$_POST[$c]."'";
  }
}
$opdracht = "SELECT * FROM $tablenaam";

if (count($clauses) > 0) {
  $opdracht .= " WHERE ".implode(" AND ", $clauses);
}
  
$opdracht .= " ORDER by datum ASC";

Het kan ook wel in 1 regel met de ? : operator, maar dat maakt het wat minder leesbaar

Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Thx a lot,

Bedankt voor jullie hulp. Ik kom net kijken op op PHP gebied en databases zijn al helemaal nieuw voor mij maar ik weet nou iig waar ik moet zijn met al mijn vragen.

Het is ook goed dat het lekker druk is hier, dan hoef je niet zo lang te wachten op een reactie.

Echt helemaal super, you make my day

Arnold

Acties:
  • 0 Henk 'm!

  • Genoil
  • Registratie: Maart 2000
  • Laatst online: 12-11-2023
oja dat was de fout :). het kan overigens allemaal wat simpeler door in m'n orginele scriptje "WHERE " te vervangen door "WHERE 1 " ipv een extra check.

Verder is het een beetje zoeken naar een bepaald evenwicht wat het betreft het stellen van vragen op GoT. Het niveau loopt hier van laag tot hoog, en minder gevorderden vinden het ook leuk af en toe vragen voorgeschoteld te krijgen waarmee ze wat kunnen. Maar als je hier nou elke dag 1 of meer vragen stelt van het niveau als deze, dan wek je al snel de irritatie van de gevorderden.

Acties:
  • 0 Henk 'm!

Verwijderd

Hey Pythagoras,

Nog even een idee voor je site... het is misschien handig als je die drop-down menu's ook dynamisch opbouwd... dat wil zeggen, query je database met welke provincies,plaatsen,spellen,limits allemaal vertegenwoordigd zijn... als je nu bijvoorbeeld Gelderland selecteerd, geeft ie geen resultaat, beter is dan om alleen die provincies te tonen waar ook daadwerkelijk toernooien zijn!

Dit doe je door de drop-down te laten populaten mbv een query:

SELECT DISTINCT(provincies) FROM $tablenaam;

Deze geeft alleen eenmaal de provincie die voorkomt in je tabel, als je deze dan dynamisch uitleest en de waarden in een <option>$row_query['provincie']</option> zet, heb je dus alleen het gewenste resultaat!

succes ermee, wel leuk project trouwens... I love hold'em :D
Pagina: 1