我想上传要插入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);
}
请帮帮我。我在这里做错了什么?
答案 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是行号,因此与行本身的解释无关。