Berti: MySQL: seltsamer Fehler bei SHOW CREATE TABLE

Hallo, ich möchte ein Backup-Skript für einen Webshop entwickeln.

Leider komme ich nicht dahinter, was ab einer best. Stelle der Tabellen-Auflistung diese Meldungen verursacht:

  
Warning: mysql\_fetch\_row(): supplied argument is not a valid MySQL  
result resource in ...  

Es geht dabei um die Anweisungen:

  
echo $sql = "SHOW CREATE TABLE `" . $aktuelle\_tabelle . "`";  
$create\_ergebnis = mysql\_query ( $sql, $verbindung\_quelldatenbank );  
  
...  
  
while ( $arr2 = mysql\_fetch\_row ( $create\_ergebnis ) )  
  

Da steht also ab einer best. Tabelle - vorher ja nicht, aber ab dann kommt die Meldung bei allen nachfolgenden Versuchen, den Generierungscode zu ermitteln - was Ungültiges drin.

Bemerkenswert also dabei: Sobald bei der ersten betroffenen Tabelle was ungültig ist, sind die folgenden auch betroffen...

Was hab ich nun für Möglichkeiten, dahinterzukommen, was da ungültig ist?

(Es geht um einen xt:Commerce, die erste betroffene Tabelle ist customers_status)

__________________________________________________________________________

<?

	    $verbindung\_quelldatenbank = mysql\_connect ( ... );  
      if ( $verbindung\_quelldatenbank == false )  
      {  
		        echo "Keine Verbindung zur Datenbank!";  
		        die ( );  
      }  
  
			$select = mysql\_select\_db ( ..., $verbindung\_quelldatenbank );  
      if ( $select == false )  
      {  
         		die ( "Datenbank kann nicht selektiert werden!" );  
      }  
	  
	  
	  
	    $verbindung\_zieldatenbank = mysql\_connect ( ... );  
      if ( $verbindung\_zieldatenbank == false )  
      {  
		        echo "Keine Verbindung zur Datenbank!";  
		        die ( );  
      }  
  
			$select = mysql\_select\_db ( ..., $verbindung\_zieldatenbank );  
      if ( $select == false )  
      {  
         		die ( "Datenbank kann nicht selektiert werden!" );  
      }  


			$tabellen = mysql\_list\_tables ( ..., $verbindung\_quelldatenbank );  

			while ( $table\_row = mysql\_fetch\_row ( $tabellen ) )  
			{  
						  
						$aktuelle\_tabelle = $table\_row [ 0 ];  
					  
						  
						$sql = "DROP TABLE " . $aktuelle\_tabelle;  
						mysql\_query ( $sql, $verbindung\_zieldatenbank );  
						  
						echo $sql = "SHOW CREATE TABLE `" . $aktuelle\_tabelle . "`";  
						  
						$create\_ergebnis = mysql\_query ( $sql, $verbindung\_quelldatenbank );  
						  
						echo "<br>";  
						  
						$z = 0;  
						  
						while ( $arr2 = mysql\_fetch\_row ( $create\_ergebnis ) )  
						{  
									$tabellen\_aufbau = trim($arr2[1]).';'."\n";  
									echo "Tabelle aufbauen...<br>";  
									mysql\_query ( $tabellen\_aufbau, $verbindung\_zieldatenbank );  
									echo $sql = "SELECT \* FROM " . $aktuelle\_tabelle;  
																		$ergebnis2 = mysql\_query ( $sql, $verbindung\_quelldatenbank );  
									while ( $arr3 = mysql\_fetch\_object ( $ergebnis2 ) )  
									{  
														$spalte\_string 	= "";  
														$value\_string 	= "";  

									  
														foreach ( $arr3 as $spalte => $value )  
														{  
															  
																		 if ( strlen ( $spalte\_string ) > 0 )  
																		 {  
																		 			$spalte\_string 	.= ", ";  
																		 }  
																		  
																		 $spalte\_string 	.= 	$spalte;  
						  
						  
																		 if ( strlen ( $value\_string ) > 0 )  
																		 {  
																		 			$value\_string 	.= ", ";  
																		 }  
						  
						  
																		 $value\_string 		.= 	"'" . addslashes ( $value ) . "'";  
															  
														}  
														  
														$sql = "INSERT INTO " . $aktuelle\_tabelle . " (" . $spalte\_string . ") VALUES (" . $value\_string . ")";  
														mysql\_query ( $sql, $verbindung\_zieldatenbank );  
								}  
																	  
						}  

						  
			}  
			  
			mysql\_close ( $verbindung\_zieldatenbank );  
			mysql\_close ( $verbindung\_quelldatenbank );  

?>

__________________________________________________________________________

ciao Berti

  1. Gerade hab ich noch versucht, die Tabellen erstmal am Fließband zu erstellen, um sie dann ebenfalls am Fließband zu befüllen. Ergebnis: Manche Tabellen wurden auf die Weise nicht angelegt. Wenn ich dagegen eine Verzögerung (sleep() in PHP) nach jeder Query einbaue, gehts.

    Muss das Skript bei Tabellen-Struktur-Befehlen also irgendwie auf MySQL warten....?

  2. Hallo,

    echo $sql = "SHOW CREATE TABLE " . $aktuelle\_tabelle . "";
    $create_ergebnis = mysql_query ( $sql, $verbindung_quelldatenbank );

    ...

    while ( $arr2 = mysql_fetch_row ( $create_ergebnis ) )

    Bemerkenswert also dabei: Sobald bei der ersten betroffenen Tabelle was ungültig ist, sind die folgenden auch betroffen...

    Bemerkenswert ist dabei, dass Du den Fehlerfall nicht prüfst. mysql_query() liefert im Gegensatz zu Deiner Annahme nicht immer eine Ressource zurück.

    Was hab ich nun für Möglichkeiten, dahinterzukommen, was da ungültig ist?

    Eine Fehlerbehandlung einbauen und mysql_error() nutzen.

    Grundsätzlich nähme ich bei einem neuen Skript die dringend empfohlene verbesserte MySQL-Erweiterung mysqli und nicht mehr die veralteten und weniger leistungsfähigen mysql_*-Funktionen.

    Freundliche Grüße

    Vinzenz