Ik ben bezig met een progressbar. Maar nu loop ik op het volgende mis.
Doe ik dit als code:

<?php
// set database server access variables: 
$host = "localhost"; 
$user = ""; 
$pass = ""; 
$db = "voetbal";
// open connection 
$con=mysqli_connect($host, $user, $pass) or die ("Unable to connect!"); 
// select database 
mysqli_select_db($con, 'voetbal') or die ("Unable to select database!"); 
// create query
$ClubCheck = mysqli_query($con, "SELECT club from users WHERE id = '$id'");
$ClubCheck2 = mysqli_query($con, "SELECT leeftijd from users WHERE id = '$id'");
$ClubCheck3 = mysqli_query($con, "SELECT positie from clubs WHERE user_id = '$id'");
$ClubCheck4 = mysqli_query($con, "SELECT clubthuisgoals, clubuitgoals from wedstrijden WHERE user_id = '$id'");
if ($ClubCheck2 > "1") {
     echo "<div class='progress'>
  <div class='progress-bar' role='progressbar' aria-valuenow='60' aria-valuemin='0' aria-valuemax='100' style='width:3%';>
    3%</div></div>";
}
elseif ($ClubCheck2 > "1" && $ClubCheck3 > "1") {
     echo "<div class='progress'>
  <div class='progress-bar' role='progressbar' aria-valuenow='60' aria-valuemin='0' aria-valuemax='100' style='width:6%';>
    6%</div></div>";
};?>


dan weergeeft hij alleen "3%".

Doe ik dit:

<?php
// set database server access variables: 
$host = "localhost"; 
$user = ""; 
$pass = ""; 
$db = "voetbal";
// open connection 
$con=mysqli_connect($host, $user, $pass) or die ("Unable to connect!"); 
// select database 
mysqli_select_db($con, 'voetbal') or die ("Unable to select database!"); 
// create query
$ClubCheck = mysqli_query($con, "SELECT club from users WHERE id = '$id'");
$ClubCheck2 = mysqli_query($con, "SELECT leeftijd from users WHERE id = '$id'");
$ClubCheck3 = mysqli_query($con, "SELECT positie from clubs WHERE user_id = '$id'");
$ClubCheck4 = mysqli_query($con, "SELECT clubthuisgoals, clubuitgoals from wedstrijden WHERE user_id = '$id'");
if ($ClubCheck2 > "1") {
     echo "<div class='progress'>
  <div class='progress-bar' role='progressbar' aria-valuenow='60' aria-valuemin='0' aria-valuemax='100' style='width:3%';>
    3%</div></div>";
}
if ($ClubCheck2 > "1" && $ClubCheck3 > "1") {
     echo "<div class='progress'>
  <div class='progress-bar' role='progressbar' aria-valuenow='60' aria-valuemin='0' aria-valuemax='100' style='width:6%';>
    6%</div></div>";
};?>

Dan weergeeft hij 3% en 6% onder elkaar.

Waarom werkt bij mij in de eerste code de elseif niet?
Bij een succesvolle SELECT retourneert mysqli_query() een object, maar je vergelijkt dat mysqli_result-object in if ($ClubCheck2 > "1") met een string. Je moet waarschijnlijk twee dingen aanpassen: tellen met SELECT COUNT(*) en die telling vervolgens uit het mysqli_result-object halen voor de if/elseif.
 

$ClubCheck = mysqli_query($con, "SELECT club from users WHERE id = '$id'");
$ClubCheck2 = mysqli_query($con, "SELECT COUNT(leeftijd) FROM users WHERE id = '$id'");
$ClubCheck3 = mysqli_query($con, "SELECT COUNT(positie) FROM clubs WHERE user_id= '$id'");
$ClubCheck4 = mysqli_query($con, "SELECT clubthuisgoals, clubuitgoals from wedstrijden WHERE user_id = '$id'");
if ($ClubCheck2 > "1") {
     echo "<div class='progress'>
  <div class='progress-bar' role='progressbar' aria-valuenow='60' aria-valuemin='0' aria-valuemax='100' style='width:3%';>
    3%</div></div>";
}
else if ($ClubCheck2 > "1" && $ClubCheck3 > "1") {
     echo "<div class='progress'>
  <div class='progress-bar' role='progressbar' aria-valuenow='60' aria-valuemin='0' aria-valuemax='100' style='width:6%';>
    6%</div></div>";
}
else {
	echo "hoi";
};?>


Toch blijft nu enkel de 3% staan.

Ook in bijvoorbeeld deze vorm:


$ClubCheck = mysqli_query($con, "SELECT club from users WHERE id = '$id'");
$ClubCheck2 = mysqli_query($con, "SELECT COUNT(*) AS leeftijd FROM users WHERE id = '$id'");
$ClubCheck3 = mysqli_query($con, "SELECT COUNT(*) AS positie FROM clubs WHERE user_id= '$id'");
$ClubCheck4 = mysqli_query($con, "SELECT clubthuisgoals, clubuitgoals from wedstrijden WHERE user_id = '$id'");
if ($ClubCheck2 > "1") {
     echo "<div class='progress'>
  <div class='progress-bar' role='progressbar' aria-valuenow='60' aria-valuemin='0' aria-valuemax='100' style='width:3%';>
    3%</div></div>";
}
elseif ($ClubCheck2 > "1" && $ClubCheck3 > "1") {
     echo "<div class='progress'>
  <div class='progress-bar' role='progressbar' aria-valuenow='60' aria-valuemin='0' aria-valuemax='100' style='width:6%';>
    6%</div></div>";
}
else {
	echo "hoi";
};?>

niet het gewenste effect
Je slaat de resultaatset op in $ClubCheck2, maar controleert niet welk resultaat er in die resultaatset zit. Kijk maar eens wat er in $ClubCheck2 zit:


<?php
var_dump($ClubCheck2);
?>

object(mysqli_result)#3 (5) { ["current_field"]=> int(0) ["field_count"]=> int(1) ["lengths"]=> NULL ["num_rows"]=> int(1) ["type"]=> int(0) } 

object(mysqli_result)#4 (5) { ["current_field"]=> int(0) ["field_count"]=> int(1) ["lengths"]=> NULL ["num_rows"]=> int(1) ["type"]=> int(0) }


is wat hij laat zien op de pagina door vardump. De bovenste is ClubCheck2 (die hij gewoon laat zien. De tweede is de elseif ClubCheck3. Die hij niet laat zien.
Als ik het zo even snel bekijk is dat logisch.


IF ($ClubCheck2 > 1)

ELSEIF ($ClubCheck2 > 1 && $ClubCheck3 > 1)


Als $ClubCheck2 > 1 komt hij direct in het eerste IF-blok terecht, en daardoor dus niet meer in het ELSEIF-blok.
Ozzie, dit is geen formele logica, maar het heksenzusje PHP-logica. ;-)

$ClubCheck2 is een object. Geen boolean, integer of string. Daardoor is de if ($ClubCheck2 > "1") met een object links en een string rechts van de vergelijkingsoperator op zijn zachtst gezegd dubbelzinnig. Er staat namelijk letterlijk: "Als een object van het type mysqli_result groter is dan een string met het cijfer 1 …".

Vandaar dat ik opperde: haal eerst eens het resultaat van je query (een integer bij SELECT COUNT) uit de resultaatset (een databaseobject).
@Ward: lol ... ik ging er inderdaad vanuit dat het resultaat een integer was ... anders heeft de vergelijking weinig zin. De rest van mijn verhaaltje blijft wel overeind dat wanneer ie eenmaal in de IF is, ie niet meer in de ELSEIF komt.
@Ozzie, wat de hele bedoeling is, is dat als je hoger staat dan plek 16, je 3% voltooid hebt. Sta je hoger dan plek 16 en heb je een andere doelstelling gehaald, dan heb je 6% voltooid. Daarom had ik die IF en Else if op die manier gemaakt. Maar ik kan me voorstellen dat het niet de handigste manier was.

@Ward, ik ben even totaal de weg kwijt in wat je bedoeld..

Toevoeging op 14/12/2015 19:23:50:

Ik heb het een beetje aangepast. Het word nu een algemeen overzicht van behaalde en niet behaalde doelstellingen. Maar toch werkt het niet.

<?php
if(isset($_GET['id']))
{ 
  $id = intval($_GET['id']);
}?><!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="utf-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1">
    <title>Home - VoetbalLeven</title>
    <link href="css/bootstrap.min.css" rel="stylesheet">
  </head>
  <body><?php
// set database server access variables: 
$host = "localhost"; 
$user = "root"; 
$pass = ""; 
$db = "";
// open connection 
$con=mysqli_connect($host, $user, $pass) or die ("Unable to connect!"); 
// select database 
mysqli_select_db($con, 'voetbal') or die ("Unable to select database!"); 
// create query
$ClubCheck2 = mysqli_query($con, "SELECT leeftijd FROM users WHERE id = '$id'");
$ClubCheck3 = mysqli_query($con, "SELECT positie FROM clubs WHERE user_id= '$id'");
$ClubCheck4 = mysqli_query($con, "SELECT wedstrijden FROM clubs WHERE user_id = '$id'");
$ClubCheck5 = mysqli_query($con, "SELECT punten FROM clubs WHERE user_id= '$id'");
if ($ClubCheck2 > "1") {
     $Check2 == '100';
	 echo "<h2>Leeftijd ingevuld</h2>
	 <div class='progress'>
  <div class='progress-bar' role='progressbar' aria-valuenow='60' aria-valuemin='0' aria-valuemax='100' style='width:100%';>
    100%</div></div>";
}
elseif ($ClubCheck2 < "1") {
     $Check2 == '0';
	 echo "<h2>Leeftijd ingevuld</h2>
	 <div class='progress'>
  <div class='progress-bar' role='progressbar' aria-valuenow='60' aria-valuemin='0' aria-valuemax='100' style='width:0%';>
    0%</div></div>";
}
if ($ClubCheck3 > "1") {
     $Check3 == '100';
	 echo "<h2>Doelstelling competitie gehaald</h2>
	 <div class='progress'>
  <div class='progress-bar' role='progressbar' aria-valuenow='60' aria-valuemin='0' aria-valuemax='100' style='width:100%';>
    100%</div></div>";
}
elseif ($ClubCheck3 < "1") {
     $Check2 == '0';
	 echo "<h2>Leeftijd ingevuld</h2>
	 <div class='progress'>
  <div class='progress-bar' role='progressbar' aria-valuenow='60' aria-valuemin='0' aria-valuemax='100' style='width:0%';>
    0%</div></div>";
}
if ($ClubCheck4 > "2") {
     $Check4 == '100';
	 echo "<h2>Wedstrijd gespeeld</h2>
	 <div class='progress'>
  <div class='progress-bar' role='progressbar' aria-valuenow='60' aria-valuemin='0' aria-valuemax='100' style='width:100%';>
    100%</div></div>";
}
elseif ($ClubCheck4 < "1") {
     $Check4 == '0';
	 echo "<h2>Wedstrijd gespeeld</h2>
	 <div class='progress'>
  <div class='progress-bar' role='progressbar' aria-valuenow='60' aria-valuemin='0' aria-valuemax='100' style='width:0%';>
    0%</div></div>";
}
if ($ClubCheck5 > "3") {
     $Check5 == '100';
	 echo "<h2>Wedstrijd gewonnen</h2>
	 <div class='progress'>
  <div class='progress-bar' role='progressbar' aria-valuenow='60' aria-valuemin='0' aria-valuemax='100' style='width:100%';>
    100%</div></div>";
}
elseif ($ClubCheck5 < "2") {
     $Check5 == '0';
	 echo "<h2>Wedstrijd gewonnen</h2>
	 <div class='progress'>
  <div class='progress-bar' role='progressbar' aria-valuenow='60' aria-valuemin='0' aria-valuemax='100' style='width:0%';>
    0%</div></div>";
}
else {
	echo "hoi";
};?></body>
</html>

Hij zou bij leeftijd en doelstelling gewoon 100% moeten aangeven. Maar hij doet bij alle 4 (nadat ik van alle elseifs die je hierboven nog ziet, else heb gemaakt) 100%. Wat is de reden?
Je moet eerst zorgen dat je query een getal oplevert. Vervolgens moet je de juiste structuur gebruiken voor je if-statements. Als je if met elseif gebruikt, gaat ie als de if waar is naar de if, en komt ie dus niet meer in de elseif.
Hier gaat het fout. Dit geeft namelijk géén resultaat (de leeftijd van de gebruiker), maar een resultaatset:

<?php
$ClubCheck2 = mysqli_query($con, "SELECT leeftijd FROM users WHERE id = '$id'");
?>

Je moet het resultaat (de leeftijd) nog uit de resultaatset halen:

<?php
if ($result = mysqli_query($con, "SELECT leeftijd FROM users WHERE id = '$id'")) {
    $row = mysqli_fetch_assoc($result);
    $ClubCheck2 = $row['leeftijd'];
}
?>

Hiermee hebben we het in drie stukken geknipt:

1. mysqli_query() retourneert een resultaatset óf false als de query mislukt, vandaar dat we deze uitkomst in een if kunnen gebruiken.

2. Met $row = mysqli_fetch_assoc($result) halen we vervolgens één rij uit de resultaatset.

3. Via $row['leeftijd'] halen we tot slot één kolom uit de ene rij.

Deze aanzet is ook bepalend voor de rest van je logische structuur. Stel nu dat die eerste if wél false is doordat de query inderdaad mislukt, wat moet er dan gebeuren? Of stel dat de query wel lukt, maar er geen rijen worden gevonden doordat de $id niet bestaat, wat dan?

Reageren