Ik ben bezig met een formulier, waarbij je op basis van gegevens uit de database naar een bepaalde pagina word gestuurd.
Staat er in de database dat je een Gebruiker bent, dan ga je naar gebruiker.php?...
ben je volgens de database een Medewerker, dan ga je naar admin.php

De volgende code heb ik geprobeerd met eerst alleen een check of je gebruiker bent, zonder succes:


<?php
session_start(); // Start a new session
if(isset($_GET['Medewerkerscode']))
{ 
  $ID = intval($_GET['Medewerkerscode']);
  // getting info from db
}
?>
<?php
if(isset($_GET['Gebruikersnaam']))
{ 
  $username = $_GET['Gebruikersnaam'];
  // getting info from db
}?><?php
                        
$con=mysqli_connect("-t");
// Check connection
if (mysqli_connect_errno())
{
echo "Failed to connect to MySQL: " . mysqli_connect_error();
};
// Get the data passed from the form
$username = $_POST['Gebruikersnaam'];
$password = $_POST['Wachtwoord'];

// escape variables for security
$username = mysqli_real_escape_string($con, $_POST['Gebruikersnaam']);
$password = mysqli_real_escape_string($con, $_POST['Wachtwoord']); 
$ID = mysqli_real_escape_string($con, $_POST['Medewerkerscode']); 

$sql = "select * FROM gebruikers WHERE Gebruikersnaam = '$username' and id = '$ID' and Wachtwoord = '$password'";

$result = mysqli_query($con, $sql) or die ( mysql_error() );

$nrOfRows = mysqli_num_rows($result);
if ($nrOfRows > 0)
{
	if(mysqli_query("SELECT Functie FROM gebruikers WHERE Functie = 'Medewerker'")){
    $_SESSION['Inloggen'] = "true";
    header("Location:admin.php?id=" . $row['Medewerkerscode'] . "&&Gebruikersnaam=" . $row['Gebruikersnaam'] . "&&Wachtwoord=" . $row['Wachtwoord'] . "");
}
}
else
{
    echo "Het inloggen is mislukt.";
}
mysqli_close($con);
?></body></html>
Nu een nieuwe vraag.

<tbody>
    <tr>
      <td>Voornaam, voorvoegsels:</td>
      <td><input type="text" name="txtVnaam" id="txtVnaam" style="width:300px;">
	  <input type="text" name="txtVvg" id="txtVvg" style="width:75px;"></td>
    </tr>
    <tr>
      <td>Achternaam:</td>
      <td><input type="text" name="Anaam" id="txtAnaam" style="width:383px;"></td>
    </tr>
    <tr>
      <td>Straat, Huisnummer:</td>
      <td><input type="text" name="Straat" id="txtStraat" style="width:300px;">
	  <input type="text" name="Huisnummer" id="txtHuisnummer" style="width:75px;"></td>
    </tr>
    <tr>
      <td>Postcode:</td>
      <td><input type="text" name="PCodeNummer" id="txtPcode" style="width:150px;"></td>
    </tr>
    <tr>
      <td>Plaats:</td>
      <td><input type="text" name="Plaats" id="txtPlaats" style="width:383px;"></td>
    </tr>
	<tr>
	<td>Zoeken op:</td>
	<td>
	<input type="checkbox" name="Voornaam" value="Voornaam">Voornaam
	<input type="checkbox" name="Achternaam" value="Achternaam">Achternaam<br>
	<input type="checkbox" name="Straat" value="Straat">Straat & huisnr
	<input type="checkbox" name="Postcode" value="Postcode">Postcode
	<input type="checkbox" name="Plaats" value="Plaats">Plaats
  </td></tr></tbody>

Dit is mijn formulier

<?php
			if(isset($_POST['zoek']))
		{
			$Vnaam		=    mysqli_real_escape_string($conn, $_POST['txtVnaam']);
			$Vvg		=    mysqli_real_escape_string($conn, $_POST['txtVvg']);
			$Anaam		=    mysqli_real_escape_string($conn, $_POST['txtAnaam']);
			$Straat		=    mysqli_real_escape_string($conn, $_POST['txtStraat']);
			$Huisnummer	=    mysqli_real_escape_string($conn, $_POST['txtHuisnummer']);
			$Postcode	=    mysqli_real_escape_string($conn, $_POST['txtPcode']);
			$Plaats		=    mysqli_real_escape_string($conn, $_POST['txtPlaats']);
#if
if(isset($_POST['Voornaam']) && isset($_POST['Achternaam']) && isset($_POST['Straat']) && isset($_POST['Plaats'])) {
$sql = "SELECT Voornaam, Voorvoegsels, Achternaam, Straat, Huisnummer, Postcode, Plaats FROM gebruikers WHERE Voornaam='$Vnaam' AND Voorvoegsels='$Vvg' AND achternaam='$Anaam' AND Straat='$Straat' AND Huisnummer='$Huisnummer' AND Postcode='$Postcode' AND Plaats='$Plaats'";
			}
if(isset($_POST['Achternaam'])) {
$sql = "SELECT Voornaam, Voorvoegsels, Achternaam, Straat, Huisnummer, Postcode, Plaats FROM gebruikers WHERE Achternaam='$Anaam'";
			}		
if(isset($_POST['Voornaam']) && isset($_POST['Achternaam']) ) {
$sql = "SELECT Voornaam, Voorvoegsels, Achternaam, Straat, Huisnummer, Postcode, Plaats FROM gebruikers WHERE Voornaam='$Vnaam' AND Voorvoegsels='$Vvg' AND Achternaam='$Anaam'";
			}
if(isset($_POST['Straat']) && isset($_POST['Postcode'])) {
$sql = "SELECT Voornaam, Voorvoegsels, Achternaam, Straat, Huisnummer, Postcode, Plaats FROM gebruikers WHERE Straat='$Straat' AND Huisnummer='$Huisnummer' AND Postcode='$Postcode'";
			}
if(isset($_POST['Straat'])) {
$sql = "SELECT Voornaam, Voorvoegsels, Achternaam, Straat, Huisnummer, Postcode, Plaats FROM gebruikers WHERE Straat='$Straat'";
			}
if(isset($_POST['Postcode'])) {
$sql = "SELECT Voornaam, Voorvoegsels, Achternaam, Straat, Huisnummer, Postcode, Plaats FROM gebruikers WHERE Postcode='$Postcode'";
			}				
if(isset($_POST['Straat']) && isset($_POST['Postcode']) && isset($_POST['Plaats'])) {
$sql = "SELECT Voornaam, Voorvoegsels, Achternaam, Straat, Huisnummer, Postcode, Plaats FROM gebruikers WHERE Straat='$Straat' AND Huisnummer='$Huisnummer' AND Postcode='$Postcode' AND Plaats='$Plaats'";
			}
if(isset($_POST['Plaats'])) {
$sql = "SELECT Voornaam, Voorvoegsels, Achternaam, Straat, Huisnummer, Postcode, Plaats FROM gebruikers WHERE Plaats='$Plaats'";
			}		
 if(isset($_POST['Voornaam'])) {
$sql = "SELECT Voornaam, Voorvoegsels, Achternaam, Straat, Huisnummer, Postcode, Plaats FROM gebruikers WHERE Voornaam='$Vnaam'";
			}		

#endif
$result = mysqli_query($conn,$sql) or die ("Error in query: $query. ".mysqli_error()); 
if (mysqli_num_rows($result) > 0) {  
    echo "<div class='tabelle'><table height=100px width=700px>";
	echo "<tr><td><center><b><i>Voornaam</center><i></b></td>";
    echo "<td><center><b><i>Achternaam</center><i></b></td>";
    echo "<td><center><b><i>Straat & Huisnr</center><i></b></td>"; 
    echo "<td><center><b><i>Postcode</center><i></b></td>";
    echo "<td><center><b><i>Plaats</center><i></b></td>";
echo "</tr>";	
    while($row = mysqli_fetch_array($result))      {
echo "<tr>";
echo "<td style='background-color:#dee1e1' width='150px'><h5><b><center>" . $row['Voornaam'] . "</center></b></h4</td>";
echo "<td style='background-color:#dee1e1' width='150px'><h5><b><center>" . $row['Achternaam'] . "</center></b></h4</td>";
echo "<td style='background-color:#dee1e1' width='125px'><h5><b><center>" . $row['Straat'] . "</center></b></h4></td>";
echo "<td style='background-color:#dee1e1' width='125px'><h5><b><center>" . $row['Postcode'] . "</center></b></h4></td>";
echo "<td style='background-color:#dee1e1' width='125px'><h5><b><center>" . $row['Plaats'] . "</center></b></h4></td>";
echo "<br></tr>";
}
echo "</table></div><br>";
} 
else {
    echo "De persoon die u zoekt is niet gevonden.";
}
$conn->close();
} ?>

De phpcode die eronder staat.

Maar nu is er een probleem.
Hij pakt het selecteren op voornaam wel, maar op achternaam niet.
Als ik in de database een 'bart' heb staan, vind hij hem wel als ik op enkel bart (en dus enkel op voornaam) zoek.
Maar als ik dan zoek op Derksen, een naam die als achternaam ind e database staat, weergeeft hij een leeg tabel.
Ook zoeken op Plaats of postcode werkt niet.

Waarom?
Dit kun je makkelijk nagaan door te kijken welke query ($sql) uiteindelijk gebruikt wordt, vervolgens is vrij makkelijk te achterhalen waarom dit niet het gewenste resultaat oplevert door dit te vergelijken met de data in je database.

Los daarvan... Ik heb een déja-vu. Een betere strategie voor het uitvoeren van dit soort zoekqueries is mogelijk om deze dynamisch op te bouwen, in plaats van elke mogelijke combinatie helemaal uit te schrijven.

Dan heb je tevens nog de (zoek)keuze om alle argumenten verplicht te stellen (eigenschap 1 = waarde 1 AND eigenschap 2 = waarde 2 AND eigenschap 3 = waarde 3) of de query veel minder strict te maken door aan te geven dat er al resultaten getoond mogen worden als er aan één of meer criteria voldaan is (eigenschap 1 = waarde 1 OR eigenschap 2 = waarde 2 OR eigenschap 3 = waarde 3).

Bouw je $sql string eenmalig stap voor stap op aan de hand van wat is ingevuld in het formulier.

Ook is het voor zoekformulieren in het algemeen handiger om de GET methode te gebruiken in plaats van de POST methode.


if(isset($_POST['Voornaam']) && isset($_POST['Achternaam']) && isset($_POST['Straat']) && isset($_POST['Plaats'])) {
$sql = "SELECT Voornaam, Voorvoegsels, Achternaam, Straat, Huisnummer, Postcode, Plaats FROM gebruikers WHERE Voornaam='$Vnaam' OR Voorvoegsels='$Vvg' OR achternaam='$Anaam' OR Straat='$Straat' OR Huisnummer='$Huisnummer' OR Postcode='$Postcode' OR Plaats='$Plaats'";
			}
	else if(isset($_POST['Voornaam'])) {
$sql = "SELECT Voornaam, Voorvoegsels, Achternaam, Straat, Huisnummer, Postcode, Plaats FROM gebruikers WHERE Voornaam='$Vnaam'";
			}
	else if(isset($_POST['Straat'])) {
$sql = "SELECT Voornaam, Voorvoegsels, Achternaam, Straat, Huisnummer, Postcode, Plaats FROM gebruikers WHERE Straat='$Straat'";
			}	


De eerste query pakt hij, de tweede pakt hij. De derde niet?
Je gebruikt ook een elseif. Als aan de eerste (of tweede) voorwaarde voldaan is wordt er niet naar de derde gekeken.

Los daarvan is het zoals al eerder aangegeven wellicht beter af te stappen van deze werkwijze. Te meer als het bovenstaande fragment al voor verwarring zorgt.
Dus in principe zeg je, maak van al die ifjes gewoon een enkel if, die kijkt naar alle velden dmv een Or, OR, OR, OR query?

Nee....

Het komt er op neer dat je de query aan de hand van je voorwaarden steeds verder kan uitbreiden.
<?php
$sql = "SELECT id, name, email, birthdate, activated FROM customers ";
if(isset($_POST['user'])) {
$sql.= " WHERE name = '".$db->real_escape_string($_POST['user'])."' "
}
?>
Nee... Ik stel enkel voor om de query-string $sql op te bouwen aan de hand van wat er ingevuld is. Dit resulteert dus uiteindelijk slechts in één compleet (dynamisch) SELECT-statement, in plaats van de tig varianten die je hierboven hebt.

Daarnaast opper ik de mogelijkheid om de zoekcriteria op verschillende manieren te behandelen: alles inclusief (met AND) of exclusief (met OR). In het eerste geval moeten alle argumenten voldoen, dat is een redelijk stricte match. In het tweede geval moet ten minste één criterium voldoen. Hiermee zoek je veel minder strict, maar is de kans dat je resultaten vindt groter (omdat simpelweg niet alle zoekcriteria hoeven te voldoen zoals in het eerste geval).

Om je op weg te helpen hier een schets van het idee (verder niet getest):
<?php
$sql = 'SELECT Voornaam, Voorvoegsels, Achternaam, Straat, Huisnummer, Postcode, Plaats FROM gebruikers';
$args = array();
if (!empty($_POST['Voornaam'])) {
    $args[] = "Voornaam = '".$conn->real_escape_string($_POST['Voornaam'])."'";
}
if (!empty($_POST['Achternaam'])) {
    $args[] = "Achternaam = '".$conn->real_escape_string($_POST['Achternaam'])."'";
}
if (!empty($_POST['Straat'])) {
    $args[] = "Straat = '".$conn->real_escape_string($_POST['Straat'])."'";
}
// et cetera
if (count($args) > 0) {
    // maak een formulierveld aan waarmee je kunt aangeven of alle zoektermen overeen moeten komen
    if ($_POST['zoektermen'] == 'alle') {
        $separator = ' AND ';
    } else {
        $separator = ' OR ';
    }
    $sql .= ' WHERE '.implode($separator, $args);
} else {
    // geen argumenten opgegeven, de vraag is of je alles wilt opvragen
}
?>

Ik zou je trouwens nog steeds aanraden om over te stappen op de GET methode in plaats van POST, vooral op het moment dat je gaat werken met paginering van je zoekresultaten. Heb je daar al over nagedacht?
Dat met $sql. kende ik niet eens.
Maar in ieder geval.
Hoe zorg ik dat hij nu ook resultaat geeft?
Dat stukje code is alsvolgt:

if(isset($_POST['Plaats'])) {
    $sql.= " WHERE Plaats = '".$conn->real_escape_string($_POST['Plaats'])."' ";
}	
#endif
$result = mysqli_query($conn,$sql) or die ("Error in query: $query. ".mysqli_error()); 


Had ik $database op de plek van $conn->... staan, gaf hij een error.
Nu geeft hij met $conn op die plek:

Warning: mysqli_error() expects exactly 1 parameter, 0 given in C:\....\admin.php on line 107

Haal ik bij result, $conn weg:

$result = mysqli_query($sql) or die ("Error in query: $query. ".mysqli_error()); 


Krijg ik een dubbelzinnige error:
Warning: mysqli_query() expects at least 2 parameters, 1 given in C:\.\admin.php on line 108

Warning: mysqli_error() expects exactly 1 parameter, 0 given in C:\.\admin.php on line 108

Waarom haal je $conn weg bij mysqli_query(), terwijl de eerste error over een missende parameter bij mysqli_error() gaat??

Reageren