网站

  • 网站

    代理服务器的一些坑

    如果是通过代理服务器运行的场景,必须给 URL 加上 http(或 https)协议前缀,不能再使用无协议的相对路径(如 allroute_api.php)或本地文件路径,这是代理服务器的运行机制决定的,下面详细说明原因和具体操作:

    一、核心原因:代理服务器的运行机制不支持无协议本地路径

    当你的项目通过代理服务器运行时,index.php 和 allroute_api.php 不再是「本地文件系统直接调用」,而是遵循「客户端→代理服务器→目标服务器」的网络请求链路,核心逻辑如下:
    1. 无协议相对路径(如 allroute_api.php:PHP 会默认将其当作「本地文件路径」处理,尝试在代理服务器的本地文件系统中查找该文件,而非通过代理转发到目标服务器执行 PHP 脚本;
    2. 代理服务器的核心作用:仅转发「标准 HTTP/HTTPS 网络请求」,无法识别和处理「本地文件路径格式」的调用,最终会导致 file_get_contents 找不到文件(返回 false),或读取到无效文件内容(非 JSON 响应);
    3. 带 http 的 URL(如 http://目标域名/allroute_api.php:这是标准的网络请求地址,代理服务器能正常识别并转发该请求到目标服务器,目标服务器会执行 PHP 脚本并返回 JSON 响应,再由代理服务器将响应传回 index.php
  • 网站

    mysql查询数据,第二个row没有数据

    你想知道为什么代码中第二个row没有数据,核心原因是MySQLi 结果集的指针已经遍历到末尾,无法再次读取数据

    ,具体分析和解决方案如下:

    一、核心原因:结果集指针已耗尽(一次性遍历特性)

    1. 结果集指针的工作机制$stmt->get_result( 获取的 $result 是一个单向移动的结果集,它内部有一个 “指针”,用于指向当前要读取的数据行。当你执行 while $row = mysqli_fetch_assoc($result)) 时,循环会不断调用 mysqli_fetch_assoc( 方法:
      • 每次调用会读取当前指针指向的行数据,并将指针向后移动一位
      • 当指针移动到结果集末尾(没有更多数据行)时,mysqli_fetch_assoc() 会返回 false,循环终止。

        此时,结果集指针已经停留在末尾,无法再向前移动,这就是 MySQLi 结果集的一次性遍历特性(默认不可重复读取)。

    2. 你的代码执行流程导致指针耗尽
      • 第一步:第一个 while ($row = mysqli_fetch_assoc($result 循环已经完整遍历了所有结果行,指针移动到末尾,循环结束;
      • 第二步:当你后续尝试再次使用 while ($row = mysqli_fetch_assoc($result(else 分支中),或者直接打印 $row 时,由于指针已经在末尾,mysqli_fetch_assoc($result 只能返回 false,因此 $row 没有有效数据(要么是 false,要么是最后一行数据的残留,但无法读取新数据)。
    3. 补充:关于$row变量的残留问题你后续打印的 $row 并非 “新读取的数据”,而是第一个循环结束后的值:
      • 循环终止时,$row = .....mysqli_fetch_assoc($result 赋值为 false(因为指针到末尾);
      • 若你用 isset$row) 判断,false 在 PHP 中是 “已设置” 状态,因此会打印 false(看起来没有有效数据);
      • 即使有残留,也只是最后一行数据的副本,并非重新读取的结果,且无法获取其他行数据。

    方法 3:使用 mysqli_fetch_all() 一次性获取所有行(简化版方法 1)

    PHP 5.3+ 支持 mysqli_fetch_all($result, MYSQLI_ASSOC) 方法,可直接将结果集的所有行一次性读取为关联数组,无需手动循环,更简洁。