ホームページ > バックエンド開発 > PHPチュートリアル > PHP は Excel をアップロードし、バッチでデータを pgsql に追加します。専門家の回答を楽しみにしています。

PHP は Excel をアップロードし、バッチでデータを pgsql に追加します。専門家の回答を楽しみにしています。

WBOY
リリース: 2016-06-23 14:10:18
オリジナル
1219 人が閲覧しました

次のコードの機能は、Excel をアップロードしてそのデータを読み取り、pgsql データベースにデータをバッチで追加することです。アップロードは正常に実装され、データは読み込まれましたが、データを挿入するときにエラーが発生しました。ただし、$sql 値の出力ステートメントを使用して pgAdminIII で直接実行すると、再び成功します。誰か私を見て手伝ってくれませんか?とても感謝しています!

<?phpinclude_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();?>
ログイン後にコピー


ディスカッション (解決策) に返信

30 ポイントを追加します。専門家の回答をお待ちしています!

エラー メッセージはありませんか?

エラー メッセージは次のとおりです: データベース クエリが失敗しました
しかし、デバッグ中に出力された $sql 値を使用して pgAdminIII で直接実行でき、データは正常に挿入されます。
例: INSERT INTO zikao_tzd_kecheng("KC_DM","KC_MC") VALUES('3708','中国近現代史概説')
ただし、VALUES に Excel から読み取れる変数を使用することはできません。

// $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] は挿入に失敗し、プロンプトが表示されます。データベース クエリが失敗しました

echo pg_last_error($PG); 見てください

echo $sql;
結果を投稿してください

这是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.

conn.php内容

<?phpinclude '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);	 }}  ?>  
ログイン後にコピー

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

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

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート