Jnnbo: Einträge zusammen zählen lassen

Moin,

ich lasse so meine Artikel ausgeben

	function produkte($mysqli) {
		$stmt = $mysqli->prepare("SELECT p_id, p_type, p_pkategorie, p_code, p_hersteller, p_serie, p_geraet, p_bezeichnung, p_bild, p_artnr, p_farbe, p_inhalt, p_preis, p_bestand, p_hinweis, p_status 
					FROM web_produkte");
		$stmt->execute();
		$stmt->bind_result($p_id, $p_type, $p_pkategorie, $p_code, $p_hersteller, $p_serie, $p_geraet, $p_bezeichnung, $p_bild, $p_artnr, $p_farbe, $p_inhalt, $p_preis, $p_bestand, $p_hinweis, $p_status);
		$stmt->store_result();
	 	
		if($stmt->num_rows() >  0) {     
			while ($stmt->fetch()){
				$produkte[] = array( 
					'p_id' 				=> $p_id,
					'p_type'			=> $p_type,
					'p_pkategorie'		=> $p_pkategorie, 
					'p_code'			=> $p_code,
					'p_hersteller' 		=> $p_hersteller, 
					'p_serie' 			=> $p_serie, 
					'p_geraet' 			=> $p_geraet, 
					'p_bezeichnung' 	=> $p_bezeichnung, 
					'p_bild' 			=> $p_bild, 
					'p_artnr' 			=> $p_artnr, 
					'p_farbe' 			=> $p_farbe, 
					'p_inhalt' 			=> $p_inhalt, 
					'p_preis' 			=> $p_preis,
					'p_bestand'			=> $p_bestand, 
					'p_hinweis'			=> $p_hinweis,
					'p_status'			=> $p_status
				);
			}
			return $produkte;
			}
	}

In $stmt->num_rows() steht die Anzahl, richtig? Wie kann ich diese Anzahl auf meiner Seite ausgeben lassen? Ich stehe gerade voll auf dem Schlauch :/

  1. Hi,

    In $stmt->num_rows() steht die Anzahl, richtig? Wie kann ich diese Anzahl auf meiner Seite ausgeben lassen?

    echo $stmt->num_rows();

    cu,
    Andreas a/k/a MudGuard

    1. Hallo MudGuard,

      echo $stmt->num_rows();

      das war natürlich das erste was ich getestet habe, da erhalte ich dann allerdings ein Fehler:

      "mysqli_stmt::num_rows(): Couldn't fetch mysqli_stmt"

      ich denke das echo muss ich innerhalb der Funktion tätigen?

  2. Tach!

    In $stmt->num_rows() steht die Anzahl, richtig?

    Jein, num_rows ist eine Eigenschaft, eine Methode num_rows gibt es nicht.

    Und die Anzahl sollte man nur dann daraus entnehmen, wenn man auch die Ergebnismenge haben möchte. num_rows kann nämlich nur auf dem Client zählen und muss dazu die gesamte Ergebnismenge abgeholt haben, was PHPs MySQL-Treiber im Hintergrund erledigen, wenn man das nicht explizit anders verlangt.

    Will man lediglich die Anzahl haben, ohne die Datensätze zu verwenden, sollte man sie mit COUNT(*) zählen lassen. Dann entsteht eine Ergebensmenge von nur einem Datensatz mit einem Wert.

    Wie kann ich diese Anzahl auf meiner Seite ausgeben lassen? Ich stehe gerade voll auf dem Schlauch :/

    So wie jedes andere Datum (Einzahl von Daten) auch, beispielswiese mit echo.

    dedlfix.

    1. Tach!

      num_rows kann nämlich nur auf dem Client zählen und muss dazu die gesamte Ergebnismenge abgeholt haben, was PHPs MySQL-Treiber im Hintergrund erledigen, wenn man das nicht explizit anders verlangt.

      Und man muss dazu das PHP-Handbuch lesen. Im Zusammenhang mit Prepared Statements muss man vorher noch die Methode store_result() aufrufen.

      dedlfix.

    2. Hallo dedlfix,

      Will man lediglich die Anzahl haben, ohne die Datensätze zu verwenden, sollte man sie mit COUNT(*) zählen lassen. Dann entsteht eine Ergebensmenge von nur einem Datensatz mit einem Wert.

      also meinst du so?

      	function produkte($mysqli) {
      		$stmt = $mysqli->prepare("SELECT count(*) as total, p_id, p_type, p_pkategorie, p_code, p_hersteller, p_serie, p_geraet, p_bezeichnung, p_bild, p_artnr, p_farbe, p_inhalt, p_preis, p_bestand, p_hinweis, p_status 
      									FROM web_produkte");
      		$stmt->execute();
      		$stmt->bind_result($total, $p_id, $p_type, $p_pkategorie, $p_code, $p_hersteller, $p_serie, $p_geraet, $p_bezeichnung, $p_bild, $p_artnr, $p_farbe, $p_inhalt, $p_preis, $p_bestand, $p_hinweis, $p_status);
      		$stmt->store_result();
      	 	
      		if($stmt->num_rows() >  0) {     
      			while ($stmt->fetch()){
      				$produkte[] = array( 
      					'total' 			=> $total,
      					'p_id' 				=> $p_id,
      					'p_type'			=> $p_type,
      
      1. Tach!

        also meinst du so?
        if($stmt->num_rows() > 0) {

        Grundlagenwissen: Was ist der syntaktische Unterschied zwischen Eigenschaften und Methoden? Das eine verwendet man wie Funktionen mit Klammern, das andere nicht.

        dedlfix.

        1. Hallo dedlfix,

          also wenn ich dieses ausführen lasse

          SELECT count(*) as total, p_id, p_type, p_pkategorie, p_code, p_hersteller, p_serie, p_geraet, p_bezeichnung, p_bild, p_artnr, p_farbe, p_inhalt, p_preis, p_bestand, p_hinweis, p_status 
          FROM web_produkte
          

          erhält meine Ausgabe nur einen Eintrag. Lasse ich das count() as total weg, habe ich wieder alle.

          1. Hallo,

            laut php.net sollte es so gehen: printf("Einträge: %d\n", $stmt->num_rows);

            function produkte($mysqli) {
            	$stmt = $mysqli->prepare("SELECT p_id, p_type, p_pkategorie, p_code, p_hersteller, p_serie, p_geraet, p_bezeichnung, p_bild, p_artnr, p_farbe, p_inhalt, p_preis, p_bestand, p_hinweis, p_status 
            				FROM web_produkte");
            		$stmt->execute();
            		$stmt->bind_result($p_id, $p_type, $p_pkategorie, $p_code, $p_hersteller, $p_serie, $p_geraet, $p_bezeichnung, $p_bild, $p_artnr, $p_farbe, $p_inhalt, $p_preis, $p_bestand, $p_hinweis, $p_status);
            		$stmt->store_result();
            		printf("Einträge: %d\n", $stmt->num_rows);
            	 	
            		if($stmt->num_rows() >  0) {     
            			while ($stmt->fetch()){
            				$produkte[] = array( 
            					'p_id' 				=> $p_id,
            					'p_type'			=> $p_type,
            

            Ich bekomme auch eine Zahl angezeigt, 357 meine Db zeigt zwar 363 an, kann aber sein, ich habe ein paar gelöscht. Allerdings ich benötige die Zahl in einer Varivale, dass ich die auf der Seite plazieren kann.

            1. Tach!

              laut php.net sollte es so gehen: printf("Einträge: %d\n", $stmt->num_rows);

              Es geht auch mit echo. Du musst es nur $stmt->num_rows richtig notieren und nicht als Methodenaufruf: $stmt->num_rows().

              Ich bekomme auch eine Zahl angezeigt, 357 meine Db zeigt zwar 363 an, kann aber sein, ich habe ein paar gelöscht.

              Ist InnoDB die Storage-Engine und phpMyAdmin derjenige, der die Anzahl anzeigt? Diese kommt dann nicht von einem Zählen, was eine exakte Zahl liefern würde, sondern aus einem Statistikdatenspeicher, der nicht ständig aktualisiert wird.

              Allerdings ich benötige die Zahl in einer Varivale, dass ich die auf der Seite plazieren kann.

              Eine Property ist schon wie eine Variable. Was versprichst du dir von einer weiteren Variable? Und warum machst du dann keine Zuweisung, wie man das bei Variablen macht?

              dedlfix.

              1. Hallo dedlfix,

                Es geht auch mit echo. Du musst es nur $stmt->num_rows richtig notieren und nicht als Methodenaufruf: $stmt->num_rows().

                ich hatte es ja schon so

                $stmt->bind_result($p_id, $p_type, $p_pkategorie, $p_code, $p_hersteller, $p_serie, $p_geraet, $p_bezeichnung, $p_bild, $p_artnr, $p_farbe, $p_inhalt, $p_preis, $p_bestand, $p_hinweis, $p_status);
                		$stmt->store_result();
                		
                		$test = $stmt->num_rows;
                	 	
                		if($stmt->num_rows() >  0) {     
                			while ($stmt->fetch()){
                				$produkte[] = array( 
                					'p_id' 				=> $p_id,
                					'p_type'			=> $p_type,
                

                allerdings weiß ich dann nicht, wie ich dieses auf meiner Seite ausgeben kann, ich benötige das vor der Schleife in den dann meine Einträge sind, das ist ja mein Problem.

                1. Tach!

                  Es geht auch mit echo. Du musst es nur $stmt->num_rows richtig notieren und nicht als Methodenaufruf: $stmt->num_rows().

                  ich hatte es ja schon so

                    if($stmt->num_rows() >  0) {     
                  

                  Da ist es immer noch als Methodenaufruf drin.

                  allerdings weiß ich dann nicht, wie ich dieses auf meiner Seite ausgeben kann, ich benötige das vor der Schleife in den dann meine Einträge sind, das ist ja mein Problem.

                  Es steht ja schon vor der Schleife. Wenn du dein Script immer noch nicht nach EVA-Prinzip strukturiert hast, dann musst du die Zahl vor der Schleife ermitteln und ausgeben, wenn in ihr die Datensätze geholt und auch gleich ausgegeben werden.

                  dedlfix.

                  1. Hallo dedlfix,

                    ich lass es einfach, bringt ja nichts. Danke für die Hilfe bis hierhin.

                    1. Hallo,

                      ich habe eine zweite Funktion erstellt:

                      		function produkteCount($mysqli) {
                      		$stmt = $mysqli->prepare("SELECT count(p_id) as total, p_id 
                      									FROM web_produkte");
                      		$stmt->execute();
                      		$stmt->bind_result($total, $p_id);
                      		$stmt->store_result();
                      	 	
                      		if($stmt->num_rows() >  0) {     
                      			while ($stmt->fetch()){
                      				$produkteCount[] = array( 
                      					'total' 				=> $total,
                      					'p_id'			=> $p_id
                      				);
                      			}
                      			return $produkteCount;
                      			
                      			}
                      	}
                      
                      

                      Und die Ausgabe dann so:

                      $produkteCount = produkteCount($mysqli);
                      
                      foreach($produkteCount as $arrayCount){ 
                      echo $arrayCount['total'];
                      }
                      

                      anderes bekomme ich es nicht hin

          2. Tach!

            also wenn ich dieses ausführen lasse

            SELECT count(*) as total, p_id, p_type, p_pkategorie, p_code, p_hersteller, p_serie, p_geraet, p_bezeichnung, p_bild, p_artnr, p_farbe, p_inhalt, p_preis, p_bestand, p_hinweis, p_status 
            FROM web_produkte
            

            erhält meine Ausgabe nur einen Eintrag. Lasse ich das count() as total weg, habe ich wieder alle.

            Ja klar, weil COUNT(*) eine Aggregatfunktion ist. Die führt alle Ergebnisse der Ergebnismenge zu einer Zeile zusammen. Oder bei Gruppen zu einer je Gruppe. COUNT(*) ist dafür da, die Anzahl der betroffenen Datensätze zu zählen. Die Datensätze selbst landen nicht in der Ergebnismenge.

            Die Frage ob COUNT(*) oder num_rows das Mittel der Wahl ist, hängt von der Aufgabenstellung ab. Benötigst du nur die Anzahl, dann nimm COUNT(*). Benötigst du die Datensätze ebenfalls, dann nimm num_rows (und store_result) zusätzlich zum Fetchen. Gehen wir von letzterem aus, ist dein Fehler nicht im SQL-Bereich zu suchen, sondern eine Wissenslücke im Bereich OOP. Deshalb bitte Grundlagenwissen aneignen: Was sind Eigenschaften (properties) und was sind Methoden (methods). Und wie notiert man das, wenn man Eigenschaften auslesen möchte und wie wenn man Methoden ausführen möchte.

            dedlfix.