Avatar billede genixdk Nybegynder
06. december 2005 - 19:27 Der er 42 kommentarer og
1 løsning

Excel data til MySQL

Jeg har en excel fil med en masse email adresser som jeg gerne skulle have ind i en eksisterende database:

Tabellen jeg skal have den over i hedder "nuke_users".
Følgende rows skal indeholde data fra excel filen.

nuke_users:

pn_uid - (Unikt bruger ID)
pn_uname (Email adresse)
pn_email (Email adresse)

Excel er bare en lang liste med tilmeldte folk og deres adresser, så skal på en eller anden måde have dem ind i databasen "BUT HOW"??
Avatar billede nielle Nybegynder
06. december 2005 - 19:49 #1
Er det noget du kun skal have gjort en gang?

Har du adgang til at bruge PHP?
Avatar billede genixdk Nybegynder
06. december 2005 - 21:26 #2
Jeps, har server kørende med alt der til. Jeg skal bare kører dette inserts en eneste gang med de mails jeg har i excel filen
Avatar billede nielle Nybegynder
06. december 2005 - 21:34 #3
Ok, så kan det gøres ved at du, fra Excel, gemmer som en kommasepareret fil.

Derefter kan du lave et PHP-script som læser denne fil linje for linje:

For hver linje splittes der op ved ;-tegnet og så laves der en INSERT SQL-sætning ud af dette. Denne fyre du så af imod databasen.
Avatar billede genixdk Nybegynder
06. december 2005 - 21:38 #4
Jamen den skal jo oprettet et unikt ID for hver adresse... og lige nu står de remset op under hinanden..
Avatar billede nielle Nybegynder
06. december 2005 - 21:41 #5
Hvis du sætter pn_uid til at være primary key og auto_increment så tæller den selv op efterhånden som du indsætter rækkerne i tabellen.
Avatar billede nielle Nybegynder
06. december 2005 - 21:59 #6
Koden kunne se nogenlunde sådan her ud:

$linjer = file("dinCsvFil.csv");
foreach ($linjer as $linje)
{
    $oplysning = explode(";", $linje);

    $sql = "INSERT INTO dinTabel (pn_uname, pn_email) VALUES ('" . $oplysning[0] . "', '" . $oplysning[1] . "')";
    echo $sql . "<br>";  // Bare med for at du kan følge med under vejs.
    mysql_query($sql) or die(mysql_error());
}
Avatar billede genixdk Nybegynder
06. december 2005 - 22:16 #7
$linjer = file("mail.csv");
foreach ($linjer as $linje)
{
    $oplysning = explode(";", $linje);

    $sql = "INSERT INTO nuke_user (pn_uname, pn_email) VALUES ('" . $oplysning[0] . "', '" . $oplysning[1] . "')";
    echo $sql . "<br>"; 
    mysql_query($sql) or die(mysql_error());
}

Hvad er Oplysning 1 og 2?
Avatar billede genixdk Nybegynder
06. december 2005 - 22:22 #8
Er seriøst newbie, sorry Nielle
Avatar billede nielle Nybegynder
06. december 2005 - 22:32 #9
Foreach-løkken løber igennem alle linjerne i csv-filen. hver linje bliver splittet i et antal "stumper" med denne her:

$oplysning = explode(";", $linje);

Den giver et array, og $oplysning[0] og $oplysning[1] er så hhv. den 1. og den anden af disse.
Avatar billede nielle Nybegynder
06. december 2005 - 22:35 #10
Denne:

explode(";", $linje);

- går ud fra at det er et ;-tegn som adskiller posterne i csv-filen.
Avatar billede genixdk Nybegynder
06. december 2005 - 22:35 #11
Hvor skriver den så til?
Avatar billede nielle Nybegynder
06. december 2005 - 22:45 #12
Hvad mener du? Der skulle gerne dels komme noget ud på skærmen, og del lægges noget i databasen.
Avatar billede genixdk Nybegynder
06. december 2005 - 23:45 #13
Får denne her:

Connected successfullyINSERT INTO nuke_users (pn_uname, pn_email) VALUES ('pn_uid', 'pn_name')
INSERT INTO nuke_users (pn_uname, pn_email) VALUES ('', 'Rikke')
INSERT INTO nuke_users (pn_uname, pn_email) VALUES ('', 'Nichlas Campbell')
Duplicate entry '' for key 2
Avatar billede nielle Nybegynder
07. december 2005 - 06:58 #14
Det er fordi du skal huske at sætte auto_increment på dit pn_uid-felt.
Avatar billede genixdk Nybegynder
07. december 2005 - 08:43 #15
Der skal jeg nok lige have lidt konkret hjælp en string :D  *rødmer*
Avatar billede nielle Nybegynder
07. december 2005 - 09:46 #16
Bruger du phpadmin?
Avatar billede nielle Nybegynder
07. december 2005 - 09:47 #17
... phpmyadmin
Avatar billede genixdk Nybegynder
07. december 2005 - 14:03 #18
yes
Avatar billede nielle Nybegynder
07. december 2005 - 15:05 #19
Ok så...

Så skal du først og fremmest sætte dit pn_uid-felt til at være af en taltype; Lige nu ser den ud til at kunne indeholde tekst. Når du har gjort dette skulle du under Extra kunne finde auto_increment.


OBS #1: Jeg kan se (06/12-2005 23:45:35) at du har denne INSERT-linje:

INSERT INTO nuke_users (pn_uname, pn_email) VALUES ('pn_uid', 'pn_name')

Den skyldes nok at du har en tilsvarende linje i din CSV-fil. Den skal du lige have slettet derfra - for den skal jo ikke med over i tabellen i databasen.


OBS #2: Resten af dine SQL'er ser sådan ud:

INSERT INTO nuke_users (pn_uname, pn_email) VALUES ('', 'Rikke')
INSERT INTO nuke_users (pn_uname, pn_email) VALUES ('', 'Nichlas Campbell')

- og for mig ser det ud til at du dermed får sat dine navne ind i pn_email-feltet. Mon ikke at de skulle ind på pn_uname i stedet?

Umiddelbart vil jeg gætte på at det skyldes at du har tre 3 søjler i dit Excel-ark;

pn_uid, pn_uname, og pn_email

Den første af disse søjler ser dog ud til at være helt tom - den indeholder vist kun overskriften 'pn_uid'. Korrekt?

Hvis det er korrekt, kan du nu gøre to ting:

Mulighed 1) Slet denne søjle i dit Excel-ark. Dette er helt klart den simple løsning, og den vil ikke kræve at du ændre i PHP-koden.

... eller:

Mulighed 2) Behold denne søjle i dit Excel-ark. Imidlertid skal du så rette i PHP scriptet. Det er dog kun en linje som skal rettes; Ret:

$sql = "INSERT INTO nuke_user (pn_uname, pn_email) VALUES ('" . $oplysning[0] . "', '" . $oplysning[1] . "')";

- til:

$sql = "INSERT INTO nuke_user (pn_uname, pn_email) VALUES ('" . $oplysning[1] . "', '" . $oplysning[2] . "')";
Avatar billede genixdk Nybegynder
07. december 2005 - 19:42 #20
Det kører nu :) Lavede lige en del rettelser i Excel, lavede username det samme som mail adressen, da der åbenbart er mange der hedder Mette ;)

Databasen indeholder 17000 adresser i forvejen og jeg rammer altid:
Duplicate entry 'email@email.dk' for key 2

Kan man få den til at springe Matchende entries over og bare fortsætte med de andre
Avatar billede nielle Nybegynder
07. december 2005 - 20:04 #21
Hvordan ser den SQL ud som giver den meddelelse? Du har vel ikke sat hverken pn_uname eller pn_email til at skulle være unikke?
Avatar billede genixdk Nybegynder
07. december 2005 - 22:36 #22
$linjer = file("mail.csv");
foreach ($linjer as $linje)
{
    $oplysning = explode(";", $linje);

    $sql = "INSERT INTO nuke_users (pn_uname, pn_email) VALUES ('" . $oplysning[0] . "', '" . $oplysning[1] . "')";
    echo $sql . "<br>"; 
    mysql_query($sql) or die(mysql_error());
}

mysql_close($link);
?>

Er alt hvad filen indeholder
Avatar billede nielle Nybegynder
07. december 2005 - 22:47 #23
Det var nu mere databasen jeg spurgte til - har du sat pn_uname eller pn_email til at være unikke eller primary keys?

Og hvilken INSERT-sætning bliver udskrevet lige før at fejlen kommer?
Avatar billede genixdk Nybegynder
07. december 2005 - 23:07 #24
pn_uid PRIMARY
pn_uname UNIQUE    


INSERT INTO nuke_users (pn_uname, pn_email) VALUES (emailadressen)
Avatar billede genixdk Nybegynder
08. december 2005 - 00:35 #25
har forsøgt med denne:

$sql = "INSERT INTO nuke_users (pn_uname, pn_email) VALUES ('" . $oplysning[0] . "', '" . $oplysning[1] ." WHERE pn_email NOT = " . $oplysning[1] . "')";

Men uden held
Avatar billede nielle Nybegynder
08. december 2005 - 06:54 #26
Du kan ikke have UNIQUE på dit pn_uname-felt. I hvert fald ser det ud til at du rent faktisk allerede har dublettet i dit Excel-regneark, og at det er derfor det går galt. :^|

Jeg var nu mere intereseret i den INSERT som blev skrevet ud på *skærmen* - altså lige før at fejlmeddelesen kommer.
Avatar billede genixdk Nybegynder
08. december 2005 - 10:59 #27
Connected successfullyINSERT INTO nuke_users (pn_uname, pn_email) VALUES ('mail@mail.dk', 'mail@mail.dk ')
Duplicate entry 'mail@mail.dk' for key 2
Avatar billede genixdk Nybegynder
08. december 2005 - 11:18 #28
Hvis jeg fjerner de UNIQUE der er behæftet til pn_uname kan den godt indsætte alle sammen, men så får jeg vel dupletter i databasen?
Avatar billede nielle Nybegynder
08. december 2005 - 17:23 #29
Dit problem er at du allered har dubletter - nemlig i dit Excel-ark. Du bliver nødt til at beslutte dig for hvad der skal ske med dem først.
Avatar billede genixdk Nybegynder
08. december 2005 - 18:34 #30
Næeh excel filen er der ikke noget, der sker jo feks ikke noget ved det når jeg har en 100% blank nuke_users database, så kan den ligge alle ind. Åh undskylder meget for alt det besvær jeg volder... Men håber der er en løsnnig.. Tager lidt lang tid at ligge lidt op af gangen, slette de entries der er dobbelt manualt, og oploade scriptet igen og reload... Men sådan kan det gøres
Avatar billede nielle Nybegynder
08. december 2005 - 18:52 #31
Jo der er altså en dublet et eller andet sted. Det er derfor at MySQL brokker sig når du udføre den INSERT.
Avatar billede genixdk Nybegynder
08. december 2005 - 18:54 #32
Jeps der er en dublet i den "gamle" database, altså selve den eksisterende bruger database hvor der ligger over 17000 brugere i.
Avatar billede nielle Nybegynder
08. december 2005 - 19:30 #33
Hvis du sætter pn_uname-feltet til at være UNIQUE, så kan der ikke være dubletter i det felt. Derfor kan du heller ikke indsætte noget som allerede er der en gang. Hvis du har sådan et tilfælde så bliver du nødt til at finde ud af hvad der så skal ske i stedet.
Avatar billede genixdk Nybegynder
08. december 2005 - 19:33 #34
Yes.  Håbede på man kunne sætte den til at springe over de steder hvor man fandt dupletter. Det var det jeg prøvede med WHERE pn_email NOT = " . $oplysning[1] . "')";


Men uden held
Avatar billede nielle Nybegynder
08. december 2005 - 19:58 #35
Hvis du bare vil smide dubletter væk, kan du f.eks. gøre noget i stil med dette:

$linjer = file("mail.csv");
foreach ($linjer as $linje)
{
    $oplysning = explode(";", $linje);
    $pn_uname = $oplysning[0];
    $pn_email = $oplysning[1];

    $sql = "SELECT count(*) AS antal FROM nuke_users WHERE pn_uname = '" . $pn_uname . "'";
    $query = mysql_query($sql) or die(mysql_error());
    $row = mysql_fetch_assoc($query);

    if ($row["antal"] == 0)
    {
        $sql = "INSERT INTO nuke_users (pn_uname, pn_email) VALUES ('" . $pn_uname . "', '" . $pn_email . "')";
        echo $sql . "<br>"; 
        mysql_query($sql) or die(mysql_error());
    }
}

mysql_close($link);
?>

... Men er du helt sikker på at to personer, som tilfældigvis har valgt det samme navn, skal håndteres på den måde?
Avatar billede genixdk Nybegynder
08. december 2005 - 21:22 #36
Navnet i dette tilfælde er jo en "unik" mail, dem ligger der også rigtig mange af i forvejen der har deres username som mail... Derfor hvis man fra sorterer dupletter, vil man sørge for at der ikke kommer 2 konti til samme mail adresse, tager jeg helt fejl?
Avatar billede nielle Nybegynder
08. december 2005 - 21:34 #37
Du kender vist bedst dine egne data. Det lyder sandsynligt nok det du fortæller.

Men hvorfor er der så overhovedet dubletter?
Avatar billede genixdk Nybegynder
08. december 2005 - 21:43 #38
De data der findes i excel filen stammer fra en ekstern konkurrence hvor folk har afkrydset de gerne vil modtage nyhedsbrev fra min side. Problemet er at mange af dem der har deltaget allerede er tilmeldt via min side. Og så render vi ind i dupletter. Jeg tester lige det hele local før jeg sparker noget ud live... Melder tilbage :)
Avatar billede nielle Nybegynder
08. december 2005 - 22:05 #39
Prøv også lige at tjekke efter om den holder styr på at mail@mail.dk og mAil@mAil.dk er den samme email adresse - altså en dublet.

Hvis ikke, så må vi lige modificere koden lidt.
Avatar billede genixdk Nybegynder
08. december 2005 - 22:19 #40
Den kørte bare alle igennem der ikke var der, så vidt jeg kunne se. Så må vi jo se om brugerne brokker sig. Hvad skulle addes hvis den skulle dobbelt tjekke a A, det skønt at lærer måske kan jeg hjælpe andre på et tidspunkt ;)

Kan du ikke smide et svar så du får points i det mindste
Avatar billede nielle Nybegynder
08. december 2005 - 22:29 #41
Det kan du f.eks. klare ved at konvertere til små bogstaver før dt sammenligner. Altså ved at rette:

$sql = "SELECT count(*) AS antal FROM nuke_users WHERE pn_uname = '" . $pn_uname . "'";

- til:

$sql = "SELECT count(*) AS antal FROM nuke_users WHERE LOWER(pn_uname) = '" . strtolower($pn_uname) . "'";
Avatar billede nielle Nybegynder
08. december 2005 - 22:29 #42
... og et svar :^)
Avatar billede genixdk Nybegynder
08. december 2005 - 22:31 #43
Tusind tak for alt alt din tid :D
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Computerworld tilbyder specialiserede kurser i database-management

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester