2

次の名前の mysql データベースがあり、次の名前exampleのテーブルがありproductsます。モデル フィールドは一意です。products_modelproducts_image

という名前のcsvファイルがありますdata.csv。products_model とproducts_image.i の 2 つの列があり、次のコードを使用します。しかし、それはデータをデータベースにインポートしません.私のコードの何が問題なのですか?

    $fp = fopen("data.csv","r");
$length = 4096; //have to be optional length
$fildDelineate = ',' ;//or "|" declare what you need
$dbhost="localhost";
$dbname="zencartone";
$dbuser="root";
$dbpass="";
$link  = mysql_connect($dbhost,$dbuser,$dbpass);
if (!$link) {
    die('Could not connect: ' . mysql_error());
}
mysql_select_db($dbname);

$databasetable  = 'products';

$counter = 1;//to omission first row if it is table headers

while($line = fgetcsv($fp,$length,$fildDelineate)){
    foreach($line as $key=>$value){
        //for example insert in 3 column
        $importSQL = "insert into $databasetable  (products_model, products_image) values('$line[0]','$line[1]')";
        mysql_query($importSQL) or die(mysql_error());
    }
    $counter++;
}
fclose($fp);

データ.csv:

2 つの列があります。

products_model  products_image
MG200MMS    dress/201247561673.jpg
MG400-32MB  dress/2012471141673.jpg
MSIMPRO dress/201247741673.jpg
DVD-RPMK    dress/2012471831673.jpg
DVD-BLDRNDC dress/2012474221673.jpg
DVD-MATR    dress/201112132056773.jpg
4

2 に答える 2

3

あなたの問題はループにあります:

while(!fopen($fp)){
    if(!$line = fgetcsv($fp,$length,$fildDelineate,'')&& $counter){
        continue;
    }
    foreach($line as $key=>$value){

間違っている。ファイルはすでに開いています(コードの最初の行)。ループでは、再度開くのではなく、読み取る必要があります。ループは次のようになります。

while($line = fgetcsv($fp, 0, "\t")){
    foreach($line as $key=>$value){
        ...
    }
}

編集:ファイルはTSV(tab-separated-values)のように見えるので、データを読み取るときにタブ文字を区切り文字として使用するように上記のコードを更新しました。

于 2012-07-19T08:44:15.410 に答える
2

編集:

次のループを使用します。

while($line = fgets($fp)) {
    $lineArray = explode("\t", $line); // Use tab as delimiter.
    $importSQL = "insert into $databasetable  (products_model, products_image) values ('".$lineArray[0]."','".$lineArray[1]."')";
    mysql_query($importSQL) or die(mysql_error());
    $counter++;
}

SQLエラー:

$importSQL = "insert into $databasetable values('$line[0]','$line[1]')";

列名を指定する必要があります。

$importSQL = "insert into $databasetable (col1, col2) values('$line[0]','$line[1]')";

編集:fgetcsv($fp,$length,$fildDelineate,'')

Enclosureparamは空の文字列に設定されています。CSVの値の前後に囲みがない場合は、それを取り除くことができます。

fgetcsv($fp,$length,$fildDelineate)

それ以外の場合は、正しいエンクロージャーを設定します(二重引用符または一重引用符)。

于 2012-07-19T08:45:46.043 に答える