关于warning: mysql_result() expects parameter 1 to be resource,object given in……的解决方法

本文介绍了解决PHP中mysql_result函数被弃用的问题,通过创建自定义的mysqli_result函数来替代原有的mysql_result函数,确保代码在新版本PHP环境中能够正常运行。


升级了php版本之后,运行以前的代码很多时候都会出现问题,因为官方自php5.3开始一直推荐mysqli 和 pdo 


通常使用mysql_result()的时候会这样报错:


查看源代码就是这样的





改为mysqli_query()还是会出现同样的问题,所以在php中直接写了个mysqli_result()的方法




    function mysqli_result($result, $number, $field=0) {
        mysqli_data_seek($result, $number);
        $row = mysqli_fetch_array($result);
        return $row[$field];
    }


变成




再次运行就没有问题了


如果多次用到这个方法的话,可以封装在一个文件中,每次调用一下就行了。


<think>我们正在处理一个PHPMySQL数据库查询错误。错误信息是:Warning:mysql_fetch_array()expectsparameter1toberesource,booleangiven这个错误通常发生在`mysql_fetch_array()`函数的参数不是资源类型(resource)而是布尔值(boolean)时。具体来说,当执行`mysql_query()`函数失败时,它会返回`false`(布尔值),而不是一个资源(resource)。然后,将这个`false`传递给`mysql_fetch_array()`就会导致这个错误。根据引用[4]和[5]的建议,我们可以通过以下步骤来解决1.**检查SQL查询语句是否正确**:因为查询失败才会返回false,所以首先检查SQL语句是否有语法错误或表名、字段名是否正确。2.**使用`ordie(mysql_error())`**:在`mysql_query()`后面添加`ordie(mysql_error())`,这样如果查询失败,程序会终止并输出具体的MySQL错误信息,方便我们定位问题。3.**去掉连接数据库时的`@`符号**:在调试时,如果使用了`@`符号来抑制错误信息,那么错误将不会显示。去掉`@`符号可以让我们看到连接数据库时的错误。4.**检查数据库连接**:确保数据库连接是成功的,因为如果连接失败,那么查询也会失败。具体操作如下:###步骤1:检查数据库连接在连接数据库时,使用`ordie()`来捕获连接错误,并确保没有使用`@`符号来抑制错误:```php$con=mysql_connect("localhost","username","password")ordie("连接错误:".mysql_error());mysql_select_db("database_name",$con)ordie("选择数据库错误:".mysql_error());```###步骤2:在查询中添加错误处理在执行查询的语句后,使用`ordie(mysql_error())`:```php$result=mysql_query("SELECT*FROM`table_name`")ordie("查询失败:".mysql_error());```###步骤3:检查查询结果在执行`mysql_fetch_array`之前,可以先判断`$result`是否为false(即查询失败):```phpif($result===false){die("查询失败:".mysql_error());}//否则正常处理结果while($row=mysql_fetch_array($result)){//处理每一行}```###示例代码修正假设原始代码是:```php$con=@mysql_connect("localhost","root","password");mysql_select_db("my_db",$con);$result=mysql_query("SELECT*FROMliebiaoWHEREleixing='女连衣裙'",$con);while($row=mysql_fetch_array($result)){//...}```修正后:```php//连接数据库,去掉@,并添加错误处理$con=mysql_connect("localhost","root","password")ordie("连接错误:".mysql_error());mysql_select_db("my_db",$con)ordie("选择数据库错误:".mysql_error());//执行查询,并添加错误处理$result=mysql_query("SELECT*FROMliebiaoWHEREleixing='女连衣裙'",$con)ordie("查询失败:".mysql_error());//然后循环结果while($row=mysql_fetch_array($result)){//处理每一行数据}```###其他注意事项-**PHP版本**:请注意,`mysql_*`函数在PHP5.5.0中已被废弃,并在PHP7.0.0中被移除。建议使用`mysqli`或`PDO`扩展来替代。-**错误报告**:在开发环境中,可以在代码开头设置错误报告级别,以便显示所有错误:```phperror_reporting(E_ALL);ini_set('display_errors',1);```通过以上步骤,我们可以捕获具体的MySQL错误信息,从而有针对性地解决问题。###相关问题1.如何将旧的`mysql_*`函数代码迁移到`mysqli`或`PDO`?2.在PHP中如何安全地防止SQL注入?3.除了`mysql_fetch_array()`,还有哪些函数可以获取查询结果?希望这些解决方案能帮助您解决问题。</think>### 解决 `mysql_fetch_array() expects parameter 1 to be resource, boolean given` 错误 这个错误表示 `mysql_fetch_array()` 函数的第一个参数需要是**资源类型**(resource),但实际接收到的是**布尔值**(boolean)。根本原因是 `mysql_query()` 执行失败返回了 `false`,而非有效的查询结果资源。以下是完整的解决方案: #### 1. **诊断错误原因(关键步骤)** 在 `mysql_query()` 后添加 `or die(mysql_error())`,直接捕获数据库错误信息: ```php $result = mysql_query("SELECT * FROM `liebiao` WHERE leixing = '女连衣裙'", $con) or die("查询失败: " . mysql_error()); // 显示具体SQL错误 ``` #### 2. **检查数据库连接** - 移除连接时的 `@` 错误抑制符,确保能看到连接错误: ```php // 错误写法(隐藏错误) $con = @mysql_connect("localhost", "root", "password"); // 正确写法 $con = mysql_connect("localhost", "root", "password") or die("连接失败: " . mysql_error()); ``` - 验证数据库选择: ```php mysql_select_db("your_database", $con) or die("选择数据库失败: " . mysql_error()); ``` #### 3. **常见错误原因及修复** | 原因 | 解决方案 | |---------------------|--------------------------------------------------------------------------| | **SQL语法错误** | 检查表名/字段名拼写,用反引号包裹特殊字符:``SELECT `user-name` FROM `table` `` | | **表或字段不存在** | 确认数据库结构是否变更 | | **连接未建立** | 确保 `$con` 是有效连接资源 | | **权限不足** | 检查数据库用户是否有 `SELECT` 权限 | | **查询条件值错误** | 验证 `WHERE` 条件中的值是否合法(如字符串需引号包裹) | #### 4. **安全处理查询结果** 在执行 `mysql_fetch_array` 前验证资源有效性: ```php if ($result !== false) { // 确保是有效资源 while ($row = mysql_fetch_array($result)) { // 处理数据 } } else { echo "查询无效,请检查SQL语句"; } ``` #### 5. **终极建议:升级扩展** `mysql_*` 函数已在 **PHP 7.0+ 中被移除**,强烈建议迁移: ```php // 使用 mysqli 扩展(面向对象方式) $mysqli = new mysqli("localhost", "user", "pass", "db"); $result = $mysqli->query("SELECT ...") or die($mysqli->error); while ($row = $result->fetch_array()) { ... } ``` > **重要提示**:生产环境务必关闭错误显示(`display_errors=Off`),改用日志记录错误,避免暴露敏感信息。 ### 相关问题 1. 如何将旧的 `mysql_*` 代码安全迁移到 `mysqli` 或 `PDO`? 2. 在 PHP 中如何有效防止 SQL 注入攻击? 3. `mysqli_fetch_array()` 与 `mysqli_fetch_assoc()` 有何区别? 4. 数据库查询返回空结果集时应该如何处理? [^1]: 引用自用户提供的错误示例 [^2]: 引用自用户提供的错误示例 [^3]: 引用自用户提供的错误示例 [^4]: 引用自用户提供的解决方案建议 [^5]: 引用自用户提供的解决方案建议
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值