PHP中PDO查询如何使用ORDER BY?NULL字段引发内存溢出问题
问题解决方法
一、修复ORDER BY SQL解析错误
MDBTools的SQL语法兼容度和Access原生存在差异,针对报错可尝试以下调整:
- 给排序字段加标识符:如果
data是字段名,可能被识别为关键字,用反引号或方括号包裹$query = "SELECT * FROM info ORDER BY `data` DESC LIMIT 20"; // 部分MDBTools版本也支持方括号写法 // $query = "SELECT * FROM info ORDER BY [data] DESC LIMIT 20"; - 替换LIMIT为TOP:部分旧版MDBTools对LIMIT支持不佳,改用Access风格的TOP语法
$query = "SELECT TOP 20 * FROM info ORDER BY `data` DESC";
二、解决NULL字段导致的内存溢出
内存溢出通常是PDO处理NULL值时的内存占用异常,可通过以下方式规避:
- 启用字符串化获取,将NULL转为空字符串
在创建PDO连接后添加属性设置:$connection = new PDO($dataSourceName); // 将NULL值转为空字符串,避免内存异常 $connection->setAttribute(PDO::ATTR_STRINGIFY_FETCHES, true); - 改用逐行获取数据,避免一次性加载所有结果
替换foreach循环为fetch循环,控制内存占用:$sth->execute(); while ($row = $sth->fetch(PDO::FETCH_ASSOC)) { print_r($row); }
额外建议
- 确保Ubuntu上安装的MDBTools是最新版本,旧版本存在较多SQL兼容和数据处理bug:
sudo apt update && sudo apt install mdbtools mdbtools-odbc - 避免使用
SELECT *,明确指定需要的字段,减少不必要的数据加载,同时规避潜在的字段名冲突问题
内容的提问来源于stack exchange,提问作者andreaS
相关产品推荐
相关产品推荐

