PHP中file_exists()使用数据库变量拼接路径失效求助
问题排查与解决方案
核心错误:路径变量定义位置错误
你当前的代码中,$file_pointerTOB 是在 while 循环外面定义的,此时$row还未从数据库结果集中获取数据,$row['ref']的值无效(可能为空或未定义),导致拼接出的路径根本不是目标文件的正确路径。
修改后的代码片段
把路径变量的定义移到while循环内部,每次循环都根据当前行的ref值重新拼接路径:
if($result = mysqli_query($link, $sql)){ if(mysqli_num_rows($result) > 0){ echo "<table class='table table-bordered table-striped'>"; echo "<thead>"; echo "<tr>"; echo "<th>Client ID</th>"; echo "<th>Client Name</th>"; echo "<th>Terms of Business</th>"; echo "</tr>"; echo "</thead>"; echo "<tbody>"; while($row = mysqli_fetch_array($result)){ // 将路径定义移至循环内,每次使用当前行的ref值 $file_pointerTOB = '../uploads/clientupload/TOB-' . $row['ref'] . '.pdf'; echo "<tr>"; echo "<td>" . $row['ref'] . "</td>"; echo "<td>" . $row['name'] . "</td>"; echo"<td>"; if (file_exists($file_pointerTOB)) { echo '<img src="ticksm.jpg"/>'; } else { echo '<img src="crosssm.jpg"/>'; } echo "</td>"; echo "</tr>"; } echo "</tbody>"; echo "</table>"; } }
其他可能的排查方向
如果调整位置后仍有问题,检查以下几点:
- 清理
$row['ref']的多余字符:数据库中的ref可能包含空格、换行或制表符,用trim()处理:$file_pointerTOB = '../uploads/clientupload/TOB-' . trim($row['ref']) . '.pdf'; - 大小写匹配问题:Linux/Unix系统下文件名和路径区分大小写,确保数据库
ref的值与文件名大小写完全一致(比如AR001和ar001会被视为不同文件)。 - 文件权限:确保PHP运行用户(如
www-data)拥有目标文件的读取权限,同时文件所在目录要有执行权限(允许PHP遍历目录)。 - 改用绝对路径:相对路径可能受PHP工作目录影响,改用绝对路径避免歧义:
$file_pointerTOB = $_SERVER['DOCUMENT_ROOT'] . '/uploads/clientupload/TOB-' . trim($row['ref']) . '.pdf';
内容的提问来源于stack exchange,提问作者Kristoff
相关产品推荐
相关产品推荐

