Ankündigung

Einklappen
Keine Ankündigung bisher.

create table statement wird doppelt abgesetzt

Einklappen

Neue Werbung 2019

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

  • create table statement wird doppelt abgesetzt

    hi,

    ich hatte das thema schon mal in einem anderem thread, da jetzt aber die funktion um die es geht eine andere ist, dachte ich mir das es besser ist das separat zu handhaben.

    folgendes:

    hab eine einfache funktion die mir anhand uebergegebener parameter zunaechst mal eine tabelle mit zwei spalten erzeugt. ist dies erfolgt werden spalten des gleichen typs (nur der name ist anders) hinzugefuegt.

    aber das script ist so einfach, dass man es beim lesen besser versteht als ich es verbal erklaeren koennte:

    Code:
    function createMatrixTable($pCaption1, $pMaxX, $pCaption2, $pMaxY, $pMasterID) {
    
    
    	// function vars
    
    	define("DBName", "test");
    	define("DBServer", "localhost");
    	define("DBUser", "htbase");
    	define("DBPasswd", "reichtum");
    
    	$wrongArgsError = "Argumente falsch \ufffdbergeben, Aufruf: 1.String, 2.Int, 3.String, 4.Int 5.String \n";
    
    	// check args
    
    	if (!is_string(pCaption1) or (!is_int($pMaxX)) or (!is_string($pCaption2))
    	    or (!is_int($pMaxY)) or (!is_string($pMasterID))) {
    		echo "$wrongArgsError";
    		exit;
    
    	} else {
    
    		// create db-conn
    
    		$dbConn = mysql_connect(DBServer, DBUser, DBPasswd) or die("Keine Verbindung m\ufffdglich: ".mysql_error());
    
    		// select db
    		
    		mysql_select_db(DBName) or die("Auswahl der Datenbank fehlgeschlagen");
    
    		// create initial table containing only one column
    
    		$tablename =  $pCaption1 . "_" . $pMaxX ."_" . $pCaption2 . "_" . $pMaxY . "_" . $pMasterID;
    
    		$queryCreateTable = "create table ". $tablename . " (" 
    								    . "ID int auto_increment primary key, "
    								    . $pMasterID .  " varchar(10))";
    
    		var_dump($queryCreateTable);
    				  
    		mysql_query($queryCreateTable) or die("Anfrage fehlgeschlagen create table query: ".mysql_error());
    
    		// add columns
    
    		for($i = 1; $i <= $pMaxX; $i++) {
    			
    			for($j = 1; $j <= $pMaxY; $j++) {
    				
    				$colName = $pCaption1 . "_" . $i . "_" . $pCaption2 . "_" . $j; 
    				$queryAddColumn = "alter table " . $tablename . " add column " . $colName . " float;";
    				mysql_query($queryAddColumn) or die("Anfrage Spalte hinzufuegen fehlgeschlagen: ".mysql_error());
    				
    			}			
    		}
    
    		mysql_close($dbConn);
    	
    	}
    }
    und aufrufen tue ich es so (unter der funktionsdefinition, in der gleichen datei, sonst steht in der datei nichts ):

    Code:
    createMatrixTable("seg", 6, "sli", 6, "masterID");
    rufe ich es nun in der konsole auf (Fedora Core 4):

    Code:
    php createMatrixTables.php
    so laeuft das script beim ersten mal durch und die tabelle wird wie gewuenscht erzeugt, der name waere also nach obigem beispiel seg_6_sli_6_masterID
    (und das ist auch die einzige tabelle die die datenbank enth�t).

    bis hierher alles ok, aber ab jetzt hoert mein verstaendnis auf:

    aendere ich nun den funktionsaufruf:

    Code:
    createMatrixTable("seg", 5, "sli", 5, "masterID");
    also die 6 in die 5 und rufe das script erneut auf:

    Code:
    php createMatrixTables.php
    kriege ich:

    Anfrage fehlgeschlagen create table query: Table 'seg_5_sli_5_masterID' already exists
    zuerst dachte ich, dass mysql vielleicht damit nicht klarkommt dass eine spalte (naemlich die letzte) immer genauso heisst (bis zur masterid) wie der name der tabelle, dem ist nicht so...

    ja, und jetzt steh ich voellig ratlos da und hab nicht die geringste ahnung woran zum geier denn das haengen soll...

    1. warum klappt es genau einmal, naemlich beim ersten funktionsaufruf, danach krieg ich ,obwohl ich die parameter im funktionsauf aendere und damit auch den tabellennamen der neuen tabelle aendere immer obige fehlermeldung

    2. warum gibt es dieses problem ueberhaupt? um diesen fehler zu erhalten muesste ich doch innerhalb der funktion das gleiche "create table" -statement zweimal aufrufen. das tue ich aber nicht wie zu sehen ist.

    danke fuer jeden tip, bin mit meinen ideen am ende.........


  • #2
    Als einzigsten Fehler sehe ich, dass du Konstanten in einer Funktion definierst, die du offenbar mehrfach aufrufst (die Funktion). Das erklärt aber nicht, warum die Tabelle offenbar 2x versucht wird anzulegen. Außerdem würde ich mir die Spalten-Erstellung als String in den Schleifen zusammenbacken und mit einem einzigen Query dann die Tabelle erstellen.

    Sonst sehe ich nichts was nach Fehler aussieht, tippe auf nen Logikfehler von dir im Aufruf.

    Kommentar


    • #3
      Als einzigsten Fehler sehe ich, dass du Konstanten in einer Funktion definierst, die du offenbar mehrfach aufrufst (die Funktion).
      warum ist das ein fehler? unschön ist es, ok, die konstanten hab da nix verloren und sind für die entwicklung drin und würden sich im produktivsystem nicht mehr finden, aber ein fehler?

      aber auch wenn ich die funktion dahingehend ändere (das ist die komplette datei):

      Code:
      <?php
      
      function createMatrixTable($pCaption1, $pMaxX, $pCaption2, $pMaxY, $pMasterID) {
      
      
      	// function vars
      
      	/*
      	define("DBName", "test");
      	define("DBServer", "localhost");
      	define("DBUser", "htbase");
      	define("DBPasswd", "reichtum");
      	*/
      
      	$DBName = "test";
      	$DBServer = "localhost";
      	$DBUser = "htbase";
      	$DBPasswd = "reichtum";
      
      	$wrongArgsError = "Argumente falsch übergeben, Aufruf: 1.String, 2.Int, 3.String, 4.Int 5.String \n";
      
      	// check args
      
      	if (!is_string(pCaption1) or (!is_int($pMaxX)) or (!is_string($pCaption2))
      	    or (!is_int($pMaxY)) or (!is_string($pMasterID))) {
      		echo "$wrongArgsError";
      		exit;
      
      	} else {
      
      		// create db-conn
      
      		$dbConn = mysql_connect($DBServer, $DBUser, $DBPasswd) or die("Keine Verbindung möglich: ".mysql_error());
      
      		// select db
      		
      		mysql_select_db($DBName) or die("Auswahl der Datenbank fehlgeschlagen");
      
      		// create initial table containing only one column
      
      		$tablename =  $pCaption1 . "_" . $pMaxX ."_" . $pCaption2 . "_" . $pMaxY . "_" . $pMasterID;
      
      		$queryCreateTable = "create table ". $tablename . " (" 
      								    . "ID int auto_increment primary key, "
      								    . $pMasterID .  " varchar(10));";
      
      		var_dump($queryCreateTable);
      				  
      		mysql_query($queryCreateTable) or die("Anfrage fehlgeschlagen create table query: ".mysql_error());
      
      		// add columns
      
      		for($i = 1; $i <= $pMaxX; $i++) {
      			
      			for($j = 1; $j <= $pMaxY; $j++) {
      				
      				$colName = $pCaption1 . "_" . $i . "_" . $pCaption2 . "_" . $j; 
      				$queryAddColumn = "alter table " . $tablename . " add column " . $colName . " float;";
      				mysql_query($queryAddColumn) or die("Anfrage Spalte hinzufuegen fehlgeschlagen: ".mysql_error());
      				
      			}			
      		}
      
      		mysql_close($dbConn);
      	
      	}
      }
      
      /*				Script BEGIN				*/
      
      echo "creating tables...\n";
      
      createMatrixTable("seg", 9, "sli", 9, "masterID");
      
      echo "database tables created!\n";
      ?>
      ändert das nichts.......

      Außerdem würde ich mir die Spalten-Erstellung als String in den Schleifen zusammenbacken und mit einem einzigen Query dann die Tabelle erstellen.
      hab mir mal die einzelnen queries (also erst das create table-statement, dann die add column statements) mit var_dump ausgeben lassen und direkt in den mysql-client reinkopiert, gingen alle ohne probleme.......

      ich weiss nicht mehr wo ich den fehler von meiner seite aus suchen sollte........(scheint heute nicht mein tag zu sein, siehe meinen post im js-forum)

      mysql-version von server, client und libs ist 4.0.26, auf der mysql-bug seite zu dieser version steht nicht von bugs die irgendwas damit zu tun haben könnten........

      noch irgendwelche ideen?

      Kommentar


      • #4
        An deiner Funktion wird das Problem nicht liegen. Aber anscheinend rufst du die Funktion zwei Mal auf. Setze einfach mal eine Ausgabe an den Anfang der Funktion und du wirst vermutlich zwei Mal diese Ausgabe "bewundern" können.

        Kommentar


        • #5
          Zitat von supersucker
          warum ist das ein fehler? unschön ist es, ok, die konstanten hab da nix verloren und sind für die entwicklung drin und würden sich im produktivsystem nicht mehr finden, aber ein fehler?
          Beim 2. Aufruf der Funktion wird doch versucht, bereits deklarierte Konstanten neu zu deklarieren. Klar ist das ein Fehler, es sei denn du benutzt die Funktion garantiert nur 1x pro Skript-Ausführung, unschön ist es aber allemal. Konstanten gehören wie requires/includes an den Anfang der Datei. Konstanten ohne Ausnahme! Das ist eben üblich und macht auch Sinn.

          Zu deinem Problem, mach mal

          PHP-Code:
          $fp=fopen('log.txt','a') or die('log.txt error'); fputs($fp,microtime().";Skript\n");fclose($fp); 
          An den Anfang deines Skriptes (in die Datei) und das gleiche nochmal direkt an oberster Stelle IN deiner Funktion:

          PHP-Code:
          $fp=fopen('log.txt','a'); fputs($fp,sprintf("%s;Funktion;%s;%s;%s;%s;%s\n"microtime(), $pCaption1$pMaxX$pCaption2$pMaxY$pMasterID);fclose($fp); 
          Darin müsste jetzt der Ablauf protokolliert sein.
          Wenn das nicht klappt: Debugger benutzen.[/php]

          Kommentar


          • #6
            $@%@§§&!!!!!

            ok, bevor ich mich für die nächsten paar stunden in die ecke stelle und schäme möchte ich noch kurz erläutern was jetzt schlußendlich der fehler war:

            ich verwende seit ewigkeiten eclipse für java, C++ und den ganzen rest, für php hab ich bisher quanta genommen. hab jetzt quanta wieder runtergeschmissen und das eclipse-php-plugin installiert und verwendet.
            so weit so gut. was ich nicht wußte ist das eclipse bei jedem speichern des php-files im editor im hintergrund den soeben gespeicherten code automatisch ausführt..... die funktion wurde also tatsächlich zweimal oder öfter aufgerufen, allerdings weder manuell von mir noch über irgendein script sondern von eclipse........

            und wenn ich als view in eclipse den php-browser aktiviert hätte (was ich bis vor 5 minuten nicht hatte weil ich das ding recht lästig finde) dann hätte ich auch gesehen das der code bei jedem speichern auch gleich von eclipse ausgeführt wird.........

            ja, danke für die hilfe soweit............

            Kommentar


            • #7
              War irgendwie fast klar, dass es so ein Murgs war

              Kommentar

              Lädt...
              X