mysql_fetch_assoc(): supplied argument is not a valid MySQL result resource 错误的解决办法

本文记录了使用WordPress搭建联盟网站过程中,在激活Cookiehatter插件时遇到的错误及解决办法,涉及到数据库表名前缀的问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

最近用wp搭建一个联盟网站,在后台激活 cookie hatter插件时遇到如下错误提示: mysql_fetch_assoc(): supplied argument is not a valid MySQL result resource, 错误原因和解决方法如下:

 

在该插件附带文件cookiehatter.php的第122行处有如下语句:

$query = "SELECT wc.id, wc.postid, wc.url, wp.post_title FROM wp_cookieposts wc, wp_posts wp WHERE wp.ID = wc.postid";

 其中的表名wp_cookieposts和wp_posts是以wp作为前缀,也就是初次安装WordPress时默认的表名前缀,如果你在安装数据库时修改了表名前缀,那么这个地方也要对应修改,源文件中凡是涉及修改表名前缀的地方都要修改!

 

btw:这个插件对做联盟销售的blog无比方便,建议大家试用,该插件的功能简单说就是防止"掉单"现象,防止你推介的Cookies信息被别人篡改. 

 

 

<think>我们遇到的问题是:在PHP 5.3.29中,行`$total = mysql_fetch_assoc($count_result)['total'];`会导致语法错误,因为PHP 5.3及更早版本不支持数组直接解引用(即不能直接在函数返回的数组上使用下标访问)。 根据引用[1][2]中关于`mysql_fetch_assoc`的说明,它返回一个关联数组。在旧版PHP中,我们需要先将返回的数组赋值给一个变量,然后再通过这个变量访问数组元素。 因此,我们可以将代码拆分为两步: 1. 将`mysql_fetch_assoc`的结果赋值给一个临时变量。 2. 从这个临时变量中取出'total'键对应的值。 修改后的代码应该是: ```php $count_row = mysql_fetch_assoc($count_result); $total = $count_row['total']; ``` 这样修改后,代码就兼容PHP 5.3了。 现在,我们修改`paginate`方法中的相关行: 原始代码片段(错误行): ```php $total = mysql_fetch_assoc($count_result)['total']; ``` 修改为: ```php $count_row = mysql_fetch_assoc($count_result); $total = $count_row['total']; ``` 完整修改后的`paginate`方法如下: ```php public function paginate($sql, $page = 1, $per_page = 20) { $offset = ($page - 1) * $per_page; $result = $this->query($sql . " LIMIT $offset, $per_page"); $count_result = $this->query("SELECT COUNT(*) AS total FROM ($sql) AS count_table"); // 修复:将数组下标访问拆分为两步 $count_row = mysql_fetch_assoc($count_result); $total = $count_row['total']; $total_pages = ceil($total / $per_page); return array( 'data' => $result, 'total' => $total, 'total_pages' => $total_pages, 'current_page' => $page ); } ``` 同时注意,在PHP 5.3中,返回数组的语法`[]`也不支持,需要改为`array()`。因此,我们还需要将返回的数组使用`array()`语法。 修改前: ```php return [ 'data' => $result, 'total' => $total, 'total_pages' => $total_pages, 'current_page' => $page ]; ``` 修改后: ```php return array( 'data' => $result, 'total' => $total, 'total_pages' => $total_pages, 'current_page' => $page ); ``` 所以,完整的修改包括两点: 1. 拆分数组下标访问。 2. 将返回的短数组语法`[]`改为`array()`。 这样修改后,代码就可以在PHP 5.3.29上正常运行了。 注意:由于整个类中使用了`mysql_*`函数,这些函数在PHP 5.5.0中已被弃用,并在PHP 7.0.0中被移除。因此,建议在条件允许的情况下升级PHP版本,并迁移到MySQLi或PDO。 相关问题: 1. 如何在PHP 5.3中正确访问mysql_fetch_assoc返回的数组元素? 2. PHP 5.3中数组的声明方式与高版本有何不同? 3. 如何将使用mysql扩展的代码迁移到mysqli或PDO? 4. 在低版本PHP中,如何实现分页功能? 5. 如何检测当前PHP版本并编写兼容代码?</think>### 修复 PHP 5.3.29 中 `mysql_fetch_assoc` 返回数组下标访问错误 #### 问题分析 在 PHP 5.3.29 中,直接对函数返回值进行数组索引操作 `mysql_fetch_assoc($count_result)['total']` 会导致语法错误,因为 PHP 5.4 以下版本不支持这种语法[^1][^2]。错误提示为: ``` Parse error: syntax error, unexpected '[' ``` #### 修复方案 将单行数组索引操作拆分为两步: ```diff // 原始错误代码 (PHP 5.3 不支持) - $total = mysql_fetch_assoc($count_result)['total']; // 修复后代码 (兼容 PHP 5.3) + $count_row = mysql_fetch_assoc($count_result); + $total = $count_row['total']; ``` #### 完整修复代码 修改后的 `paginate` 方法: ```php public function paginate($sql, $page = 1, $per_page = 20) { $offset = ($page - 1) * $per_page; $result = $this->query($sql . " LIMIT $offset, $per_page"); $count_result = $this->query("SELECT COUNT(*) AS total FROM ($sql) AS count_table"); // 修复:拆分数组索引操作 $count_row = mysql_fetch_assoc($count_result); $total = $count_row['total']; $total_pages = ceil($total / $per_page); // PHP 5.3 需要改用 array() 语法 return array( 'data' => $result, 'total' => $total, 'total_pages' => $total_pages, 'current_page' => $page ); } ``` #### 额外注意事项 1. **数组声明语法**: ```diff // 错误 (PHP 5.3 不支持) - return ['key' => 'value']; // 正确 + return array('key' => 'value'); ``` 2. **错误处理**: 添加错误检查确保查询成功: ```php $count_row = mysql_fetch_assoc($count_result); if (!$count_row) { die('获取总数失败: ' . mysql_error()); } $total = $count_row['total']; ``` 3. **SQL 兼容性**: 确保子查询兼容旧版 MySQL: ```sql SELECT COUNT(*) AS total FROM (SELECT ...) AS count_table ``` #### 替代方案(推荐) 考虑升级到 **MySQLi** 或 **PDO** 扩展,它们提供更现代的 API 并支持 PHP 7+: ```php // MySQLi 示例 $result = $mysqli->query("SELECT COUNT(*) AS total FROM table"); $row = $result->fetch_assoc(); $total = $row['total']; ``` ### 相关问题 1. **PHP 5.3 兼容性**: 如何在 PHP 5.3 中安全访问嵌套数组元素? *解决方案:使用临时变量存储中间结果* 2. **MySQL 扩展迁移**: 如何将 `mysql_*` 函数迁移到 MySQLi 或 PDO? *关键步骤:替换连接方式和使用预处理语句* 3. **分页优化**: 如何高效获取大数据集的总行数? *技巧:使用 `SQL_CALC_FOUND_ROWS` 和 `FOUND_ROWS()`[^4]* 4. **PHP 版本检测**: 如何编写兼容不同 PHP 版本的代码? *方法:使用 `version_compare(PHP_VERSION, '5.4.0')` 做条件判断* 5. **错误处理机制**: 如何增强数据库操作的错误处理? *建议:添加异常捕获和自定义错误日志[^3]* > 提示:强烈建议升级到 PHP 7.4+ 和 MySQLi/PDO,以获得更好的性能和安全性[^1][^2]。PHP 5.3 已于 2014 年停止支持,存在严重安全隐患。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值