Turnos: Gibt es ein maximum an $row abfragen?

guten Morgen,

ich habe in meinem Quellcode einen haufen von $row->irgendwas; Abfragen,

gibt es dafür ein Maximum?

zur erklärung:

Ich habe einen Quellcode der  etwa 36 $row abfragen macht, und diese dann nach und nach ausgibt, jedoch werden ab einer bestimmten Abfrage keine Ausgaben mehr gemacht, Ich habe bereits einige echo "test"; gemacht um zu schauen ob an der Stelle überhaupt etwas ausgegeben werden KANN.

  1. Moin Turnos,

    ich habe in meinem Quellcode einen haufen von $row->irgendwas; Abfragen,

    gibt es dafür ein Maximum?

    Nein.

    Ich habe einen Quellcode der  etwa 36 $row abfragen macht, und diese dann nach und nach ausgibt, jedoch werden ab einer bestimmten Abfrage keine Ausgaben mehr gemacht, Ich habe bereits einige echo "test"; gemacht um zu schauen ob an der Stelle überhaupt etwas ausgegeben werden KANN.

    Ich verstehe immer noch nicht so richtig, was genau du machst, aber ich rate mal:

    Du machst eine Reihe von Datenbank-Abfragen und irgendwann wird die Verarbeitung gestoppt. Ist das richtig?

    Falls ja, prüfe ob eine max_execution_time gesetzt ist.

    Mehr kann man mit den dürftigen Informationen leider nicht sagen.

    LG,
     CK

    1. die max_execution_time ist nicht das Problem, denn die Abfragen danach werden weiterhin bearbeitet

      Die Abfragen sehen wie folgt aus:

      <?php  
      include 'includes/mysql.php';  
      $suchart = $_POST['suchart'];  
      $suchbegriff = $_POST['suchebegriff'];  
      if($suchart == "Identifikationskennzeichnung")  
      {  
      $suchart="identifikationskennung";  
      }else if($suchart == "Farmer Automatic Inventarnummer") {  
      $suchart = "inventarnummer";     	  
      } else  
      {  
      echo "Fehlerhafte Eingabe bei der Suchart";  
      exit;  
      }  
      $abfrage = "SELECT * FROM `pruefung` WHERE `$suchart` LIKE '$suchbegriff'";  
      $ergebnis = mysql_query($abfrage);  
      while($row = mysql_fetch_object($ergebnis))  
      {  
      $anlass1 = $row->anlass;  
      $anlass2 = $row->anlass2;  
      $anlass3 = $row->anlass3;  
      $anlass4 = $row->anlass4;  
      $dokumentation1 = nl2br($row->doku);  
      $dokumentation2 = nl2br($row->doku2);  
      $dokumentation3 = nl2br($row->doku3);  
      $dokumentation4 = nl2br($row->doku4);  
      $schutzklasse1 = nl2br($row->schutzklasse);  
      $schutzklasse2 = nl2br($row->schutzklasse2);  
      $schutzklasse3 = nl2br($row->schutzklasse3);  
      $pruefungsrelevanz = nl2br($row->relevantebesonderheiten);  
      $sichtpruefung1 = nl2br($row->sichtpruefung);  
      $sichtpruefung2 = nl2br($row->sichtpruefung2);  
      $maengel_sicht = nl2br($row->maengel_sicht);  
      $maengelmessung1 = nl2br($row->elektrischemessung);  
      $maengelmessung2 = nl2br($row->elektrischemessung1);  
      $messungmaengel = nl2br($row->messungmaengel);  
      $schutzmassnahmen1 = nl2br($row->schutzmassnahmen);  
      $schutzmassnahmen2 = nl2br($row->schutzmassnahmen2);  
      $schutzmassnahmenauflistung = nl2br($row->schutzmassnahmenliste);  
      $schutzmassnahmen3 = nl2br($row->schutzmassnahmen3);  
      $schutzmassnahmen4 = nl2br($row->schutzmassnahmen4);  
      $schutzmassnahmenmaengel = nl2br($row->schutzmassnahmenmaengel);  
      $sichtpruefungurteil1 = $row->urteilsicht;  
      $testsicht=$row->urteilsicht;  
      $sichtpruefungurteil2 = nl2br($row->urteilsicht2);  
      $sichtpruefungurteil3 = nl2br($row->urteilsicht3);  
      $bgva3urteil1 = nl2br($row->pruefungbgv);  
      $bgva3urteil2 = nl2br($row->pruefungbgv2);  
      $aktuellesdatum = nl2br($row->datum);  
      $pruefer = nl2br($row->pruefer);  
      $naechstepruefung = nl2br($row->naechstepruefung);  
      $inventarnummer = nl2br($row->inventarnummer);  
      $idnummer = nl2br($row->identifikationskennung);  
      $geraetebezeichnung = nl2br($row->geraetebezeichnung);
      
      1. $suchart = $_POST['suchart'];
        $suchbegriff = $_POST['suchebegriff'];
        $abfrage = "SELECT * FROM pruefung WHERE $suchart LIKE '$suchbegriff'";
        $ergebnis = mysql_query($abfrage);

        Wie unsicher ist das denn? Für sowas gibts die "Fristlose"!

        Informiere Dich über mysql_real_escape_string() und über die Problematik des Kontextwechsels allgemein. Wenn Du Zahlen erwartest dann nimm wenigstens intval() oder floatval() um den Typ sicherzustellen.

        Um Dein Problem zu lösen wissen wir nicht genug. Wie wäre es, wenn Du Dir  $abfrage erst mal ausgeben lässt und durch eine Direkteingabe in einem MySQL-Client prüfst, was überhaupt zurück kommt?

        Ferner: Was sagen denn das Error-Log? Möglicherweise enthält eine der Spalten große Datenmengen. Dann könnte auch der Fall eintreten, dass der erlaubte Speicher nicht reicht. Daneben ist die Skriptlaufzeit als weitere Grenze schon angesprochen worden.

        Primitiver Test:
        Was passiert bei einem:

        $suchart = mysql_real_escape_string($_POST['suchart']);
        $suchbegriff = mysql_real_escape_string($_POST['suchebegriff']);
        $abfrage = "SELECT * FROM pruefung WHERE $suchart LIKE '$suchbegriff'";
        $ergebnis = mysql_query($abfrage);
        $i=0;
        while($row = mysql_fetch_object($ergebnis))
        {
          print ++$i."<br />";
        }

        1. Primitiver Test:
          Was passiert bei einem:

          $suchart = mysql_real_escape_string($_POST['suchart']);
          $suchbegriff = mysql_real_escape_string($_POST['suchebegriff']);
          $abfrage = "SELECT * FROM pruefung WHERE $suchart LIKE '$suchbegriff'";
          $ergebnis = mysql_query($abfrage);
          $i=0;
          while($row = mysql_fetch_object($ergebnis))
          {
            print ++$i."<br />";
          }

          Mal davon abgesehen, dass es alles funktioniert hat, bevor ich die Anzahl der $row Abfragen erhöt hab, wird durch deinen Test wie erwartet eine 1 ausgegeben. Der Begriff der aus der Datenbank ausgelesen wird ist ein Wort. also der Speicher kanns also nicht sein. Es sind nur diese 5 Abfragen die nicht funktionieren:

            
          $sichtpruefungurteil1 = $row->urteilsicht;  
          $sichtpruefungurteil2 = nl2br($row->urteilsicht2);  
          $sichtpruefungurteil3 = nl2br($row->urteilsicht3);  
          $bgva3urteil1 = nl2br($row->pruefungbgv);  
          $bgva3urteil2 = nl2br($row->pruefungbgv2);
          
          1. Moin Turnos,

            Mal davon abgesehen, dass es alles funktioniert hat, bevor ich die Anzahl der $row Abfragen erhöt hab, wird durch deinen Test wie erwartet eine 1 ausgegeben. Der Begriff der aus der Datenbank ausgelesen wird ist ein Wort. also der Speicher kanns also nicht sein. Es sind nur diese 5 Abfragen die nicht funktionieren:

            Hast du error_reporting() auf E_ALL gesetzt und display_errors auf on? Oder, alternativ, die Fehler in eine Logfile umleiten lassen?

            Falls ja: gibt es da eine Fehlermeldung?
            Fals nein: mach mal :-)

            LG,
             CK

          2. Hi,

            Es sind nur diese 5 Abfragen die nicht funktionieren:

            $sichtpruefungurteil1 = $row->urteilsicht;

            $sichtpruefungurteil2 = nl2br($row->urteilsicht2);
            $sichtpruefungurteil3 = nl2br($row->urteilsicht3);
            $bgva3urteil1 = nl2br($row->pruefungbgv);
            $bgva3urteil2 = nl2br($row->pruefungbgv2);

              
            und du bist ganz sicher, dass diese Feldnamen alle so in der DB vorkommen? Tippfehler ausgeschlossen?  
            Was sagt ein `var_dump($row);`{:.language-php} nach der Datenbank-Abfrage? Sind die Felder auch in $row vorhanden?  
              
            Für mich sieht es auch irgendwie falsch aus, dass bei $row->urteilsicht2 und $row->urteilsicht3 ein Index-Suffix am Feldnamen hängt, während es bei $row->urteilsicht fehlt. Es wäre schon merkwürdig, wenn man Felder durchnumeriert und dabei das erste unnumeriert lässt.  
              
            So long,  
             Martin  
            
            -- 
            Rizinus hat sich angeblich als sehr gutes Mittel gegen Husten bewährt.  
            Selfcode: fo:) ch:{ rl:| br:< n4:( ie:| mo:| va:) de:] zu:) fl:{ ss:) ls:µ js:(
            
            1. Moin Martin,

              Für mich sieht es auch irgendwie falsch aus, dass bei $row->urteilsicht2 und $row->urteilsicht3 ein Index-Suffix am Feldnamen hängt, während es bei $row->urteilsicht fehlt. Es wäre schon merkwürdig, wenn man Felder durchnumeriert und dabei das erste unnumeriert lässt.

              Hab ich schon oft gesehen, nämlich immer dann wenn die beiden letzten Felder nachträglich hinzugefügt werden… ;-)

              LG,
               CK

              1. Hallo,

                Es wäre schon merkwürdig, wenn man Felder durchnumeriert und dabei das erste unnumeriert lässt.
                Hab ich schon oft gesehen, nämlich immer dann wenn die beiden letzten Felder nachträglich hinzugefügt werden… ;-)

                hmm, könnte eine Erklärung sein. Ich würde in so einem Fall dennoch auch das erste, schon vorhandene Feld nachträglich mitnumerieren, gerade *weil* ich weiß, dass mich das sonst früher oder später wieder irritieren würde.
                Wenn natürlich der Änderungsaufwand sehr groß wird oder die Folgen/Nebenwirkungen nicht mehr überschaubar sind, okay ...

                Ciao,
                 Martin

                --
                Fettflecke werden wieder wie neu, wenn man sie regelmäßig mit etwas Butter einschmiert.
                Selfcode: fo:) ch:{ rl:| br:< n4:( ie:| mo:| va:) de:] zu:) fl:{ ss:) ls:µ js:(
          3. Mal davon abgesehen, dass es alles funktioniert hat, bevor ich die Anzahl der $row Abfragen erhöt hab, wird durch deinen Test wie erwartet eine 1 ausgegeben. Der Begriff der aus der Datenbank ausgelesen wird ist ein Wort. also der Speicher kanns also nicht sein. Es sind nur diese 5 Abfragen die nicht funktionieren:

            $sichtpruefungurteil1 = $row->urteilsicht;
            $sichtpruefungurteil2 = nl2br($row->urteilsicht2);
            $sichtpruefungurteil3 = nl2br($row->urteilsicht3);
            $bgva3urteil1 = nl2br($row->pruefungbgv);
            $bgva3urteil2 = nl2br($row->pruefungbgv2);

              
            Du verwirrst uns.  
              
            Definiere "nicht funktionieren". Ich erinnere nochmals an die Fehlermeldungen im Errorlog oder daran, [das Error-Reporing zu benutzen](https://forum.selfhtml.org/?t=211822&m=1445988) und uns die dortigen Fehlermeldungen zu präsentieren.  
              
            Christian Kruse ist (genau wie mindestens auch der dedlfix) ein "Guru" und es ist für Dein Programm besser, Du machst was die vorschlagen.  
              
            Fred
            
        2. Tach!

          $suchart = mysql_real_escape_string($_POST['suchart']);
          $suchbegriff = mysql_real_escape_string($_POST['suchebegriff']);
          $abfrage = "SELECT * FROM pruefung WHERE $suchart LIKE '$suchbegriff'";

          Wie unsicher ist das denn? Für sowas gibts die "Fristlose"!

          $suchart wird nicht in einen String- sondern einen Identifier-Kontext eingefügt. Für diesen gelten Regeln, die nicht von mysql_real_escape_string() berücksichtigt werden. Die Regel dazu findet man im MySQL-Handbuch im Kapitel zu den Schema Object Names, eine Funktion dafür stellt PHP (und auch die MySQL-Client-API) jedoch nicht zur Verfügung.

          dedlfix.

          1. $suchart wird nicht in einen String- sondern einen Identifier-Kontext eingefügt. Für diesen gelten Regeln, die nicht von mysql_real_escape_string() berücksichtigt werden. Die Regel dazu findet man im MySQL-Handbuch im Kapitel zu den Schema Object Names, eine Funktion dafür stellt PHP (und auch die MySQL-Client-API) jedoch nicht zur Verfügung.

            Stimmt! Du hast Recht!

            Er sollte wenigstens die Backticks rauswerfen:

            $suchart = str_replace('`','',$_POST['suchart']);  
            if ($suchart != $_POST['suchart']) {  
              die ('<h1>Ups!</h1><p>Das Programm weiß jetzt nicht so ganz genau, ob das ein Angriff werden sollte oder nur ein Tippfehler war. Gehen Sie zurück und versuchen Sie es ruhig noch einmal. Das Problem besteht aus Ihrer Eingabe für Suchart, die lautet &quot;'.htmlspecialchars($_POST['suchart']).'&quot; (Das Backtick &quot;<b>`</b>&quot; ist unzulässig.)</p>');  
            }  
            $suchbegriff = mysql_real_escape_string($_POST['suchebegriff']);  
            $abfrage = "SELECT * FROM `pruefung` WHERE `$suchart` LIKE '$suchbegriff'";
            

            ...

            fred

            1. Tach!

              $suchart wird nicht in einen String- sondern einen Identifier-Kontext eingefügt.
              Er sollte wenigstens die Backticks rauswerfen:

              Wieso rauswerfen? Korrekt wäre ein Verdoppeln. Abgesehen davon wäre es noch sinnvoller, den Feldnamen gegen einer Liste der bekannten und erlaubten Feldenamen zu prüfen - sofern es sich nicht um ein generelles MySQL-Verwaltungsprogramm à la phpMyAdmin handelt.

              dedlfix.

              1. Abgesehen davon wäre es noch sinnvoller, den Feldnamen gegen einer Liste der bekannten und erlaubten Feldenamen zu prüfen

                Ich wollte dem Frager nicht damit verärgern, dass ich ihm den Murks auch noch vor die Füße haue. Ich würde nämlich die zulässigen Feldnamen als Array speichern und eine numerische Rückgabe erwarten anhand der ich dann das Array-Element auswähle.

                Wieso rauswerfen? Korrekt wäre ein Verdoppeln.

                Ich hasse exotische Feldnamen (alles ASCII-Buchstaben, dem Unterstrich und Ziffern ist "exotisch"!) in Datenbanken. Da ich sowas gar nicht einführe brauche ich mich mit den resultierenden, ebenfalls exotischen Problemen auch nicht zu beschäftigen.

                Wenn ich sowas zu reparieren habe, dann bin ich gern dazu bereit allen anderen auch zu erklären, das und warum diese mit nicht exotischen Objektnamen leben müssen.

                Aber: Prinzipiell scheinst Du recht zu haben, wenn ich die Referenz an der Stelle richtig verstehe.

                Fred