IIS环境中因PHP版本过低导致SQL查询失败的解决方案
在IIS服务器环境下开发帝国CMS后台功能时,遇到一个典型问题:通过表单提交ID后,系统无法正确执行MySQL查询操作。需求是实现一个输入框,管理员输入外部链接地址后,原页面动态加载指定URL内容。该功能依赖于一个名为 GetUrlPage.php 的接口文件,用于接收参数并返回目标网页源码。
最初采用 mysqli 扩展编写数据库操作逻辑:
<?php
header("Content-Type: text/html;charset=utf-8");
$result = ['status' => 1];
$id = $_POST['id'] ?? null;
if (!$id) {
echo json_encode($result);
exit;
}
$connection = mysqli_connect("localhost", "root", "root", "ce");
if (mysqli_connect_errno()) {
die("数据库连接错误:" . mysqli_connect_error());
}
$sql = "SELECT change_url FROM phome_ecms_download WHERE id = " . intval($id);
$queryResult = mysqli_query($connection, $sql);
if ($queryResult) {
$row = mysqli_fetch_assoc($queryResult);
if (!empty($row['change_url'])) {
$content = fetchExternalPage($row['change_url']);
if ($content) {
$result['status'] = 2;
$result['info'] = $content;
}
}
}
function fetchExternalPage($url) {
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_HEADER, false);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false);
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true);
curl_setopt($ch, CURLOPT_TIMEOUT, 30);
$output = curl_exec($ch);
curl_close($ch);
return $output ? $output : null;
}
echo json_encode($result);
?>
然而,在实际运行中发现 $queryResult 虽然返回资源句柄,但无法从中提取数据,且无明显错误提示。经排查确认,当前IIS服务器运行的PHP版本为5.2.x,而 mysqli_query() 返回结果需配合 mysqli_fetch_assoc() 等函数使用才能获取数组数据,若未正确处理结果集,则表现为"查询无返回"。
由于环境限制无法升级PHP版本,因此改用已被弃用但兼容性更好的 mysql 扩展重写数据访问层:
<?php
header("Content-Type: text/html;charset=utf-8");
$result = ['status' => 1];
$id = isset($_POST['id']) ? intval($_POST['id']) : 0;
if (!$id) {
echo json_encode($result);
exit;
}
$link = @mysql_connect("localhost", "root", "root") or die('数据库连接失败:' . mysql_error());
@mysql_select_db("ce", $link) or die('选择数据库失败:' . mysql_error());
mysql_query("SET NAMES 'utf8'", $link);
$sql = "SELECT change_url FROM phome_ecms_download WHERE id = {$id}";
$query = mysql_query($sql, $link);
if ($query) {
$row = mysql_fetch_array($query, MYSQL_ASSOC);
if (!empty($row['change_url'])) {
$pageContent = fetchExternalPage($row['change_url']);
if ($pageContent) {
$result['status'] = 2;
$result['info'] = $pageContent;
}
}
}
function fetchExternalPage($url) {
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_HEADER, 0);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false);
$data = curl_exec($ch);
curl_close($ch);
return $data ?: null;
}
echo json_encode($result);
?>
部署后测试功能恢复正常,能够成功读取外部链接内容并返回JSON响应。此问题的根本原因在于PHP 5.2对 mysqli 面向过程调用的支持不完整或配置缺失,而旧版 mysql 函数仍被默认启用,具备更强的向下兼容能力。
建议在条件允许时升级至PHP 7+并使用PDO或改进后的MySQLi进行数据库交互,同时启用错误日志以提升调试效率。
