PHP上传Excel并批量添加数据到pgsql的问题,期待高人解答!

时间:2022-10-17 00:15:33
下面这个代码的作用是上传Excel并读取其中的数据,批量添加数据到pgsql数据库中,目前已成功实现上传并将数据读出来,但是在批量插入数据时出现错误(无法执行SQL语句),但用输出的$sql的值的语句直接在pgAdminIII中运行,又是成功的。哪位大神帮助看一下,不胜感激!
<?php
include_once("reader.php");
include_once("conn.php");

$remotefilename= date("Ymdhis").".xls";
if (substr($_FILES["file"]["name"],-4)==".xls")
{
  if ($_FILES["file"]["error"] > 0)
    {
    echo "Return Code: " . $_FILES["file"]["error"] . "<br />";
    }
  else
    {
     if(move_uploaded_file($_FILES["file"]["tmp_name"],"xlstmp/" .$remotefilename)==1)
 {
    //上传成功并开始读取xls文件
$data = new Spreadsheet_Excel_Reader();
        $data->setOutputEncoding('CP936');
$data->read("xlstmp/" .$remotefilename);
$count=0;
if($data->sheets[0]['numRows']>=2 && $data->sheets[0]['numCols']>=2)
{
for ($i = 2; $i <= $data->sheets[0]['numRows']; $i++)
{
$s="";
for ($j = 1; $j <= $data->sheets[0]['numCols']; $j++)
{
if(strlen($data->sheets[0]['cells'][$i][$j])==0) break;
$s.= $data->sheets[0]['cells'][$i][$j]."|";
}
 if(strlen($s)!=0)
{
 $count++;
$ss =explode('|',$s);//将关键词以空格分割到数组中。

// $sql="INSERT INTO zikao_tzd_kecheng(\"KC_DM\",\"KC_MC\")  VALUES('1111','ok')";
//执行上面这句都是可以的
 $sql="INSERT INTO zikao_tzd_kecheng(\"KC_DM\",\"KC_MC\")  VALUES('".$ss[0]."','".$ss[1]."')";
//执行上面这句就不成功。
// $sql="INSERT INTO zikao_tzd_kecheng(\"KC_DM\",\"KC_MC\")  VALUES('".$data->sheets[0]['cells'][$i][1]."','".$data->sheets[0]['cells'][$i][2]."')";

 

 echo $sql."<br>";
                 $result = $PG -> query($sql);  
 }
}
echo $count."records";
}
else
 {
echo "xls's rows or columns is so few.";
 }

}
 else
         echo "upload failed.";
    }
 }
else
  {
  echo "invalid file";
  }
   $PG ->close();
?>

9 个解决方案

#1


再加30分,期待高人解答!

#2


没有错误信息吗

#3


错误提示就是:The database query fail
可我直接用调试时输出的$sql的值直接在pgAdminIII中执行,又是成功插入数据的。
如:INSERT INTO zikao_tzd_kecheng("KC_DM","KC_MC") VALUES('3708','中国近现代史纲要')
但VALUES中使用从Excel可读出来的变量又不行。

#4


// $sql="INSERT INTO zikao_tzd_kecheng(\"KC_DM\",\"KC_MC\")  VALUES('1111','ok')";
//执行上面这句都是可以成功插入的
$sql="INSERT INTO zikao_tzd_kecheng(\"KC_DM\",\"KC_MC\")  VALUES('".$ss[0]."','".$ss[1]."')";
//但上面这句用变量$ss[0],$ss[1]就插入不成功,提示The database query fail

#5


echo pg_last_error($PG);   看看

echo $sql; 
贴出结果看看

#6


这是echo $sql的结果。
INSERT INTO zikao_tzd_kecheng("KC_DM","KC_MC") VALUES('6029','工作分析')
The database query fail.INSERT INTO zikao_tzd_kecheng("KC_DM","KC_MC") VALUES('3708','中国近现代史纲要')
The database query fail.INSERT INTO zikao_tzd_kecheng("KC_DM","KC_MC") VALUES('0112','计算机基础')
The database query fail.INSERT INTO zikao_tzd_kecheng("KC_DM","KC_MC") VALUES('0003','测试课程3')
The database query fail.INSERT INTO zikao_tzd_kecheng("KC_DM","KC_MC") VALUES('0003','测试课程4')
The database query fail.INSERT INTO zikao_tzd_kecheng("KC_DM","KC_MC") VALUES('0003','测试课程5')
The database query fail.INSERT INTO zikao_tzd_kecheng("KC_DM","KC_MC") VALUES('0003','测试课程6')
The database query fail.INSERT INTO zikao_tzd_kecheng("KC_DM","KC_MC") VALUES('0003','测试课程7')
The database query fail.INSERT INTO zikao_tzd_kecheng("KC_DM","KC_MC") VALUES('0003','测试课程8')
The database query fail.INSERT INTO zikao_tzd_kecheng("KC_DM","KC_MC") VALUES('0003','测试课程9')
The database query fail.INSERT INTO zikao_tzd_kecheng("KC_DM","KC_MC") VALUES('0003','测试课程10')
The database query fail.INSERT INTO zikao_tzd_kecheng("KC_DM","KC_MC") VALUES('0003','测试课程11')
The database query fail.INSERT INTO zikao_tzd_kecheng("KC_DM","KC_MC") VALUES('0003','测试课程12')
The database query fail.INSERT INTO zikao_tzd_kecheng("KC_DM","KC_MC") VALUES('0003','测试课程13')
The database query fail.INSERT INTO zikao_tzd_kecheng("KC_DM","KC_MC") VALUES('0003','测试课程14')
The database query fail.INSERT INTO zikao_tzd_kecheng("KC_DM","KC_MC") VALUES('0003','测试课程15')
The database query fail.INSERT INTO zikao_tzd_kecheng("KC_DM","KC_MC") VALUES('0003','测试课程16')
The database query fail.INSERT INTO zikao_tzd_kecheng("KC_DM","KC_MC") VALUES('0003','测试课程17')
The database query fail.INSERT INTO zikao_tzd_kecheng("KC_DM","KC_MC") VALUES('0003','测试课程18')
The database query fail.INSERT INTO zikao_tzd_kecheng("KC_DM","KC_MC") VALUES('0003','测试课程19')
The database query fail.INSERT INTO zikao_tzd_kecheng("KC_DM","KC_MC") VALUES('0003','测试课程20')
The database query fail.INSERT INTO zikao_tzd_kecheng("KC_DM","KC_MC") VALUES('0003','测试课程21')
The database query fail.INSERT INTO zikao_tzd_kecheng("KC_DM","KC_MC") VALUES('0003','测试课程22')
The database query fail.INSERT INTO zikao_tzd_kecheng("KC_DM","KC_MC") VALUES('0003','测试课程23')
The database query fail.INSERT INTO zikao_tzd_kecheng("KC_DM","KC_MC") VALUES('0003','测试课程24')
The database query fail.INSERT INTO zikao_tzd_kecheng("KC_DM","KC_MC") VALUES('0003','测试课程25')
The database query fail.

#7


conn.php内容
<?php
include 'class/PGDB.php';  
$PG = new pgsql("localhost", "5432", "name", "user", "pass");  
$PG->connect();
if(!$PG)  
{  
echo "无法连接到PostGreSQL数据库!";
exit;

?>

PGDB.php内容
<?php  class pgsql
 {
  private $linkid; // PostgreSQL连接标识符
  private $host; // PostgreSQL服务器主机
  private $port; // PostgreSQL服务器主机端口
  private $user; // PostgreSQL用户
  private $passwd; // PostgreSQL密码 
 private $db; // Postgresql数据库
  private $result; // 查询的结果  
private $querycount; // 已执行的查询总数  
/* 类构造函数,用来初始化$host、$user、$passwd和$db字段。 */  
function __construct($host, $port ,$db, $user, $passwd) {  
$this->host = $host;  
$this->port = $port;  
$this->user = $user;  
$this->passwd = $passwd;  
$this->db = $db;  
}  
/* 连接Postgresql数据库 */  
function connect(){  
try{  
$this->linkid = @pg_connect("host=$this->host port=$this->port dbname=$this->db  
user=$this->user password=$this->passwd");  
if (! $this->linkid)  
throw new Exception("Could not connect to PostgreSQL server.");  
}  
catch (Exception $e) {  
die($e->getMessage());  
}  
}  
/* 执行数据库查询。 */  
function query($query){  
try{  
$this->result = @pg_query($this->linkid,$query);  
if(! $this->result)  
throw new Exception("The database query fail.");  
}  
catch (Exception $e){  
echo $e->getMessage();  
}  
$this->querycount++;  
return $this->result;  
}  
/* 确定受查询所影响的行的总计。 */  
function affectedRows(){  
$count = @pg_affected_rows($this->linkid);  
return $count;  
}  
/* 确定查询返回的行的总计。 */  
function numRows(){  
$count = @pg_num_rows($this->result);  
return $count;  
}  
/* 将查询的结果行作为一个对象返回。 */  
function fetchObject(){  
$row = @pg_fetch_object($this->result);  
return $row;  
}  
/* 将查询的结果行作为一个索引数组返回。 */  
function fetchRow(){  
$row = @pg_fetch_row($this->result);  
return $row;  
}  
/* 将查询的结果行作为一个关联数组返回。 */  
function fetchArray(){  
$row = @pg_fetch_array($this->result);  
return $row;  
}  
/* 返回在这个对象的生存期内执行的查询总数。这不是必须的,但是您也许会感兴趣。 */  
function numQueries(){  
return $this->querycount;  
}  
function close()
 {
 @pg_close($this->linkid);
 }

}  
?>  

#8


你这个应该是页面编码的问题。中文可能乱码了。
mysql_query('set names utf8')

#9


的确如lang11zi 所说,我把需要写入的字符串转化为 utf8就ok了。因为字符串是从 Excel读出来的,默认是GB2312。
谢谢以上各位的解答。散分。

#1


再加30分,期待高人解答!

#2


没有错误信息吗

#3


错误提示就是:The database query fail
可我直接用调试时输出的$sql的值直接在pgAdminIII中执行,又是成功插入数据的。
如:INSERT INTO zikao_tzd_kecheng("KC_DM","KC_MC") VALUES('3708','中国近现代史纲要')
但VALUES中使用从Excel可读出来的变量又不行。

#4


// $sql="INSERT INTO zikao_tzd_kecheng(\"KC_DM\",\"KC_MC\")  VALUES('1111','ok')";
//执行上面这句都是可以成功插入的
$sql="INSERT INTO zikao_tzd_kecheng(\"KC_DM\",\"KC_MC\")  VALUES('".$ss[0]."','".$ss[1]."')";
//但上面这句用变量$ss[0],$ss[1]就插入不成功,提示The database query fail

#5


echo pg_last_error($PG);   看看

echo $sql; 
贴出结果看看

#6


这是echo $sql的结果。
INSERT INTO zikao_tzd_kecheng("KC_DM","KC_MC") VALUES('6029','工作分析')
The database query fail.INSERT INTO zikao_tzd_kecheng("KC_DM","KC_MC") VALUES('3708','中国近现代史纲要')
The database query fail.INSERT INTO zikao_tzd_kecheng("KC_DM","KC_MC") VALUES('0112','计算机基础')
The database query fail.INSERT INTO zikao_tzd_kecheng("KC_DM","KC_MC") VALUES('0003','测试课程3')
The database query fail.INSERT INTO zikao_tzd_kecheng("KC_DM","KC_MC") VALUES('0003','测试课程4')
The database query fail.INSERT INTO zikao_tzd_kecheng("KC_DM","KC_MC") VALUES('0003','测试课程5')
The database query fail.INSERT INTO zikao_tzd_kecheng("KC_DM","KC_MC") VALUES('0003','测试课程6')
The database query fail.INSERT INTO zikao_tzd_kecheng("KC_DM","KC_MC") VALUES('0003','测试课程7')
The database query fail.INSERT INTO zikao_tzd_kecheng("KC_DM","KC_MC") VALUES('0003','测试课程8')
The database query fail.INSERT INTO zikao_tzd_kecheng("KC_DM","KC_MC") VALUES('0003','测试课程9')
The database query fail.INSERT INTO zikao_tzd_kecheng("KC_DM","KC_MC") VALUES('0003','测试课程10')
The database query fail.INSERT INTO zikao_tzd_kecheng("KC_DM","KC_MC") VALUES('0003','测试课程11')
The database query fail.INSERT INTO zikao_tzd_kecheng("KC_DM","KC_MC") VALUES('0003','测试课程12')
The database query fail.INSERT INTO zikao_tzd_kecheng("KC_DM","KC_MC") VALUES('0003','测试课程13')
The database query fail.INSERT INTO zikao_tzd_kecheng("KC_DM","KC_MC") VALUES('0003','测试课程14')
The database query fail.INSERT INTO zikao_tzd_kecheng("KC_DM","KC_MC") VALUES('0003','测试课程15')
The database query fail.INSERT INTO zikao_tzd_kecheng("KC_DM","KC_MC") VALUES('0003','测试课程16')
The database query fail.INSERT INTO zikao_tzd_kecheng("KC_DM","KC_MC") VALUES('0003','测试课程17')
The database query fail.INSERT INTO zikao_tzd_kecheng("KC_DM","KC_MC") VALUES('0003','测试课程18')
The database query fail.INSERT INTO zikao_tzd_kecheng("KC_DM","KC_MC") VALUES('0003','测试课程19')
The database query fail.INSERT INTO zikao_tzd_kecheng("KC_DM","KC_MC") VALUES('0003','测试课程20')
The database query fail.INSERT INTO zikao_tzd_kecheng("KC_DM","KC_MC") VALUES('0003','测试课程21')
The database query fail.INSERT INTO zikao_tzd_kecheng("KC_DM","KC_MC") VALUES('0003','测试课程22')
The database query fail.INSERT INTO zikao_tzd_kecheng("KC_DM","KC_MC") VALUES('0003','测试课程23')
The database query fail.INSERT INTO zikao_tzd_kecheng("KC_DM","KC_MC") VALUES('0003','测试课程24')
The database query fail.INSERT INTO zikao_tzd_kecheng("KC_DM","KC_MC") VALUES('0003','测试课程25')
The database query fail.

#7


conn.php内容
<?php
include 'class/PGDB.php';  
$PG = new pgsql("localhost", "5432", "name", "user", "pass");  
$PG->connect();
if(!$PG)  
{  
echo "无法连接到PostGreSQL数据库!";
exit;

?>

PGDB.php内容
<?php  class pgsql
 {
  private $linkid; // PostgreSQL连接标识符
  private $host; // PostgreSQL服务器主机
  private $port; // PostgreSQL服务器主机端口
  private $user; // PostgreSQL用户
  private $passwd; // PostgreSQL密码 
 private $db; // Postgresql数据库
  private $result; // 查询的结果  
private $querycount; // 已执行的查询总数  
/* 类构造函数,用来初始化$host、$user、$passwd和$db字段。 */  
function __construct($host, $port ,$db, $user, $passwd) {  
$this->host = $host;  
$this->port = $port;  
$this->user = $user;  
$this->passwd = $passwd;  
$this->db = $db;  
}  
/* 连接Postgresql数据库 */  
function connect(){  
try{  
$this->linkid = @pg_connect("host=$this->host port=$this->port dbname=$this->db  
user=$this->user password=$this->passwd");  
if (! $this->linkid)  
throw new Exception("Could not connect to PostgreSQL server.");  
}  
catch (Exception $e) {  
die($e->getMessage());  
}  
}  
/* 执行数据库查询。 */  
function query($query){  
try{  
$this->result = @pg_query($this->linkid,$query);  
if(! $this->result)  
throw new Exception("The database query fail.");  
}  
catch (Exception $e){  
echo $e->getMessage();  
}  
$this->querycount++;  
return $this->result;  
}  
/* 确定受查询所影响的行的总计。 */  
function affectedRows(){  
$count = @pg_affected_rows($this->linkid);  
return $count;  
}  
/* 确定查询返回的行的总计。 */  
function numRows(){  
$count = @pg_num_rows($this->result);  
return $count;  
}  
/* 将查询的结果行作为一个对象返回。 */  
function fetchObject(){  
$row = @pg_fetch_object($this->result);  
return $row;  
}  
/* 将查询的结果行作为一个索引数组返回。 */  
function fetchRow(){  
$row = @pg_fetch_row($this->result);  
return $row;  
}  
/* 将查询的结果行作为一个关联数组返回。 */  
function fetchArray(){  
$row = @pg_fetch_array($this->result);  
return $row;  
}  
/* 返回在这个对象的生存期内执行的查询总数。这不是必须的,但是您也许会感兴趣。 */  
function numQueries(){  
return $this->querycount;  
}  
function close()
 {
 @pg_close($this->linkid);
 }

}  
?>  

#8


你这个应该是页面编码的问题。中文可能乱码了。
mysql_query('set names utf8')

#9


的确如lang11zi 所说,我把需要写入的字符串转化为 utf8就ok了。因为字符串是从 Excel读出来的,默认是GB2312。
谢谢以上各位的解答。散分。