[PHP] data van een csv file importeren in sql server 2008

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Hallo

Ik ben bezig met een mailing project waarbij er vanuit verschillende soorten bestanden email adressen moeten worden kunnen opgehaald en worden geinsert in sql server 2008. Ik gebruik sqlsrv om connectie te leggen met de sql server. De webserver is IIS7.5. en de versie van php is 5.

Waar ik nu al twee volle dagen mijn kop op heb zitten breken is bij het ophalen van data uit csv bestanden.
$h=fopen_utf8(get_path_file($db));
$text=fread($h,filesize(get_path_file($db)));
$values=explode('";"',$text);
foreach($values as $key=>$val){
if(check_email_address($val)){
$val = preg_replace('/[^(\x20-\x7F)\xA0-\xFF\x08-\x0d]*/', '', $val);
$val=str_replace('"','',$val);
$val=str_replace(' ','',$val);
$email=str_replace("'","''",$val);
$q="insert into verzendlijst(mailerproject_id,lijst_id,email) values('".$_SESSION['project']['id']."','".$db->queryUniqueValue("select lijst_id from lijst where naam='".$_SESSION['wizard']['bestand']."'")."','".$email."')";
//echo $q;
$db->execute($q);
}
}
de fopen_utf8 functie:
function fopen_utf8($filename){
$encoding='';
$handle = fopen($filename, 'r');
$bom = fread($handle, 2);
// fclose($handle);
rewind($handle);


if($bom === chr(0xff).chr(0xfe) || $bom === chr(0xfe).chr(0xff)){
// UTF16 Byte Order Mark present
$encoding = 'UTF-16';
} else {
$file_sample = fread($handle, 1000) + 'e'; //read first 1000 bytes
// + e is a workaround for mb_string bug
rewind($handle);

$encoding = mb_detect_encoding($file_sample , 'UTF-8, UTF-7, ASCII, EUC-JP,SJIS, eucJP-win, SJIS-win, JIS, ISO-2022-JP');
}
if ($encoding){
stream_filter_append($handle, 'convert.iconv.'.$encoding.'/UTF-8');
}
return ($handle);
}
Na uitvoeren krijg ik volgende query's:
insert into verzendlijst(mailerproject_id,lijst_id,email) values('18','268',' info@jcibruxelles.be')
Het probleem is nu dat php deze query niet kan uitvoeren maar als ik deze query copy paste naar query analyser wordt deze wel uitgevoerd. :?

Ik denk dat het ergens misloopt met de indeling van het csv bestand (UNICODE) dat niet compatibel is met php? Daarom al die omzettingen met met fopen_utf8 en "$val = preg_replace('/[^(\x20-\x7F)\xA0-\xFF\x08-\x0d]*/', '', $val); " enz...

voorheen dacht ik, okay, het probleem ligt aan het bestand zelf dus ik lees alles in, laat php een .txt bestandje schrijven en probeer dan van daaruit te inserten in de database maar hetzelfde probleem duikt op. Query lijkt perfect maar kan niet worden geinterpreteerd? Ik heb eigenlijk geen idee wat er fout zou kunnen zijn? ten einde raad en mijn uren voor dit "simpel" project zijn aan het oplopen.

Ik heb ook al liggen denken om een stored procedure op te roepen zodat ik php kan omzeilen maar met t_sql heb ik niet genoeg ervaring , bijvoorbeeld
GO
SET QUOTED_IDENTIFIER ON
GO
-- =============================================
-- Author: ********
-- Create date: 19/8/2011
-- Description: inserts values from csv file into verzendlijst
-- =============================================
CREATE PROCEDURE INSERT_CSV
-- Add the parameters for the stored procedure here
@lijst_id int = 0,
@mailerproject_id int = 0,
@locatie varchar(500) = ''
AS
BEGIN
-- SET NOCOUNT ON added to prevent extra result sets from
-- interfering with SELECT statements.
SET NOCOUNT ON;

-- Insert statements for procedure here
BULK
INSERT temp_csv
FROM ' ' ' + @locatie + ' ' '
WITH
(
FIELDTERMINATOR = ';',
ROWTERMINATOR = '\n'
)
....enz
hier wordt er een syntax error gegeven , blijkbaar kan ik geen parameters mee geven in de bulk insert statement wat wel nodig is want het path naar het bestand is variabel... en dit is nog maar het begin :/


Kan iemand een hint geven wat ik nog zou kunnen proberen?

Acties:
  • 0 Henk 'm!

  • thvd
  • Registratie: Juni 2009
  • Laatst online: 17-09 06:33
Ik heb het idee dat je enorm moeilijk zit te doen door deze functie na te bouwen: http://php.net/manual/en/function.fgetcsv.php

Acties:
  • 0 Henk 'm!

  • coldasice
  • Registratie: September 2000
  • Laatst online: 17-09 06:26
een omweg is een BCP copy doen van je bestand naar een vast adres...

of eerst als een string maken en daarna uitvoeren:


DECLARE @bulk_cmd varchar(1000)
SET @bulk_cmd = 'BULK INSERT AdventureWorks2008R2.Sales.SalesOrderDetail
FROM ''<drive>:\<path>\<filename>''
WITH (ROWTERMINATOR = '''+CHAR(10)+''')'
EXEC(@bulk_cmd)

MSDN: BULK INSERT (Transact-SQL)

Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
thvd schreef op vrijdag 19 augustus 2011 @ 11:18:
Ik heb het idee dat je enorm moeilijk zit te doen door deze functie na te bouwen: http://php.net/manual/en/function.fgetcsv.php
fgetcsv had ik inderdaad al geprobeerd.
if (($handle = fopen(get_path_file($db), "r")) !== FALSE) {
while (($data = fgetcsv($handle, 1000, ";")) !== FALSE) {
$num = count($data);
for ($c=0; $c < $num; $c++) {
$val = preg_replace('/[^(\x20-\x7F)\xA0-\xFF\x08-\x0d]/', '', $data[$c]);
$val=str_replace('"','',$val);
$val=str_replace(' ','',$val);
$email=str_replace("'","''",$val);
if(check_email_address($email)){
$q="insert into verzendlijst(mailerproject_id,lijst_id,email) values('".$_SESSION['project']['id']."','".$db->queryUniqueValue("select lijst_id from lijst where naam='".$_SESSION['wizard']['bestand']."'")."','".$email."')";
echo $q."<br/>";
$db->execute($q);
}
}
}
fclose($handle);
}
Daarmee gereneer ik deze queries maar alweer worden deze niet uitgevoerd maar werken ze wel in de query analiser.
insert into verzendlijst(mailerproject_id,lijst_id,email) values('18','268','Randkrant@derand.be')
insert into verzendlijst(mailerproject_id,lijst_id,email) values('18','268','redactie@zonemagzines.be')
insert into verzendlijst(mailerproject_id,lijst_id,email) values('18','268','redactievlaamsbrabant@radio2.be')
coldasice schreef op vrijdag 19 augustus 2011 @ 11:19:
een omweg is een BCP copy doen van je bestand naar een vast adres...

of eerst als een string maken en daarna uitvoeren:


DECLARE @bulk_cmd varchar(1000)
SET @bulk_cmd = 'BULK INSERT AdventureWorks2008R2.Sales.SalesOrderDetail
FROM ''<drive>:\<path>\<filename>''
WITH (ROWTERMINATOR = '''+CHAR(10)+''')'
EXEC(@bulk_cmd)

MSDN: BULK INSERT (Transact-SQL)
Ok, zal ik proberen.

Acties:
  • 0 Henk 'm!

  • Creepy
  • Registratie: Juni 2001
  • Laatst online: 21:27

Creepy

Tactical Espionage Splatterer

"ze worden niet uitgevoerd". Wat houdt dat in? Ik zie je nergens in je code foutafhandeling doen van de queries die je uitvoert. Dus druk de query die PHP uit wil voeren eens 1 op 1 af, en check of het uitvoeren van de query gelukt is, en zo nee, wat de foutmelding dan is die er bij hoort.

Als ik zou moeten gokken: je hebt je ID's voorzien van quotes in de query, niet elke RDMBS vindt dat even leuk als het een numeriek veld betreft.

[ Voor 20% gewijzigd door Creepy op 19-08-2011 11:50 ]

"I had a problem, I solved it with regular expressions. Now I have two problems". That's shows a lack of appreciation for regular expressions: "I know have _star_ problems" --Kevlin Henney


Acties:
  • 0 Henk 'm!

  • ibmos2warp
  • Registratie: Januari 2007
  • Laatst online: 20-11-2023

ibmos2warp

Eval is Evil

Creepy schreef op vrijdag 19 augustus 2011 @ 11:48:
(...)
Als ik zou moeten gokken: je hebt je ID's voorzien van quotes in de query, niet elke RDMBS vindt dat even leuk als het een numeriek veld betreft.
Dat vroeg ik mij ook af, waarom er quotes om die integers staan.

Ik weet alles van niks
Vind Excel ongelovelijk irritant.


Acties:
  • 0 Henk 'm!

  • thvd
  • Registratie: Juni 2009
  • Laatst online: 17-09 06:33
Verwijderd schreef op vrijdag 19 augustus 2011 @ 11:37:
[...]


fgetcsv had ik inderdaad al geprobeerd.
En dat werkte niet? Of wat gaat er fout?

Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
okay, ik ga even gaan wenen. |:( |:( Er stonden in mijn db meerdere entry's met dezeflde bestandsnamen waardoor ik de verkeerde id meenam in mijn query waardoor ik het nooit terug vond. Dus het komt erop neer dat het niet lag aan de combo: php-csv-sqlsrv maar aan developer-php-fail. Hier heb ik twee dagen over zitten kijken?
Titel van dit topic zou moeten zijn: "[php] enkel coderen na twee potten koffie.
Maar toch bedankt voor de replies. Ik had nood aan een nuchtere kijk op mijn probleem.
(gelieve dit niet te plaatsen in :"Slechtste programmeervoorbeelden deel 4" O+ )
ibmos2warp schreef op vrijdag 19 augustus 2011 @ 11:56:
[...]

Dat vroeg ik mij ook af, waarom er quotes om die integers staan.
Heb je volkomen gelijk in en heb ik aangepast!!

[ Voor 17% gewijzigd door Verwijderd op 19-08-2011 12:10 . Reden: update ]


Acties:
  • 0 Henk 'm!

  • coldasice
  • Registratie: September 2000
  • Laatst online: 17-09 06:26
Verwijderd schreef op vrijdag 19 augustus 2011 @ 12:08:
okay, ik ga even gaan wenen. |:( |:( Er stonden in mijn db meerdere entry's met dezeflde bestandsnamen waardoor ik de verkeerde id meenam in mijn query waardoor ik het nooit terug vond. Dus het komt erop neer dat het niet lag aan de combo: php-csv-sqlsrv maar aan developer-php-fail. Hier heb ik twee dagen over zitten kijken?
Titel van dit topic zou moeten zijn: "[php] enkel coderen na twee potten koffie.
Maar toch bedankt voor de replies. Ik had nood aan een nuchtere kijk op mijn probleem.
(gelieve dit niet te plaatsen in :"Slechtste programmeervoorbeelden deel 4" O+ )


[...]


Heb je volkomen gelijk in en heb ik aangepast!!
Je bent zo eerlijk om het toe te geven, vaak eindigt dit in: ik heb het gevonden, bedankt!

Acties:
  • 0 Henk 'm!

  • ASP
  • Registratie: December 2000
  • Laatst online: 17-09 16:43

ASP

Ff iets heel anders maar wel on topic: waarom gebruik je de Integration Service niet die bij SQL Server 2008 zit? Nul programmeren voor dezelfde oplossing.

Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Ik heb er even naar gekeken maar het is misschien wat te uitgebreid voor wat mijn applicatie maar moet doen. Ik heb het nu kunnen oplossen in een paar lijntjes waar ik anders een heleboel onderzoekswerk voor moet doen daar ik eerlijk gezegd nog nooit heb gehoord van SSIS. Als ik tijd heb ga ik er wel eens inkijken, kan nooit kwaad om wat bij te leren.
Pagina: 1