PHP“将参数1视为资源,给定布尔值”

时间:2011-04-20 17:35:44

标签: php mysql oop fetch

我已经解决了这个问题,干净功能出现问题以及其他一些小错误,谢谢你的帮助。

我的PHP代码似乎有问题。我一直在收到错误:

  

Warning: mysql_fetch_array() expects parameter 1 to be resource, boolean given   Warning: mysql_num_rows() expects parameter 1 to be resource, string given        

        public function __construct() {
            global $db, $core;

            $this->sessionID = $core->encrypt(session_id());

            $sessionQuery = $db->query("SELECT * FROM sessions WHERE `session_id` = '{$this->sessionId}'");
            $sessionRow = $db->assoc($sessionQuery);

            if($db->num($sessionQuery) > 0) {
                $userQ = $db->query("SELECT * FROM users WHERE id = '{$sessionRow['user_id']}'");
                $this->loggedIn = true;
                $this->userData = $db->assoc($userQ);
            }       
        }       
    }
    $user = new User();

?>  <br /><br />



5 个答案:

答案 0 :(得分:4)

您将$this->sessionId而不是$this->sessionID传递给查询。注意资本化的差异。

答案 1 :(得分:3)

$sessionQuery不是有效的mysql资源,因为您在查询中传递了错误的变量,因此查询失败了。

我建议处理mysql错误以避免这种类型的警告。

您正在$this->sessionID中存储会话ID,并在查询中使用$this->sessionId 它应该是

$db->query("SELECT * FROM sessions WHERE `session_id` = '{$this->sessionID}'");

答案 2 :(得分:1)

当您的查询中存在语法错误时,会发生这种情况。请通过在PhpMyAdmin中运行查询来确认您的查询没有语法错误。

此外,您应确保将PHP设置为报告警告
http://php.net/manual/en/function.error-reporting.php

您可以使用mysql_error以编程方式检查连接是否存在错误 http://php.net/manual/en/function.mysql-error.php

在创建连接后以及运行的每个查询后检查错误。如果查询中存在语法错误,则资源对象仅为false,并且使用mysql_error

可以轻松识别它

答案 3 :(得分:1)

public function __construct() {
            global $db, $core;

            $this->sessionID = $core->encrypt(session_id());

            $sessionQuery = $db->query("SELECT * FROM sessions WHERE `session_id` = '{$this->sessionID}'");
            if($sessionQuery){ // newly added line      
            $sessionRow = $db->assoc($sessionQuery);

            if($db->num($sessionQuery) > 0) {
                $userQ = $db->query("SELECT * FROM users WHERE id = '{$sessionRow['user_id']}'");
                $this->loggedIn = true;
                $this->userData = $db->assoc($userQ);
            } 
            } // newly added line      
        }       
    }
    $user = new User();

答案 4 :(得分:1)

您正在将mysql_real_escape_string函数中的整个SQL字符串传递给clean(由于某种原因,您已将其从问题中删除)。

这会导致传递的单引号被转义,导致格式错误的SQL字符串导致返回FALSE,而不是有效资源。

$sessionQuery = $db->query("SELECT * FROM sessions WHERE `session_id` = '{$this->sessionId}'");

public function query($string) {
    global $core;
    $string = $core->clean($string);
    return mysql_query($string);
}

public function clean($string, $fordb = true) {
    if(is_array($string)) {
        foreach($string as $key => $value) {
            $string[$key] = $this->clean($value, $fordb);
        }

        return $string;
    } else {

        $string = trim($string);
        $input = htmlentities($input, ENT_COMPAT);

        if($fordb == true) {
            $string = mysql_real_escape_string($string);
            return $string;
        }
    }
}