Foreach nur ausführen, wenn auch Inhalt in MySQL-DB

Don Stefano

Erfahrenes Mitglied
Hallo zusammen,

leider habe ich ein kleines MySQL Problem:

Ich muss aus einer DB-Tabelle für einen bestimmten Nutzer die Anzahl der Felder/Spalten auszählen, in denen ein Wert steht (ansonsten sind die Felder leer, oder enthalten eine 0).

Das realisiere ich durch die weiter unten abgebildete Foreach-Schleife. Zuerst aber einmal die Query:

PHP:
$result = mysql_query("select * from $tabelle where `nutzer_id`= '".intval($_SESSION["nutzer_id"])."'");
Nun ist das Problem, dass ich (vielmehr das Skript) vorher nicht weiß, ob dieser Nutzer überhaupt in der Tabelle steht. Wenn er nicht in der Tabelle steht, führt die Foreach Schleife logischerweise zur Fehlermeldung:
Warning: Invalid argument supplied for foreach() in C:\xampp\htdocs\01_Vorgabesystem\vorgabe_index.php on line 303
Also soll die Foreach-Schleife nur ausgeführt werden, wenn die SQL-Abfrage auch zu einem Ergebnis führte (wenn also der Nutzer anhand seiner Nutzer_ID in der Tabelle identifiziert werden konnte).

Ansonsten muss der Zählerwert einfach 0 betragen.

Dazu habe ich mir folgende IF / ELSE - Abfrage überlegt, was leider nicht funktioniert: Denn die Foreach-Schleife wird auch ausgeführt, wenn der User NICHT in der Tabelle steht.

PHP:
IF(!isset($result)) { //Wird die User_ID NICHT gefunden?
$counter = 0;
} //Ende IF

ELSE { //Existiert die User_ID - FOREACH ausführen!
$counter = 0; // Counter initialisieren
$fetched = mysql_fetch_row($result);

foreach($fetched as $cell){
   if($cell != 0 || !empty($cell)) {
      $counter++;
   } //Ende IF
} //Ende foreach
} //Ende ELSE
Wie läßt es sich realisieren, dass Foreach nur ausgeführt wird, wenn der User auch in der Tabelle steht und dass ansonsten der Wert des Zählers einfach 0 beträgt?

Vielen Dank für jede Hilfe!
 
Probier mal
PHP:
IF(mysql_num_rows($result) < 1) { //Wird die User_ID NICHT gefunden?
$counter = 0;
} //Ende IF

ELSE { //Existiert die User_ID - FOREACH ausführen!
$counter = 0; // Counter initialisieren
$fetched = mysql_fetch_row($result);

foreach($fetched as $cell){
   if($cell != 0 || !empty($cell)) {
      $counter++;
   } //Ende IF
} //Ende foreach
} //Ende ELSE
 
Danke Dir vielmals! Nun funktioniert es.

Diese Idee hatte ich übrigens auch selbst, war aber fest davon überzeugt, dass es nicht klappen würde, wenn der User NICHT in der Tabelle steht. Ich dachte dann würde mysql_num_rows($result) auch zu einer Fehlermeldung führen.

Gut eines besseren belehrt worden zu sein ;-)

Nochmals vielen Dank!
 
Folgendes wäre ebenfalls möglich:
PHP:
<?php

	$query = '
		SELECT
		        *
		  FROM
		        `'.$tabelle.'`
		  WHERE
		        `nutzer_id`= "'.intval($_SESSION['nutzer_id']).'"
		';
	$result = mysql_query($query)
		or die(mysql_error());
	$rowCount = mysql_num_rows($result);

?>
Falls jedoch wirklich nur die Anzahl der übereinstimmenden Datensätze ausgewählten ermittelt werden soll, dann nimm lieber die MySQL-Funktion COUNT().
 
Ich will prüfen, wieviele Zellen einer Zeile überhaupt mit Inhalten gefüllt sind. Es geht dabei um die Ermittlung, wieviele Aufgaben einer Aufgabenbatterie eine Person bereits bearbeitet hat.

Was genau in den Zellen steht ist unwichtig (das kann nur 1,2,3 oder 4 sein). Wichtig ist lediglich, dass die Zelleninhalte nicht "0" oder "" (leer) sind.

Ist meine Lösung mit Foreach nicht so gut? Funktionieren tut es auf jeden Fall jetzt!
 
Zuletzt bearbeitet:
Es geht auch ohne PHP-Schleife, wenn nur die Anzahl gefüllter Felder interessiert:
SQL:
SELECT
  SUM(IF(IFNULL(`".$cell."`, 0) = 0 OR `".$cell."` = '', 0, 1) AS `anzahl`
FROM
  `".$tabelle."`
WHERE
  `nutzer_id` = '".intval($_SESSION["nutzer_id"])."'
Die Abprüfung mit mysql_num_rows() muss natürlich trotzdem geschehen, aber die foreach()-Schleife kann man sich sparen. Der part OR `".$cell."` = '' muss nur rein, wenn es sich um ein Textfeld (CHAR, VARCHAR, etc.) handelt.

Martin
 
Zuletzt bearbeitet von einem Moderator:
Zurück