Ankündigung

Einklappen
Keine Ankündigung bisher.

php/mysql

Einklappen

Neue Werbung 2019

Einklappen
X
  • Filter
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge

  • php/mysql

    Folgender Code:
    PHP-Code:
    // Verbindung zur Datenbank
    $db = new mysqli('localhost','root','','dbname');
    if(
    $db->connect_errno){
      echo 
    "<p>"."Fehler beim Aufbau der Datenbankverbindung!"
      
    ."<br/>Fehlernummer: ".$db->connect_errno."</p>";
    }else{
      echo 
    "<p>"."Aufbau Datenbankverbindung zu 'dbname' hat geklappt!"."</p>";
    }

    // Daten einf&uuml;gen in test
    $tbname 'test';
    $sql "DELETE FROM test;";
    for(
    $k=1;$k<1000;$k++){
      
    $sql .= "INSERT INTO "
              
    .$tbname." (Wert, Sonstiges) 
              VALUES ("
    .$k.", 'bla');";
    }

    $result $db->multi_query($sql);

    // DB-Verbindung schließen und wieder öffnen
    unset($result);
    $db->store_result();
    $db->close();
    $db->connect('localhost','root','','dbname');

    // Ausgabe aller Datensätze
    $sql "SELECT * FROM test;";
    $result $db->query($sql);

    if(!
    $result){
        echo 
    "Fehlerhafte SQL-Abfrage. ".$db->error;
        exit();
      }else{
        while(
    $row=$result->fetch_assoc()){
          echo
          
    "Id: ".$row['Id'].", Wert: ".$row['Wert']
          .
    ", Sonstiges: ".$row['Sonstiges']."<br/>";
        }
      }

    // DB-Verbidnung schließen
    $db->close(); 
    Soweit so gut.
    Der Code läuft, aber seltsam ist:
    Wenn ich die Zählvariable $k ändere, bspw. auf 100, 1000, oder 10.000 etc., dann werden dementsprechend viele Datensätze in die Tabelle eingefügt, aber bei der Ausgabe mit php erscheinen dann nur 437, oder 35, oder 765 Datensätze.
    Ganz willkürlich!

    Erst wenn ich in phpmyadmin kurz die Datenbank wechsle und dann wieder die ursprüngliche DB und darin die entsprechende Tabelle anklicke und danach den php-Code ausführe werden alle Datensätze ausgegeben, also meinetwegen 100, 1000 oder 10.000.

    Könnt ihr mir sagen woran das liegt?

    Eine weitere Sache:
    Zwischendrin schließe und öffne ich die DB-Verbindung.
    Wenn ich es nicht mache gibt es eine Fehlermeldung. Könnt ihr mir sagen warum das so ist?
    Oder habt ihr vlt. sogar noch eine elegantere Lösung?

    Für jeden Tipp dankbar

    lg
    CarterGaines

  • #2
    Hallo,

    das Problem, dass dir eine willkürliche Anzahl an Datensätzen ausgegeben wird, liegt daran, dass das Schreiben der Datensätze zu lange dauert. Das heißt, es stehen noch nicht alle Datensätze in der Datenbank, während du schon versuchst sie wieder auszugeben.

    Durch Einfügen eines Sleep-Befehls zwischen Eintragen und Ausgeben der Daten wäre das Problem schon behoben, alledings nicht sehr schön, deshalb solltest du lieber das Schreiben etwas beschleunigen, indem du zum Beipiel folgendes machst:

    PHP-Code:
    // Alle Daten aus test loeschen
    $sql "DELETE FROM test;";
    $db->query($sql);

    // SQL-Befehl mit Platzhaltern
    $sql 'INSERT INTO `test` (`Wert`, `Sonstiges`) VALUES (?, ?)';

    // Bereite SQL-Befehl fuer Ausfuehrung vor
    $result $db->prepare$sql );

    // Beipieltext
    $text 'bla';

    for(
    $k=1;$k<10000;$k++){
            
    // Variablen den Platzhaltern zuweisen (i - integer; s - string)
            
    $result->bind_param'is'$k$text );
            
    // Befehl ausfuehren
            
    $result->execute();

    das war's schon, nach dieser Änderung kannst du dir übrigens das schließen und wieder öffnen der Datenbank sparen,
    das sollte jetzt auch so funktionieren

    sollten noch Fragen bestehen, kann ich dir folgenden Link empfehlen:
    http://www.phpbuddy.eu/mysqli-erweit...5.html?start=4

    viele grüße

    Kommentar


    • #3
      Zitat von grenztipper Beitrag anzeigen
      Hallo,

      das Problem, dass dir eine willkürliche Anzahl an Datensätzen ausgegeben wird, liegt daran, dass das Schreiben der Datensätze zu lange dauert. Das heißt, es stehen noch nicht alle Datensätze in der Datenbank, während du schon versuchst sie wieder auszugeben.

      Durch Einfügen eines Sleep-Befehls zwischen Eintragen und Ausgeben der Daten wäre das Problem schon behoben, alledings nicht sehr schön, deshalb solltest du lieber das Schreiben etwas beschleunigen, indem du zum Beipiel folgendes machst:

      PHP-Code:
      // Alle Daten aus test loeschen
      $sql "DELETE FROM test;";
      $db->query($sql);

      // SQL-Befehl mit Platzhaltern
      $sql 'INSERT INTO `test` (`Wert`, `Sonstiges`) VALUES (?, ?)';

      // Bereite SQL-Befehl fuer Ausfuehrung vor
      $result $db->prepare$sql );

      // Beipieltext
      $text 'bla';

      for(
      $k=1;$k<10000;$k++){
              
      // Variablen den Platzhaltern zuweisen (i - integer; s - string)
              
      $result->bind_param'is'$k$text );
              
      // Befehl ausfuehren
              
      $result->execute();

      das war's schon, nach dieser Änderung kannst du dir übrigens das schließen und wieder öffnen der Datenbank sparen,
      das sollte jetzt auch so funktionieren

      sollten noch Fragen bestehen, kann ich dir folgenden Link empfehlen:
      http://www.phpbuddy.eu/mysqli-erweit...5.html?start=4

      viele grüße
      SUPER !!!
      Es hat geklappt. Bei kleinen $k's läuft es korrekt.
      Bei großen gibt es aber eine fehlermeldung.
      Bspw. setze ich $k=1.000.000 kommt folgende Fehlermeldung:
      Fatal error: Maximum execution time of 60 seconds exceeded in C:\Programme\xampp\htdocs\test23.php on line 36
      Klar, die Ausführung hat zu lange gedauert.
      Aber wie füge ich denn eine große anzahl an Datensätze ein?
      Hast du da noch weitere Tipps?

      Ich danke dir im Voraus.

      lg
      CarterGaines

      Kommentar


      • #4
        naja du hast da keine IF abfrage.. also prüfe ob insert into ausgeführt wurde und mache dann was anderes..

        diesen Teil hier

        PHP-Code:
        // DB-Verbindung schließen und wieder öffnen
        unset($result);
        $db->store_result();
        $db->close();
        $db->connect('localhost','root','','dbname'); 
        darfst du nur dann machen, wenn acuh alle inhalte eingefügt wurden

        Kommentar


        • #5
          Fatal error: Maximum execution time of 60 seconds exceeded in C:\Programme\xampp\htdocs\test23.php on line 36
          In PHP gibt es eine maximale Ausführungzeit für Scripte, d.h. wird ein Script nicht innerhalb einer gewissen Zeit abgearbeitet, so wird er automatisch mit einem Fehler beendet. In deinem Fall nach 60 Sekunden.

          Du kannst diese Zeit mit set_time_limit(0) auf unbegrenzt setzen.
          http://de3.php.net/set-time-limit

          Kommentar


          • #6
            Zitat von grenztipper Beitrag anzeigen
            Du kannst diese Zeit mit set_time_limit(0) auf unbegrenzt setzen.
            Das wird aber nur auf deinem eigenen Server funktionieren. Provider haben logischerweise diese Funktion abgeklemmt.

            Kommentar


            • #7
              Zitat von BlackScorp Beitrag anzeigen
              naja du hast da keine IF abfrage.. also prüfe ob insert into ausgeführt wurde und mache dann was anderes..

              diesen Teil hier

              PHP-Code:
              // DB-Verbindung schließen und wieder öffnen
              unset($result);
              $db->store_result();
              $db->close();
              $db->connect('localhost','root','','dbname'); 
              darfst du nur dann machen, wenn acuh alle inhalte eingefügt wurden

              Ok, habe jetzt eine if-Abfrage eingefügt und das DB schließen und öffnen hinter die Schleife. Jetzt geht es mit bis zu 250.000 Datensätzen, bei 280.000 einzufügenden Datensätze kommt wieder die Fehlermeldung:
              Fatal error: Maximum execution time of 60 seconds exceeded in C:\Programme\xampp\htdocs\test23.php on line 35
              Weißt du zufällig wo das eingestellt ist, dass eine Ausführung nicht länger als 60 sec. dauern darf?
              Wie kann ich das ändern, so das es kein Limit mehr gibt?
              Ist das php-Sache? Oder ist das im Apache eingestellt?
              Oder gibt es eine andere Möglichkeit das zu umgehen?
              Hier nochmal mein Code:
              PHP-Code:
              <?php

              // Fehler anzeigen
              error_reporting(E_ALL);
              ini_set('display_errors',1);

              // Verbindung zur Datenbank
              $db = new mysqli('localhost','root','','dbname');
              if(
              $db->connect_errno){
                echo 
              "<p>"."Fehler beim Aufbau der Datenbankverbindung!"
                
              ."<br/>Fehlernummer: ".$db->connect_errno."</p>";
              }else{
                echo 
              "<p>"."Aufbau Datenbankverbindung zu 'dbname' hat geklappt!"."</p>";
              }

              // Daten einf&uuml;gen in test
              $tbname 'test';
              $sql "DELETE FROM ".$tbname.";";
              $db->query($sql);

              // SQL-Befehl f&uuml;r Ausf&uuml;hrung vorbereiten
              $sql "INSERT INTO "
                        
              .$tbname." (Wert, Sonstiges) 
                        VALUES (?,?);"
              ;
              $stmt $db->prepare($sql);
                      
              // Beispieltext
              $text "bla";

              for(
              $k=1;$k<280000;$k++){
                
              // Variablen den Platzhaltern zuweisen
                
              $stmt->bind_param('is'$k$text);
                
                
              // Befehl ausf&uuml;hren
                
              $erg $stmt->execute();

                
              // Kontrolle ob Daten eingefügt wurden
                
              if(!$erg){
                  die(
              "Fehler beim Einf&uuml;gen der Daten!");
                }
              }

              // DB-Verbindung schließen und wieder öffnen
              $db->close();
              $db->connect('localhost','root','','dbname');

              // Ausgabe
              $sql "SELECT * FROM test;";
              $result $db->query($sql);

              if(!
              $result){
                  echo 
              "Fehlerhafte SQL-Abfrage. ".$db->error;
                  exit();
                }else{
                  while(
              $row=$result->fetch_assoc()){
                    echo
                    
              "Id: ".$row['Id'].", Wert: ".$row['Wert']
                    .
              ", Sonstiges: ".$row['Sonstiges']."<br/>";
                  }
                }

              // DB-Verbindung schließen
              $db->close();
              ?>

              Kommentar


              • #8
                das ist eine php.ini konfiguration.. wie oben schon beschrieben ist, kannst du das im PHP Code einstellen, jedoch wird es von webspaceanbietern geblockt... die einzige möglichkeit die du hättest, ist die Querys aufzuteilen.. und wieso muss man denn soviele datensätze einpflegen? reichen 260k nicht?

                Kommentar


                • #9
                  Zitat von grenztipper Beitrag anzeigen
                  In PHP gibt es eine maximale Ausführungzeit für Scripte, d.h. wird ein Script nicht innerhalb einer gewissen Zeit abgearbeitet, so wird er automatisch mit einem Fehler beendet. In deinem Fall nach 60 Sekunden.

                  Du kannst diese Zeit mit set_time_limit(0) auf unbegrenzt setzen.
                  http://de3.php.net/set-time-limit
                  SAUBER !!!!!
                  Mit der Funktion klappt es. Ich werde es jetzt mal ein bischen ausreizen.

                  Spricht eigentlich irgendetwas dagegen das Zeitlimit in der php.ini zu ändern?

                  Kommentar


                  • #10
                    Zitat von BlackScorp Beitrag anzeigen
                    das ist eine php.ini konfiguration.. wie oben schon beschrieben ist, kannst du das im PHP Code einstellen, jedoch wird es von webspaceanbietern geblockt... die einzige möglichkeit die du hättest, ist die Querys aufzuteilen.. und wieso muss man denn soviele datensätze einpflegen? reichen 260k nicht?
                    Doch, klar reichen auch 260k, aber es geht um's Prinzip. Das ganze dient erstmal nur zum Testen was mit php und mysql geht und was eben nicht geht.

                    Kommentar


                    • #11
                      Theoretisch kannst du das Skript so lange laufen lassen wie du willst, das ist aber wie bereits gesagt nicht gut. Das Timelimit ist extra deswegen da damit solche Skripte deinen Server nicht überlasten und Endlosschleifen nicht ewig weiter laufen und und und. Von daher wenn du wirklich das Zeitlimit mal höher stellen willst dann 1. nur bei Bedarf (nicht global in der php.ini) und 2. setz es nicht auf unendlich sondern auf nen hohen Wert wie z.b. 60 Minuten, dann wird das Skript wenigstens irgendwann abgebrochen sollte doch mal ne Endlosschleife drin sein.

                      Kommentar


                      • #12
                        Ich veränder die max-execution-time in meinem developement environment nicht, wenn ich jobs hinter mich bringen muss die über diese zeitspanne hinaus laufen sollen erstell ich mir ein PHP-CLI Script und für das mit einem separat angepassten PHP-Interpreter aus.

                        Kommentar

                        Lädt...
                        X