php-resource



Zurück   PHP-Scripte PHP-Tutorials PHP-Jobs und vieles mehr > Entwicklung > SQL / Datenbanken
 

Login

 
eingeloggt bleiben
star Jetzt registrieren   star Passwort vergessen
 

 

 


SQL / Datenbanken Probleme mit SQL? Hier könnt ihr eure Fragen zu SQL (MySQL, PostgreSQL, MS-SQL und andere ANSI-SQL Server) los werden.

Antwort
 
LinkBack Themen-Optionen Thema bewerten
  #1 (permalink)  
Alt 29-11-2007, 09:33
karin-v
 Newbie
Links : Onlinestatus : karin-v ist offline
Registriert seit: Nov 2007
Beiträge: 4
karin-v ist zur Zeit noch ein unbeschriebenes Blatt
Standard insert-select mit "null"-werten

hallo *all,

bin neu in php und mysql und habe folgendes problem:

2 identische datenbanken auf verteilten systemen, die eine ist produktiv, die andere dient als backup und wird täglich mit einem php-script ausgelesen und teilweise rüberkopiert.

das ganze mache ich mit select, implode und insert. der umweg muß sein, weil durch die verteilten systeme 2 connects fällig sind, mein sql-statement aber nur 1 connect verträgt.

das klappt auch alles 100%.

problem jedoch: die table enthält eine INT-spalte, in der die werte "NULL", 0, 1, etc drin stehen und dies wird mir beim kopieren zerstört.

also:

srcTable --> trgTable
NULL --> 0
0 --> 0
4711 --> 4711

hilfe!!!!

was kann man tun??? die struktur der tables ist identisch, die mysql-versionen auch, php auch, alles gleich.

für einen tipp oder eine lösung wäre ich sehr dankbar.

lg, karin
Mit Zitat antworten
  #2 (permalink)  
Alt 29-11-2007, 09:49
H2O
 PHP Junior
Links : Onlinestatus : H2O ist offline
Registriert seit: Jul 2007
Beiträge: 937
H2O ist zur Zeit noch ein unbeschriebenes Blatt
Standard Re: insert-select mit "null"-werten

Zitat:
Original geschrieben von karin-v
das ganze mache ich mit select, implode und insert.
Kann mir darunter leider nicht viel vorstellen, Zeige mal etwas von deinem Code.

Eigentlich gäbe es für solche Fälle ja das Tool mysql_dump, oder auch die Befehle SELECT ... INTO und LOAD DATA ..., aber vielleicht hast du ja Gründe, das anders zu machen.
__________________
Gruss
H2O
Mit Zitat antworten
  #3 (permalink)  
Alt 29-11-2007, 09:50
PHP-Desaster
 PHP Expert
Links : Onlinestatus : PHP-Desaster ist offline
Registriert seit: Mar 2006
Beiträge: 3.105
PHP-Desaster befindet sich auf einem aufstrebenden Ast
Standard

Du musst prüfen, ob ein Nullwert in der Datenbank stand und dies entsprechend wieder einfügen:
PHP-Code:
$query "insert into tabelle ".
  
"set value1=".( is_null$value1 ) ? 'NULL' $value1 ).", ".
  
"    value2=".( is_null$value2 ) ? 'NULL' $value2 ).", ".
 
// ... 
Mit Zitat antworten
  #4 (permalink)  
Alt 29-11-2007, 09:57
karin-v
 Newbie
Links : Onlinestatus : karin-v ist offline
Registriert seit: Nov 2007
Beiträge: 4
karin-v ist zur Zeit noch ein unbeschriebenes Blatt
Standard

das kopieren geht so (connect's und prüfungen mal ausgelassen, hinweis: es dürfen immer nur bestimmte zeiträume kopiert werden, deshalb die WHERE-bedingung):


// Quell-Tabelle lesen und in Ziel-Tabelle schreiben
//
$srcResult = mysql_query("select * from $srcDB.$srcTable
where $srcColVergleich < (from_days(to_days(curdate()) - 0))
and $srcColVergleich >= '$lastReorgDate' " , $srcConnect);


// Weiter: jeden Satz einzeln nehmen und in die Ziel-Tabelle inserten
//
while ($row = mysql_fetch_array($srcResult, MYSQL_ASSOC)) {

$trgResult = mysql_query("insert into $trgDB.$trgTable (".implode(", ",array_keys($row)).") values ('".implode("', '",array_values($row))."') ",
$trgConnect);

}

kommst du klar?
Mit Zitat antworten
  #5 (permalink)  
Alt 29-11-2007, 10:42
ghostgambler
 Master
Links : Onlinestatus : ghostgambler ist offline
Registriert seit: Jul 2004
Ort: DE - NRW
Beiträge: 4.620
ghostgambler ist zur Zeit noch ein unbeschriebenes Blatt
Standard

Zitat:
Original geschrieben von PHP-Desaster
Du musst prüfen, ob ein Nullwert in der Datenbank stand und dies entsprechend wieder einfügen:
PHP-Code:
$query "insert into tabelle ".
  
"set value1=".( is_null$value1 ) ? 'NULL' $value1 ).", ".
  
"    value2=".( is_null$value2 ) ? 'NULL' $value2 ).", ".
 
// ... 
Das dürfte nicht funktionieren.
NULL ist ein interner Wert von MySQL, im Result-Set steht nur "", d.h. entweder gibt is_null() fälschlicherweise bei jedem leeren String 'true' zurück, oder immer 'false'.
Mit Zitat antworten
  #6 (permalink)  
Alt 29-11-2007, 10:44
H2O
 PHP Junior
Links : Onlinestatus : H2O ist offline
Registriert seit: Jul 2007
Beiträge: 937
H2O ist zur Zeit noch ein unbeschriebenes Blatt
Standard

In $row steht bei Null-Werten NULL. In deinem implode() umgibst du nun alle Werte mit Anführungszeichen. Das ist schon bei nummerischen Werten unsauber, aber toleriert. Wenn nun aber NULL zu 'NULL' wird, und du nun diesen Wert in ein nummerisches Feld zu speichern versuchst, wird es als 0 interpretiert.
Es bleibt dir vermutlich mit diesem Ansatz nichts anderes übrig, als auf implode() zu verzichten und die Felder einzeln abzuhandeln.
Deshalb würde ich dir empfehlen die Daten mit SELECT .... INTO OUTFILE in eine Datei zu schreiben, und diese dann anschliessend mit LOAD DATA INFILE wieder einzulesen. Diese Methode ist wahrscheinlich auch schneller.
__________________
Gruss
H2O
Mit Zitat antworten
  #7 (permalink)  
Alt 29-11-2007, 10:54
PHP-Desaster
 PHP Expert
Links : Onlinestatus : PHP-Desaster ist offline
Registriert seit: Mar 2006
Beiträge: 3.105
PHP-Desaster befindet sich auf einem aufstrebenden Ast
Standard

Zitat:
Das dürfte nicht funktionieren.
NULL ist ein interner Wert von MySQL, im Result-Set steht nur "", d.h. entweder gibt is_null() fälschlicherweise bei jedem leeren String 'true' zurück, oder immer 'false'.
Du weißt schon, dass das Käse ist??

Code:
CREATE TABLE test (
  id int(10)
);

INSERT INTO test VALUES (NULL);
INSERT INTO test VALUES (1);
PHP-Code:
$pdo = new PDO$dsn$user$pass );
foreach( 
$pdo->query"select id from test" ) as $row ) {
    
var_dump$row['id'] );

ergibt:
Code:
NULL
string(1) "1"
Mit Zitat antworten
  #8 (permalink)  
Alt 29-11-2007, 11:02
karin-v
 Newbie
Links : Onlinestatus : karin-v ist offline
Registriert seit: Nov 2007
Beiträge: 4
karin-v ist zur Zeit noch ein unbeschriebenes Blatt
Standard

ok,
ich werde mal das mit dem load data ausprobieren und mich wieder melden. wird ein bischen dauern, da ich die funktion noch nicht kenne und etwas üben muß.

schon mal besten dank bis hierhin für die vielen infos!!!!

lg, karin
Mit Zitat antworten
  #9 (permalink)  
Alt 29-11-2007, 11:21
PHP-Desaster
 PHP Expert
Links : Onlinestatus : PHP-Desaster ist offline
Registriert seit: Mar 2006
Beiträge: 3.105
PHP-Desaster befindet sich auf einem aufstrebenden Ast
Standard

Kannst deine implodes ja auch in meinen Vorschlag umbastelt. Brauchst ja lediglich vorher eine Schleife über deine Werte jagen!
Mit Zitat antworten
  #10 (permalink)  
Alt 29-11-2007, 12:13
karin-v
 Newbie
Links : Onlinestatus : karin-v ist offline
Registriert seit: Nov 2007
Beiträge: 4
karin-v ist zur Zeit noch ein unbeschriebenes Blatt
Standard

Zitat:
Original geschrieben von PHP-Desaster
Kannst deine implodes ja auch in meinen Vorschlag umbastelt. Brauchst ja lediglich vorher eine Schleife über deine Werte jagen!
das sieht mir so aus, als müßte man dann die spaltennamen alle kennen. das ist jedoch nicht der fall., oder?

(hängt damit zusammen, daß mein script von einer steuerdatei befüttert wird und in der steuerdatei jede menge tabellen zum kopieren hinterlegt sind, die natürlich alle eine andere struktur haben...)

aber kein thema, ich werde alles ausprobieren, so lange, bis die nuller stimmen!
Mit Zitat antworten
  #11 (permalink)  
Alt 29-11-2007, 13:21
PHP-Desaster
 PHP Expert
Links : Onlinestatus : PHP-Desaster ist offline
Registriert seit: Mar 2006
Beiträge: 3.105
PHP-Desaster befindet sich auf einem aufstrebenden Ast
Standard

Zitat:
das sieht mir so aus, als müßte man dann die spaltennamen alle kennen. das ist jedoch nicht der fall., oder?
Nein, da du deine Werte in einem Array liegen hast, kannst du gut mit foreach arbeiten.
Mit Zitat antworten
  #12 (permalink)  
Alt 29-11-2007, 13:33
H2O
 PHP Junior
Links : Onlinestatus : H2O ist offline
Registriert seit: Jul 2007
Beiträge: 937
H2O ist zur Zeit noch ein unbeschriebenes Blatt
Standard

Selbstverständlich kannst du die mysql_field_name(), mysql_field_typ(), mysql_field_...-Funktionen benutzen, um das herauszufinden, und dann alles mühsam programmieren.
Aber wie gesagt, das gibts ja alles schon und mit vier Zeilen Code (pro Tabelle) (aus denen ich aus Gründen der Lesbarkeit ein paar mehr mache) bist du dabei:
PHP-Code:
$sql "
    SELECT *
    FROM $srcDB.$tabelle
    INTO OUTFILE '/tmp/tab.out'
    FIELDS TERMINATED BY ';'
    OPTIONALLY ENCLOSED BY '\"'
    LINES TERMINATED BY '\n'"
;
$res mysql_query($sql) || die(mysql_error());

$sql "
    LOAD DATA INFILE '/tmp/tab.out'
    INTO TABLE $trgDB.$tabelle
    FIELDS TERMINATED BY ';'
    OPTIONALLY ENCLOSED BY '\"'
    LINES TERMINATED BY '\n'"
;
$res mysql_query($sql) || die(mysql_error()); 
Und für mehrere Tabellen hängst du das noch in eine Schleife und der ganze Backup ist programmiert:
PHP-Code:
foreach $tab_list as $tabelle{

    
// code von vorher

    
unlink('/tmp/tab.out');

__________________
Gruss
H2O
Mit Zitat antworten
  #13 (permalink)  
Alt 29-11-2007, 13:46
PHP-Desaster
 PHP Expert
Links : Onlinestatus : PHP-Desaster ist offline
Registriert seit: Mar 2006
Beiträge: 3.105
PHP-Desaster befindet sich auf einem aufstrebenden Ast
Standard

Vorteil des eigenen Codes ist aber ganz klar: Das funktioniert auch mit anderen DB-Systemen!
Mit Zitat antworten
  #14 (permalink)  
Alt 29-11-2007, 14:48
H2O
 PHP Junior
Links : Onlinestatus : H2O ist offline
Registriert seit: Jul 2007
Beiträge: 937
H2O ist zur Zeit noch ein unbeschriebenes Blatt
Standard

Zitat:
Original geschrieben von PHP-Desaster
Vorteil des eigenen Codes ist aber ganz klar: Das funktioniert auch mit anderen DB-Systemen!
Aber nicht mit den mysql_-Funktionen. Ausserdem läuft SELECT ... INTO OUTFILE und LOAD DATA ... auch mit Oracle. Bei andern Systemen weiss ich es nicht.
__________________
Gruss
H2O
Mit Zitat antworten
  #15 (permalink)  
Alt 29-11-2007, 15:39
PHP-Desaster
 PHP Expert
Links : Onlinestatus : PHP-Desaster ist offline
Registriert seit: Mar 2006
Beiträge: 3.105
PHP-Desaster befindet sich auf einem aufstrebenden Ast
Standard

Zitat:
Aber nicht mit den mysql_-Funktionen.
Na klar, dass nicht, aber ich gehe eh davon aus, das kein Mensch mehr direkt die Funktionen in seinen Skripten nutzt, sondern wenigstens einen Wrapper drumherum hat.
Zitat:
Ausserdem läuft SELECT ... INTO OUTFILE und LOAD DATA ... auch mit Oracle. Bei andern Systemen weiss ich es nicht.
Wenn weitere Systeme das auch implementieren, ist das nicht schlecht. Muss mal nachschlagen, ob der Befehl auch von weiteren Systemen angeboten wird.
Mit Zitat antworten
Antwort

Lesezeichen


Aktive Benutzer in diesem Thema: 1 (Registrierte Benutzer: 0, Gäste: 1)
 

Themen-Optionen
Thema bewerten
Thema bewerten:

Forumregeln
Es ist Ihnen nicht erlaubt, neue Themen zu verfassen.
Es ist Ihnen nicht erlaubt, auf Beiträge zu antworten.
Es ist Ihnen nicht erlaubt, Anhänge hochzuladen.
Es ist Ihnen nicht erlaubt, Ihre Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are an


PHP News

ebiz-trader 7.5.0 mit PHP7 Unterstützung veröffentlicht
ebiz-trader 7.5.0 mit PHP7 Unterstützung veröffentlichtDie bekannte Marktplatzsoftware ebiz-trader ist in der Version 7.5.0 veröffentlicht worden.

28.05.2018 | Berni

Wissensbestand in Unternehmen
Wissensbestand in UnternehmenLebenslanges Lernen und Weiterbilden sichert Wissensbestand in Unternehmen

25.05.2018 | Berni


 

Aktuelle PHP Scripte

PHP Server Monitor

PHP Server Monitor ist ein Skript, das prüft, ob Ihre Websites und Server betriebsbereit sind.

11.09.2018 Berni | Kategorie: PHP/ Security
PHP WEB STATISTIK ansehen PHP WEB STATISTIK

Die PHP Web Statistik bietet Ihnen ein einfach zu konfigurierendes Script zur Aufzeichnung und grafischen und textuellen Auswertung der Besuchern Ihrer Webseite. Folgende zeitlichen Module sind verfügbar: Jahr, Monat, Tag, Wochentag, Stunde Folgende son

28.08.2018 phpwebstat | Kategorie: PHP/ Counter
Affilinator - Affilinet XML Produktlisten Skript

Die Affilinator Affilinet XML Edition ist ein vollautomatisches Skript zum einlesen und darstellen der Affili.net (Partnerprogramm Netzwerk) Produktlisten und Produktdaten. Im Grunde gibt der Webmaster seine Affilinet PartnerID ein und hat dann unmittelb

27.08.2018 freefrank@ | Kategorie: PHP/ Partnerprogramme
 Alle PHP Scripte anzeigen

Alle Zeitangaben in WEZ +2. Es ist jetzt 06:34 Uhr.