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 Bewertung: Bewertung: 1 Stimmen, 5,00 durchschnittlich.
  #1 (permalink)  
Alt 11-10-2006, 13:33
sk4r
 Junior Member
Links : Onlinestatus : sk4r ist offline
Registriert seit: Sep 2005
Beiträge: 84
sk4r ist zur Zeit noch ein unbeschriebenes Blatt
Standard Mit einer CSV 2 Tabellen füttern

Hallo liebe Community,

es dreht sich alles wieder mal um CSV's. Ich habe eine CSV, die ich die MySQL Datenbank verfrachte. Funktioniert soweit wie geplant. Nun hab ich ein anderes Problem. Wie kann ich denn anstellen, dass aus einer CSV zwei SQL Tabellen gefüllt werden?

Bsp.:
1. Teil der CSV sind die Daten
2. Teil der CSV sind die Bilder

Da die Bilder in einer separaten Tabelle aufgeführt sein müssen, muss es in dieser Art eine Möglichkeit geben. Da die Bilder dann über die ID aus der ersten Tabelle verknüpft werden, habe ich mir gedacht, dass man mysql_insert_id dazu missbrauchen könnte.

Hoffe, dass ihr mir helfen könnt.


PS: Das hier ist mein Import in die DB

PHP-Code:
for ($i 0$i sizeof($fcontents); $i++)
{
    
$line trim($fcontents[$i]);
    echo 
"<tr bgcolor=\"#D3D3D3\"><td colspan=\"3\">$line <br></td></tr>";
    
$arr explode(";" $line);
    
#Wenn die CSV Datei TAB separiert ist, muss ";" durch "/t" ersetzt werden
    
$sql "insert into ".$sqltabelle." values ('"implode("','",$arr) ."')";
     
mysql_query($sql);

    echo 
"<tr bgcolor=\"#32CD32\"><td colspan=\"3\">" $sql "<br>\n</td></tr>";
    
    if(
mysql_error())
    {
        echo 
"<tr bgcolor=\"red\"><td colspan=\"3\">" mysql_error() . "<br>\n</td></tr>";
    }

Mit freundlichen Grüßen

Euer sk4r

Geändert von sk4r (11-10-2006 um 13:44 Uhr)
Mit Zitat antworten
  #2 (permalink)  
Alt 11-10-2006, 14:29
sk4r
 Junior Member
Links : Onlinestatus : sk4r ist offline
Registriert seit: Sep 2005
Beiträge: 84
sk4r ist zur Zeit noch ein unbeschriebenes Blatt
Standard

Hmm kann denn keiner die Katze ausm Sack lassen?
Die PHP-Manual Seite wird mich bald verklagen, da ich zu hohen Traffic verursache, weil ich nur am Suchen bin und trotzdem net finde.

Hab ich Tomaten auf den Augen oder gibt es soetwas nicht?
Mit Zitat antworten
  #3 (permalink)  
Alt 11-10-2006, 14:52
wahsaga
  Moderator
Links : Onlinestatus : wahsaga ist offline
Registriert seit: Sep 2001
Beiträge: 25.236
wahsaga befindet sich auf einem aufstrebenden Ast
Standard Re: Mit einer CSV 2 Tabellen füttern

Alles noch zu ungenau, um darauf präzise Antworten zu können ...

Zitat:
1. Teil der CSV sind die Daten
2. Teil der CSV sind die Bilder
D.h., erster Datensatz aus erstem Teil gehört zu erstem Datensatz aus zweitem Teil, zweiter zu zweitem, etc. ...?


Dann würde ich aus der einen csv-Datei zwei machen, und beide parallel einlesen. Ersten Datensatz INSERTen, ID ermitteln, und damit Bilderdatensatz INSERTen, etc. pp.

Kann man natürlich auch ohne Trennen der Daten machen, wenn man zuerst alles in zwei interne Arrays o.ä. einliest - und dann diese Satz für Satz abarbeitet.

Sollte aber klar sein, dass dieses Verfahren extrem fehleranfällig ist - wenn die Daten nicht 1:1 zueinander passen, wird's zwangsläufig Murks geben.
__________________
I don't believe in rebirth. Actually, I never did in my whole lives.
Mit Zitat antworten
  #4 (permalink)  
Alt 11-10-2006, 14:57
sk4r
 Junior Member
Links : Onlinestatus : sk4r ist offline
Registriert seit: Sep 2005
Beiträge: 84
sk4r ist zur Zeit noch ein unbeschriebenes Blatt
Standard

Hm das ist eine gute Idee für meine vorläufige Überlegung gewesen.

Nein, ich glaube, dass ich es falsch erklärt habe.

Also:

ID Name Username Passwort Bild
1 huhu huhuhu 123 test.jpg



So nun soll ID,Name,Username und Passwort in die Tabelle "benutzer" und Bild in die Tabelle "bilder", wobei "benutzer_ID" mit an die "bilder" Tabelle übergeben wird.
Mit Zitat antworten
  #5 (permalink)  
Alt 11-10-2006, 15:09
closure
 Master
Links : Onlinestatus : closure ist offline
Registriert seit: Mar 2006
Beiträge: 796
closure ist zur Zeit noch ein unbeschriebenes Blatt
Standard

Hi,
ja warum machst du es denn nicht einfach ?
Genau so wie dus gesagt hast. Das sind zwei queries je zeile der datei.

greets
__________________
(((call/cc call/cc) (lambda (x) x)) "Scheme just rocks! and Ruby is magic!")
Mit Zitat antworten
  #6 (permalink)  
Alt 11-10-2006, 15:13
sk4r
 Junior Member
Links : Onlinestatus : sk4r ist offline
Registriert seit: Sep 2005
Beiträge: 84
sk4r ist zur Zeit noch ein unbeschriebenes Blatt
Standard

Zitat:
Original geschrieben von closure
Hi,
ja warum machst du es denn nicht einfach ?
Genau so wie dus gesagt hast. Das sind zwei queries je zeile der datei.

greets
Hmm leider hab ich dein Posting nicht so ganz verstanden, aber ich glaube, dass du das richtige meinst. Ich möchte 2 querrys machen und den einen in die eine Tabelle schiffen und die andere in die andere Tabelle. Nur wie mach ich das?
Mit Zitat antworten
  #7 (permalink)  
Alt 11-10-2006, 15:38
wahsaga
  Moderator
Links : Onlinestatus : wahsaga ist offline
Registriert seit: Sep 2001
Beiträge: 25.236
wahsaga befindet sich auf einem aufstrebenden Ast
Standard

Zitat:
Original geschrieben von sk4r
Ich möchte 2 querrys machen und den einen in die eine Tabelle schiffen und die andere in die andere Tabelle. Nur wie mach ich das?
In dem du zwei Queries machst, und den einen Teil des Datensatzes in die eine Tabelle einfügst, und den anderen in die andere.

Und wenn du nach der ersten Query die erzeugte ID wissen und sie in der zweiten Query für irgendeinen Spalteninhalt einsetzen möchtest, dann benutzt du zwischendurch das bereits erwähnte mysql_insert_id.


Ja, das ist eigentlich genau so simpel wie's klingt.
Wenn's dir trotzdem nicht gelingt, dann stelle bitte konkrete Fragen - aber erspare uns bitte weitere Aufgüsse des immer gleichen "und wie mach ich das?".
__________________
I don't believe in rebirth. Actually, I never did in my whole lives.
Mit Zitat antworten
  #8 (permalink)  
Alt 11-10-2006, 15:40
sk4r
 Junior Member
Links : Onlinestatus : sk4r ist offline
Registriert seit: Sep 2005
Beiträge: 84
sk4r ist zur Zeit noch ein unbeschriebenes Blatt
Standard

Ja genau so hab ich das auch verstanden. Es ist nicht so, dass ich null Ahnung von PHP und SQL hätte. Ich weiß auch wie man Queries macht. Aber wie man 2 Queries aus einer Zeile macht, weiß ich immer noch nicht. Hab schon das halbe WWW durchforstet.
Mit Zitat antworten
  #9 (permalink)  
Alt 11-10-2006, 16:20
wahsaga
  Moderator
Links : Onlinestatus : wahsaga ist offline
Registriert seit: Sep 2001
Beiträge: 25.236
wahsaga befindet sich auf einem aufstrebenden Ast
Standard

Zitat:
Original geschrieben von sk4r
Ich weiß auch wie man Queries macht. Aber wie man 2 Queries aus einer Zeile macht, weiß ich immer noch nicht.
Du musst doch nur die Daten aufteilen - Element 0 bis x baust du in die eine Query ein, und x+1 bis y in die andere.


Wenn dir dazu keine dynamische Lösung wie im Beispielcode einfällt, dann mach's halt statisch. (Das Format der csv-Daten müsste dir ja sowieso bekannt sein, denn bei unbekanntem könntest du ja sowieso nicht einfach alles in eine Tabelle mit fester Spaltenzahl einfügen.)
__________________
I don't believe in rebirth. Actually, I never did in my whole lives.
Mit Zitat antworten
  #10 (permalink)  
Alt 11-10-2006, 16:25
sk4r
 Junior Member
Links : Onlinestatus : sk4r ist offline
Registriert seit: Sep 2005
Beiträge: 84
sk4r ist zur Zeit noch ein unbeschriebenes Blatt
Standard

Ja soweit hab ich auch schon was im WWW gefunden. Aber das Problem bei deinem Ansatz ist doch, dass ich Zeilenweise schreibe und nicht Spaltenweise. Ich finde kein TUT dazu, sonst hätte ich schon selbst was getüftelt.. Nun hab ich durch meine Versuche schon meine Datenbank zerschossen. Naja Backup machts möglich..

Kennst du vllt nen Link, wo ich ein ähnliches Tutorial finde?
Mit Zitat antworten
  #11 (permalink)  
Alt 11-10-2006, 17:12
wahsaga
  Moderator
Links : Onlinestatus : wahsaga ist offline
Registriert seit: Sep 2001
Beiträge: 25.236
wahsaga befindet sich auf einem aufstrebenden Ast
Standard

Zitat:
Original geschrieben von sk4r
Aber das Problem bei deinem Ansatz ist doch, dass ich Zeilenweise schreibe und nicht Spaltenweise.
Wie meinen?

Du liest eine Zeile aus, die hat alle Werte, die du benötigst, in ihren Spalten.
Also nimmst du die Werte aus diesen Spalten, machst damit zwei Inserts - und dann geht's mit der nächsten Zeile weiter.

Du denkst viel zu kompliziert.
__________________
I don't believe in rebirth. Actually, I never did in my whole lives.
Mit Zitat antworten
  #12 (permalink)  
Alt 11-10-2006, 19:11
closure
 Master
Links : Onlinestatus : closure ist offline
Registriert seit: Mar 2006
Beiträge: 796
closure ist zur Zeit noch ein unbeschriebenes Blatt
Standard

Hi,
der einfachheit halber gehen wir mal von einer csv-datei mit
folgendem format aus

benutzername;name;nachname;email;bildpfad

Ok, weiter konstruieren wir ein einfaches datenbankschema.
Es gibt zwei tabellen: "user" und "userdetail". (Über den sinn
bitte nicht diskutieren).

Semantisch, das heisst von der bedeutung her, gehören userdetails
zu einem user. Man hat also eine 1:n-beziehung.
Das modelliert man in dem man userdetail einen fremdschlüssel
verpasst, nämlich die id des users. Ok das hast du dir in deinem
konkreten fall ja alles auch schon richtig gedacht.

Folgender code soll den benutzternamen in die
tabelle user eintragen und die benutzerdetails in die tabelle userdetail.

Beispielhaft sieht die datei folgendermaßen aus:
Code:
johny;john;doe;johndoe@foobar.com;/pictures/john.png
bobby;bob;tail;bobtail@baz.com;/pictures/bob.png
pauly;paul;anchor;paulanchor@gilmore.org;/pictures/paul.png
Bearbeitung:
PHP-Code:
$content file('myusers.csv');
foreach(
$content as $row){
      
$cols explode(';',$row);
      
//erst den benutzer anlegen
      
mysql_query("INSERT INTO `user` (username) VALUES('{$cols[0]}')",$db);
      
//die id holen als fk für details
      
$id mysql_insert_id($db);
      
//und die details anlegen
      
mysql_query("INSERT INTO `userdetail`
      (name,nachname,email,bildpfad,user_id) VALUES
       ('{$cols[1]}','{$cols[2]}','{$cols[3]}','{$cols[4]}',{$id})"
,$db);
      


Das wars auch schon.
Bitte übernimm das jetzt nicht 1 zu 1 und sag dann es geht nicht.
Das ist nur als anregung gedacht.
greets
__________________
(((call/cc call/cc) (lambda (x) x)) "Scheme just rocks! and Ruby is magic!")
Mit Zitat antworten
  #13 (permalink)  
Alt 12-10-2006, 08:56
sk4r
 Junior Member
Links : Onlinestatus : sk4r ist offline
Registriert seit: Sep 2005
Beiträge: 84
sk4r ist zur Zeit noch ein unbeschriebenes Blatt
Standard

@closure
genau soetwas hab ich mir auch gestern ausgedacht und geschrieben. leider bekomm ich keine meldung von mysql. was mich skeptisch macht ist, ob das hier

PHP-Code:
{$cols[1]}','{$cols[2]}','{$cols[3]}','{$cols[4]},{$id
wirklich funktioniert.

PS:

Außerdem gibt es eine Fehlermeldung:

PHP-Code:
foreach($content as $row){
      
$cols explode(';',$row);
      
//erst den benutzer anlegen
      
mysql_query("INSERT INTO `user` (username) VALUES('{$cols[0]}')",$db);
      
//die id holen als fk für details
      
$id mysql_insert_id($db);
      
//und die details anlegen
      
mysql_query("INSERT INTO `userdetail`
      (name,nachname,email,bildpfad,user_id) VALUES
       ('{$cols[1]}','{$cols[2]}','{$cols[3]}','{$cols[4]}',{$id})"
,$db);
      

wäre das nicht auch mit ner "for"-Schleife möglich?

Geändert von sk4r (12-10-2006 um 09:19 Uhr)
Mit Zitat antworten
  #14 (permalink)  
Alt 12-10-2006, 09:53
wahsaga
  Moderator
Links : Onlinestatus : wahsaga ist offline
Registriert seit: Sep 2001
Beiträge: 25.236
wahsaga befindet sich auf einem aufstrebenden Ast
Standard

Zitat:
Original geschrieben von sk4r
leider bekomm ich keine meldung von mysql.
Du fragst ja auch überhaupt nicht danach.

Nutze mysql_error, um Fehler abzufragen, und nach INSERT/UPDATE/DELETE ggf. noch mysql_affected_rows.

Zitat:
Außerdem gibt es eine Fehlermeldung:
Und als ordentlicher Forendepp hält man sich natürlich an die eiserne Regel, diese unter keinen Umständen im Wortlaut zu nennen - gut gemacht!
__________________
I don't believe in rebirth. Actually, I never did in my whole lives.
Mit Zitat antworten
  #15 (permalink)  
Alt 12-10-2006, 09:57
sk4r
 Junior Member
Links : Onlinestatus : sk4r ist offline
Registriert seit: Sep 2005
Beiträge: 84
sk4r ist zur Zeit noch ein unbeschriebenes Blatt
Standard

nun hab ich das so gelöst.

PHP-Code:
for ($i 0$i sizeof($fcontents); $i++)
{

    
$line trim($fcontents[$i]);
    echo 
"<tr bgcolor=\"#D3D3D3\"><td colspan=\"3\">$line <br></td></tr>";
    
$arr explode(";" $line);
    
#Wenn die CSV Datei TAB separiert ist, muss "," durch "/t" ersetzt werden
    
mysql_query("INSERT INTO `printer` (id,printer_art_id,printer_kategorie_id,printer_druckgroesse_id,info,
info_aufloesung,name,hersteller,herst_art_nr,druckvolumen_mon,
formularsaetze,medienzufuhr,materialformate,materialablage,drucktechnik,
druckbreite,mediabreite,aufloesung,geraeuschentwicklung,geschwindigkeit,
snittstelle_parallel,snittstelle_LAN,snittstelle_USB,snittstelle_seriell,emulationen,
barcodes,arbeitsspeicher,flashspeicher,zusaetsl_infos,visibility,sort) VALUES('{$cols[0]}','{$cols[1]}',
'{$cols[2]}','{$cols[3]}','{$cols[4]}','{$cols[5]}',
'{$cols[6]}','{$cols[7]}','{$cols[8]}','{$cols[9]}','{$cols[10]}','{$cols[11]}',
'{$cols[12]}','{$cols[13]}','{$cols[14]}','{$cols[15]}','{$cols[16]}','{$cols[17]}',
'{$cols[18]}','{$cols[19]}','{$cols[20]}','{$cols[21]}','{$cols[22]}','{$cols[23]}',
'{$cols[24]}','{$cols[25]}','{$cols[26]}','{$cols[27]}','{$bid}','{$cols[29]}',
'{$cols[30]}','{$cols[31]}','{$cols[32]}')"
);
    
$pid mysql_insert_id();
    
mysql_query("INSERT INTO `printer_pics` (id,printer_id,filename) VALUES ('{$cols[0]}','{$pid}','{$cols[28]}')");
    
//$sql = "replace into ".$sqltabelle." values ('". implode("','",$arr) ."')";
    
$bid mysql_insert_id();
    
#TABELLENNAME durch den Namen der Tabelle in der Datenbank ersetzen 
Soweit so gut. Aber nun beschreibt er mir die Tabelle "printer_pics" aber nicht die Tabelle "printer".

Ne Fehlermeldung kommt nun auch nicht wahsaga, da ich (so denke ich) alles richtig gemacht habe, bis auf den einen Insert-Befehl. Aber ich entdecke den Fehler nicht.
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 03:11 Uhr.