如何将Excel读取PHP程序的数据传递至数据库写入PHP程序?
实现两个PHP程序的数据传递连接方案
咱们先梳理下原代码里的几个关键问题,再一步步修改实现完整的数据流:
一、修正核心问题,打通数据传递链路
1. 第一个程序(readExcel_SendResult.php):实际发起请求到数据库写入程序
原代码里只拼接了$shell变量但没实际发送请求,我们需要把每一行生成的$str通过HTTP请求发送到send_datatoDB.php。另外,GET请求里的特殊字符(比如逗号、空格)需要编码,避免解析错误。
修改循环内的代码:
for($i=0; $i<$num_row; $i++){ // ... 保留原有的变量赋值、日期转换等处理代码 ... $jdate = $yy . "-" . $mm . "-" . $dd; // 去掉末尾的\n(GET请求里换行容易导致解析异常) $str = $jdate . "," . $block . "," . $a_harv . "," . $b_harv . "," . $loss . "," . $sweet . "," . $species . "," . $comment; // 对字符串做URL编码,避免特殊字符干扰参数解析 $encodedStr = urlencode($str); // 构造请求URL,指向数据库写入程序 $requestUrl = 'send_datatoDB.php?ARG=' . $encodedStr; // 发起GET请求(用file_get_contents,需确保php.ini中allow_url_fopen开启) $response = file_get_contents($requestUrl); // 可选:打印响应,方便排查处理结果 echo "第".($i+1)."条数据处理结果:" . $response . "<br>"; }
如果服务器禁用了allow_url_fopen,可以改用curl发起请求,替换上面的请求代码:
$ch = curl_init(); curl_setopt($ch, CURLOPT_URL, $requestUrl); curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); $response = curl_exec($ch); if(curl_errno($ch)){ echo "请求错误:" . curl_error($ch); } curl_close($ch);
2. 第二个程序(send_datatoDB.php):修正参数接收与代码错误
原代码存在参数接收错误、SQL拼写错误、过时函数等问题,一起修正:
global $link, $db; include'excel_db.php'; include('db.inc'); // 修正:接收正确的参数ARG,并且解码URL编码的内容 if(!isset($_GET['ARG'])){ echo "缺少必要参数"; exit(); } $receivedStr = urldecode($_GET['ARG']); list($sdate,$block,$a_harv,$b_harv,$loss,$sweet,$species,$comment) = explode(",", $receivedStr); $block = mb_convert_kana($block,"r","utf-8"); if($species == "type1"){ $vid = "v2"; } else if ($species == "type2"){ $vid = "v3"; } else if ($species == "type3"){ $vid = "v1"; } else { $vid = "v4"; } if(is_numeric($sweet)){ $sweetness = $sweet; $s_and_c = $comment; } else { $sweetness = 0.0; $s_and_c = $sweet . $comment; } connect_mysql($link, $db); // 修正SQL拼写错误:tableNamw → tableName,同时用预处理语句防止SQL注入 $sql = "Select hid from tableName where sdate = ? and block = ? and vid = ?"; $stmt = mysqli_prepare($link, $sql); mysqli_stmt_bind_param($stmt, "sss", $sdate, $block, $vid); mysqli_stmt_execute($stmt); $result = mysqli_stmt_get_result($stmt); $row_cnt = mysqli_num_rows($result); echo "Result Number:" . $row_cnt . "<br>"; $hid = null; if($row_cnt > 0){ $row = mysqli_fetch_assoc($result); $hid = $row['hid']; } mysqli_stmt_close($stmt); mysqli_close($link); connect_mysql($link, $db); if($row_cnt < 1){ // INSERT操作:用预处理语句避免SQL注入 $sql = "INSERT into tableName (`sdate`, `block`, `vid`, `A_harv`, `B_harv`, `loss`, `sweetness`, `comments`) VALUES (?, ?, ?, ?, ?, ?, ?, ?)"; $stmt = mysqli_prepare($link, $sql); mysqli_stmt_bind_param($stmt, "sssssdds", $sdate, $block, $vid, $a_harv, $b_harv, $loss, $sweetness, $s_and_c); $result_id = mysqli_stmt_execute($stmt); } else { // UPDATE操作:修正mysql_query为mysqli_query,同时用预处理语句 $sql = "UPDATE tableName SET A_harv = ?, B_harv = ?, loss = ?, sweetness = ?, comments = ? where hid = ?"; $stmt = mysqli_prepare($link, $sql); mysqli_stmt_bind_param($stmt, "sssdsd", $a_harv, $b_harv, $loss, $sweetness, $s_and_c, $hid); $result_id = mysqli_stmt_execute($stmt); } if(!$result_id){ echo "操作失败:" . mysqli_error($link); exit(); } echo "操作成功"; mysqli_stmt_close($stmt); mysqli_close($link);
二、额外注意事项
- SQL注入防护:原代码直接把变量拼进SQL的做法非常危险,上面的修改用了mysqli预处理语句,彻底避免了注入风险。
- 请求方式选择:如果Excel数据量较大,或者包含大量特殊字符,建议改用POST请求传递数据,比GET更稳定。
- 错误处理:可以在两个程序中增加更多异常捕获,比如Excel读取失败、数据库连接失败等场景的提示,方便排查问题。
内容的提问来源于stack exchange,提问作者DenisDPR
相关产品推荐
相关产品推荐

