You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何将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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.28 04:22:23