[Funktion] fehler in sleep()??

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

  • [Funktion] fehler in sleep()??

    Hi 2 all,

    bin neu hier im Forum und muss euch gleich mit einer wichtigen Frage belästigen

    Und zwar:
    Es geht darum einer Interbase/Firebird Datenbank eine Tabelle sowie Trigger und Generator hin zu zufügen.
    Vorerst muss ich gleich mal sagen das jede Funktion, die zum Hinzufügen der Tabelle sowie die für Trigger und Generator, einzeln gestartet funktionieren.
    Nun ist es nur so das anscheinend die beiden Funktionen zu schnell hintereinander gestartet werden und somit veruscht wird den Trigger zu erzeugen bevor die Tabelle existiert.
    Nun gut, ich wollte das ganze mit

    PHP-Code:
    sleep(5); 
    umgehen, nur leider funktioniert dies nicht so wie ich mir das vorstelle...

    Hätte vieleicht jemand für dieses Problem einen Lösungsansatz?

    Ciao


  • #2
    Hi,

    was passiert denn, wenn du sleep verwendest? Wenn du die Tabelle erzeugst und dann das Skript 5 Sekunden schlafen lässt, dann sollte es doch klappen - kenne mich allerdings mit Interbase bzw. Firebird nicht aus.

    Gruß

    Kommentar


    • #3
      Re: [Funktion] fehler in sleep()??

      Original geschrieben von Erazor2

      Nun ist es nur so das anscheinend die beiden Funktionen zu schnell hintereinander gestartet werden und somit veruscht wird den Trigger zu erzeugen bevor die Tabelle existiert.
      Das kann schon mal nicht sein, weil PHP ein Zeilen-Interpreter ist, d.h. jeder Befehlt, jeder Funktionsaufruft wird hintereinander abgearbeitet. Wenn PHP eine Fkt. aufruf, welche eine Interbase-Operation durchführt, wartet PHP solange bis eine Rückmeldung von Interbase kommt, ob die Operation erfolgreich ist oder nicht, erst dann wird der nächste Programmschritt eingeleitet. Also parallelle Abarbeitung gibt es nicht in PHP. Such mal den Fehler woanders.

      Ich vermute, du hast keine Fehlerabfang bei Datenbankoperationen programmiert und gehst immer davon aus, dass alles korrekt ausgeführt wurde. Wenn das Anlegen der Tabelle mislungen ist, und du im Programm nicht erkennst und entsprechend reagierst, sondern du jagst einfach die nächste Operation hinterher, dann sollst du dich nicht wundern, warum es nicht funz.

      Kommentar


      • #4
        also... mir ist klar das PHP ein Zeilen Interpreter ist, deswegen wundert mich das ganze ja auch....
        Jedenfalls ist es so das jede funktion einzeln gestartet,

        create_table('tablename');

        sowie

        create_gentri('tablename');

        beide einwandfrei das gewünschte ergebnis liefern, nur eben nicht wenn ich sie gleichzeitig in einem Script verwende.

        Der Fehler taucht sozusagen in der install.php auf, wenn ich zuerst den teil für den Generator auskommentiere und das Script aufrufe wird die Datenbank korrekt angelegt und danach den Teil für die Datenbank auskommentiere werden auch Generator und Trigger korrekt angelegt, nur eben nicht wenn ich die beiden Teile gleichzeitig im Script habe.

        PHP-Code:
        ///install.php


        include('config.inc');
        include(
        'functions.inc');
        echo 
        "<h1>Daten werden in die Datenbank eingetragen</h1>";

        //Anlegen der Tabelle
        if(ibase_query($ib_db_verbindung,create_table($ib_db_tablename))){
                echo 
        "<b>Tabelle wurde angelegt...</b>";
                
        ibase_close;
                }else{
                      echo 
        "<b>Fehler beim Anlegen der Tabelle!!!</b>";
                     }



        echo 
        "<br><br>";


        //Anlegen von Generator und Trigger
        flush();
        sleep(5);

        $isql  "SET NAMES NONE;\n"
                 
        ."CREATE GENERATOR GEN_".$ib_db_tablename."_ID;\n"
                 
        ."SET TERM ^ ;\n"
                 
        ."CREATE TRIGGER SET_".$ib_db_tablename."_ID FOR ".$ib_db_tablename." ACTIVE BEFORE INSERT POSITION 0 AS BEGIN NEW.".$ib_db_tablename."_ID = GEN_ID(GEN_".$ib_db_tablename."_ID, 1); END ^\n"
                 
        ."SET TERM ; ^\n"
                 
        ."EXIT; \n";

        $file build_sql_file($isql);
        $tmp_out TMPPATH.uniqid('').'.out';
        $parameters =  sprintf(' %s -u %s -p %s -i %s -o %s'$ib_server.':'.$ib_db_path$ib_user$ib_passibwa_escapeshellarg($file), ibwa_escapeshellarg($tmp_out));

        $result exec_command('isql'$parameters); 
        PHP-Code:
        ///functions.inc

        function create_table($table_name){
                 include(
        'config.inc');
                 
        $table_name strtoupper($table_name);
                 
        $ib_db_col1][0] = strtoupper($ib_db_col1][0]);
                 
        $creat_table_query =  'CREATE TABLE '.$table_name.'(';

                 foreach(
        $ib_db_col as $col){
                          if(
        $col[4]){
                                  
        $creat_table_query .= $col[0].' '.$col[2].' NOT NULL, ';
                                  }else{
                                        
        $creat_table_query .= $col[0].' '.$col[2].', ';
                                          }
                         }
                 
        $creat_table_query .= 'PRIMARY KEY ('.$ib_db_col1][0].'))';
                 return 
        $creat_table_query;

                }




        function 
        create_trigger() {
                         include(
        'config.inc');
                         
        $isql  "SET NAMES NONE;\n"
                         
        ."CREATE GENERATOR GEN_".$ib_db_tablename."_ID;\n"
                         
        ."SET TERM ^ ;\n"
                         
        ."CREATE TRIGGER SET_".$ib_db_tablename."_ID FOR ".$ib_db_tablename." ACTIVE BEFORE INSERT POSITION 0 AS BEGIN NEW.".$ib_db_tablename."_ID = GEN_ID(GEN_".$ib_db_tablename."_ID, 1); END ^\n"
                         
        ."SET TERM ; ^\n";

                         
        $file build_sql_file($isql);
                         
        $tmp_out TMPPATH.uniqid('').'.out';
                         
        $parameters =  sprintf(' %s -u %s -p %s -i %s -o %s'$ib_server.':'.$ib_db_path$ib_user$ib_passibwa_escapeshellarg($file), ibwa_escapeshellarg($tmp_out));

                         
        $result exec_command('isql'$parameters);
        }





        function 
        build_sql_file($sql){
            include(
        'config.inc');
            
        $sql str_replace("\r\n""\n"$sql);
            
        $sql .= "\n";
            
        $tmp_name TMPPATH.uniqid('').'.sql';

            if (
        $fp fopen ($tmp_name'a')) {
                
        fwrite($fp$sql);
                
        fclose($fp);
            }

            return 
        $tmp_name;
        }



        function 
        ibwa_escapeshellarg($str) {
            include(
        'config.inc');
            return !empty(
        $str) ? '"' str_replace('"''\"'$str) . '"' '';
        }




        function 
        exec_command($cmd$parameters$stderr=FALSE) {
            include(
        'config.inc');
            
        $is_windows = (stristr(php_uname(), 'wind') == TRUE) ? TRUE FALSE;

            if ((
        $is_windows  &&  !is_file(BINPATH.$cmd.'.exe'))  &&  !is_file(BINPATH.$cmd)) {

                return array(array(), 
        sprintf($GLOBALS['ERRORS']['BAD_BINPATH'], BINPATH.$cmd));
            }

            
        $fcmd $cmd." ".$parameters . (($stderr  &&  !$is_windows) ? ' 2>&1' '');

            
        $err '';
            
        $out = array();
            
        $olddir getcwd();
            if (!
        chdir(BINPATH)) {
                echo 
        "Kann nicht auf Order ".BINPATH." zugreifen!!!";
            }
            else {
                
        $path_prefix = ($is_windows) ? '' './';

                
        exec($path_prefix.$fcmd$out$retval);

                if (
        $retval != 0  && $retval != 1) {
                    
        $err BINPATH.$cmd.' returned error code '.$retval;
                }
                
        chdir($olddir);
            }

            return array(
        $out$err);

        Kommentar

        Lädt...
        X