MySQL: seltsamer Fehler bei SHOW CREATE TABLE
Berti
- datenbank
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
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....?
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