[php]Ta bort ett tecken i sista loopkörningen

Permalänk

[php]Ta bort ett tecken i sista loopkörningen

Jag har följande bit kod som plockar första raden i en CSV-fil och lägger in som kolumnnamn till en databas och resterande raderna för att lägga in i dessa kolumner, rätt sak på rätt plats.

foreach ($columns as &$column) { $column = str_replace(".","",$column); } $insert_query_prefix = "INSERT INTO $target_table (".join(",",$columns).")\nVALUES"; while (($data = fgetcsv($handle, $max_line_length, ";")) !== FALSE) { while (count($data)>count($columns)) array_push($data); $query = "$insert_query_prefix (".join(",",quote_all_array($data)).");"; mysql_query($query)/* or die(mysql_error())*/; echo "Querying server, $query <br />"; }

Finns det ett sätt att plocka bort det sista kommatecknet som blir av sista kolumnen i alla rader?
Exempel på hur det ser ut när den körs:

INSERT INTO tabell (art,description,productGroupNumber,productGroupName,X,Y,Z,EAN,) VALUES ('110011','produktbeskrivning X','101','Produkttyp X','1','10','110','','');

men den borde se ut så här för att fungera:

INSERT INTO tabell (art,description,productGroupNumber,productGroupName,X,Y,Z,EAN) VALUES ('110011','produktbeskrivning X','101','Produkttyp X','1','10','110',''); Notera avsaknaden av sista kommat i kolumnerna och sista ,'' i värderna

Visa signatur

Stationär: Processor: Intel i5 3.2GHz, RAM: 4Gb, Grafikkort: ATI Radeon HD 5850, OS: Windows 7 Proffessional x64
Laptop: ASUS K53E, Processor: Intel i5 2450M, RAM: 4Gb, Grafik: Integrerad Intel GMA HD, OS: Win7 Home Premium x64 och Xubuntu 10

Permalänk
Medlem

använd implode ist för join

$insert_query_prefix = "INSERT INTO $target_table (".implode(",",$columns).")\nVALUES";

Permalänk

Får implode bort sista kommat som blir?

Visa signatur

Stationär: Processor: Intel i5 3.2GHz, RAM: 4Gb, Grafikkort: ATI Radeon HD 5850, OS: Windows 7 Proffessional x64
Laptop: ASUS K53E, Processor: Intel i5 2450M, RAM: 4Gb, Grafik: Integrerad Intel GMA HD, OS: Win7 Home Premium x64 och Xubuntu 10

Permalänk
Medlem

Provar du inte innan du frågar?
Ja, det borde den få. Det funktionen gör är att ta alla värden i en array och trycka in dem i en sträng separerade med vad du anger i funktionanropet (i detta fall ',')
Ett tips är att ha http://www.php.net/manual/en/funcref.php till hands när man letar passande funktioner. (I detta fall "Text Processing/Strings")

Permalänk
Medlem

Eller så är det jag som är ganska korkad eftersom implode är ett alias på join...men i vilket fall så provade jag...

$columns = array("X","Y","Z"); $string = "INSERT INTO $target_table (".implode(",",$columns).") VALUES"; echo $string; // -> INSERT INTO (X,Y,Z) VALUES

Permalänk

Jag prövade och samma problem återstår. Det var därför jag frågade om den borde göra det

Problemet tycks ligga i CSV-filen, där varje rad avslutas med ett ;, som råkar vara kolumnseparatorn, därför undrade jag om det går att ta bort sista omgången av looparna istället. Dum känner jag mig, då jag inser att man borde kunna ta -1 på while-loopen för att få önskat resultat >.<

Visa signatur

Stationär: Processor: Intel i5 3.2GHz, RAM: 4Gb, Grafikkort: ATI Radeon HD 5850, OS: Windows 7 Proffessional x64
Laptop: ASUS K53E, Processor: Intel i5 2450M, RAM: 4Gb, Grafik: Integrerad Intel GMA HD, OS: Win7 Home Premium x64 och Xubuntu 10

Permalänk
Medlem

Det blir tokigt pga att du kör $column = str_replace(".","",$column), du får in ett kommatecken i ett värde i arrayen vilket gör att när du joinar så kommer du få ett tomt värde för det kommatecknet...
hur ser $columns ut, kan du vardumpa den?

EDIT: Såg att du löste det.
EDIT2: Då förstår jag mycket väl varför du frågade

Permalänk

Har inte direkt löst det, kan inte riktigt köra -1 på en while-loop av den typen, måste luska ut vad det är i det som behöver dras ner med 1... Samtidigt som jag jobbar med såväl en av misstag tömd databas och en server som jag inte kan komma in på >.<

Det är lugnt, jag sitter och leker med det en stund och frågar igen om jag inte kommer på det ^^

edit: Fulhaxx, javisst, men löste det genom att plocka bort första raden, manuellt lägga in kolumnnamnen och lägga till en kolumn för att dumpa det tomma värdet i >.<

Visa signatur

Stationär: Processor: Intel i5 3.2GHz, RAM: 4Gb, Grafikkort: ATI Radeon HD 5850, OS: Windows 7 Proffessional x64
Laptop: ASUS K53E, Processor: Intel i5 2450M, RAM: 4Gb, Grafik: Integrerad Intel GMA HD, OS: Win7 Home Premium x64 och Xubuntu 10

Permalänk
Medlem

Men problemet borde väl vara i $columns då det är den joinen som blir galen, och inte så mycket med CSV-filens kommatecken?

Permalänk

Njaeee... Den sätter ju allt med ett semikolon efter sig som en del av $columns och det finns ju ett extra, tomt semikolon i slutet av varje rad, så den tror att det finns ett tomt ord på slutet.

Visa signatur

Stationär: Processor: Intel i5 3.2GHz, RAM: 4Gb, Grafikkort: ATI Radeon HD 5850, OS: Windows 7 Proffessional x64
Laptop: ASUS K53E, Processor: Intel i5 2450M, RAM: 4Gb, Grafik: Integrerad Intel GMA HD, OS: Win7 Home Premium x64 och Xubuntu 10

Permalänk
Medlem

Du kan ju ta bort alla "tomma" element i arrayen:

array_filter($columns, function($e){ return ($e !== "");});

Du skulle även kunna ta bort det sista elementet med enkel indexering också, men användsningsområdet antyder att det inte får finnas tomma element, så det är en bättre lösning att ta bort dem. Dessutom kommer denna lösning fungera även om någon lagar CSV-filerna.

Permalänk

Problemet är att kolumnen EAN inte behöver ha ett värde. Gör jag på det sättet kommer alla de rader utan EAN att brytas också.
Jag är den enda som kommer kolla på tabellen och den enda som vet vad som faktiskt finns där, så jag tror inte att en extra, tom kolumn spelar någon större roll. Dessutom kan den ju användas senare, om ett värde tillkommer eller liknande.

Visa signatur

Stationär: Processor: Intel i5 3.2GHz, RAM: 4Gb, Grafikkort: ATI Radeon HD 5850, OS: Windows 7 Proffessional x64
Laptop: ASUS K53E, Processor: Intel i5 2450M, RAM: 4Gb, Grafik: Integrerad Intel GMA HD, OS: Win7 Home Premium x64 och Xubuntu 10