将.csv上传到数据库

时间:2014-05-09 07:25:43

标签: php oracle

我想上传要插入oracle数据库的csv文件。我有这个数据

SMS-MH-CL52,MILLHOUSE,1,COLUMN,H-300X150X6.5X9,8.1,254
SMS-MH-CL53,MILLHOUSE,1,COLUMN,H-300X150X6.5X9,8.1,254
SMS-MH-CL54,MILLHOUSE,1,COLUMN,H-300X150X6.5X9,8.1,254

我一直收到这个错误,

Warning: oci_execute(): ORA-01400: cannot insert NULL into ("WELTESADMIN"."MASTER_DRAWING"."HEAD_MARK") in C:\xampp\htdocs\WeltesInformationCenter\Content\Uploader\read_data.php on line 90

Warning: oci_execute(): ORA-01400: cannot insert NULL into ("WELTESADMIN"."MASTER_DRAWING"."HEAD_MARK") in C:\xampp\htdocs\WeltesInformationCenter\Content\Uploader\read_data.php on line 90

我的php代码就像这样

ini_set('memory_limit', '1024M');
set_time_limit(0);

//Move selected file to the temporary folder
if($_FILES['file']['name'] != ""){
move_uploaded_file($_FILES["file"]["tmp_name"], "".$_FILES["file"]["name"])
        or die ("COULD NOT COPY FILE");
}else{
die("No File Specified");
}

        echo ' Filename : '.$_FILES['file']['name'];
        echo ' Filesize : '.$_FILES['file']['size'];
        echo ' Filetype : '.$_FILES['file']['type'];


// NOW OPEN THE FILE
$filename = $_FILES["file"]["name"];
$handle = fopen($filename, "r");

// AND READ THE FILE
$content = fread($handle, filesize($filename));

$subject = $content;

// AND NOW THE BEST PART IS THE REGEX MANIPULATION
$search = '/([a-zA-Z0-9\-]+)\,
        ([a-zA-Z]+)\,
        ([0-9]+)\,
        ([a-zA-Z\s\-\_]+)\,
        ([a-zA-Z0-9\[\*\-\.]+)\,
        ([0-9\.]+)\,
        ([0-9\.]+)/';

// MATCHING TO THE TABLE
preg_match_all($search, $subject, $match);
$isi = file($filename);

// COUNT THE ARRAY ELEMENTS
$numRow = sizeof($isi);

for($i=0;$i<$numRow;$i++){
$headmark = isset($match[1])?($match[1]) : '';
$project = isset($match[2])?($match[2]) : '';
$quantity = isset($match[3])?($match[3]) : '';
$comptype = isset($match[4])?($match[4]) : '';
$profile = isset($match[5])?($match[5]) : '';
$surface = isset($match[6])?($match[6]) : '';
$weight = isset($match[7])?($match[7]) : '';


$sql = "INSERT INTO MASTER_DRAWING (REV_NO, REV_DATE, HEAD_MARK, COMP_TYPE, QTY, WEIGHT, SURFACE, PROFILE, PROJECT_NAME)
        VALUES ('1', SYSDATE, :headmark, :comptype, :quantity, :weight, :surface, :profile, :project)";

$importParse = oci_parse($conn, $sql);

oci_bind_by_name($importParse, ":headmark", $headmark[$i]);
oci_bind_by_name($importParse, ":comptype", $comptype[$i]);
oci_bind_by_name($importParse, ":quantity", $quantity[$i]);
oci_bind_by_name($importParse, ":weight", $weight[$i]);
oci_bind_by_name($importParse, ":surface", $surface[$i]);
oci_bind_by_name($importParse, ":profile", $profile[$i]);
oci_bind_by_name($importParse, ":project", $project[$i]);

$importRes = oci_execute($importParse);

if ($importRes){
    oci_commit($conn);
} else {
    oci_rollback($conn);
}

请帮帮我。我在这里做错了什么?

1 个答案:

答案 0 :(得分:0)

您将匹配分配给$headmark,这将成为正常的字符串变量*)。在每次迭代时,您都会使用下一个值覆盖此值。

然后,您阅读$headmark[$i]将其存储在数据库中,但这没有意义。我认为该行应该只读

oci_bind_by_name($importParse, ":headmark", $headmark /* Without [$i] */);

当然,这也适用于其他变量。

-edit -

*)再看一下你的代码,$ headmark可能是一个数组,因为preg_match_all可能会在$ match中返回一个多维数组。但如果是这种情况,那么您需要的数组索引将始终相同,因此它可以是$headmark[0]$headmark[1],但不是$headmark[$i],因为$ i是行号,因此与行本身的解释无关。