PHP“;期望参数1为资源,布尔值为“给定”;

PHP“;期望参数1为资源,布尔值为“给定”;,php,mysql,oop,fetch,Php,Mysql,Oop,Fetch,我已经解决了这个问题,clean函数中出现了一个问题和其他一些小错误,感谢您的帮助。 我的PHP代码似乎有问题。我不断发现错误: 警告:mysql\u fetch\u array()期望参数1是给定的布尔值资源 警告:mysql\u num\u rows()希望参数1是给定的资源字符串 public function\uuuu construct(){ 全球$db,$core; $this->sessionID=$core->encrypt(session_id()); $sessionQuer

我已经解决了这个问题,clean函数中出现了一个问题和其他一些小错误,感谢您的帮助。

我的PHP代码似乎有问题。我不断发现错误:

警告:mysql\u fetch\u array()期望参数1是给定的布尔值资源
警告:mysql\u num\u rows()希望参数1是给定的资源字符串
public function\uuuu construct(){
全球$db,$core;
$this->sessionID=$core->encrypt(session_id());
$sessionQuery=$db->query(“从`session\u id`='{$this->sessionId}'所在的会话中选择*);
$sessionRow=$db->assoc($sessionQuery);
如果($db->num($sessionQuery)>0){
$userQ=$db->query(“从id='{$sessionRow['user\u id']}'的用户中选择*);
$this->loggedIn=true;
$this->userData=$db->assoc($userQ);
}       
}       
}
$user=新用户();
?>




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

我建议处理mysql错误以避免此类警告

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

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

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

您还应该确保PHP设置为报告警告

您可以使用
mysql\u error

以编程方式检查连接是否存在错误


在创建连接和运行每个查询后检查错误。如果查询中存在语法错误,则资源对象仅为
false
,通过使用
mysql\u error
$this->sessionId
而不是
$this->sessionId>传递给查询,可以轻松识别资源对象。请注意大小写的差异。

您正在将整个SQL字符串传递给
mysql\u real\u escape\u string
函数中的
clean
字符串(出于某种原因,您从问题中删除了该字符串)

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();
这将导致对传递的单引号进行转义,从而导致错误的SQL字符串,从而导致返回FALSE,而不是有效的资源

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



这不是我们要找的代码,它包含所有的查询,函数工作正常。不,它们不工作。错误消息意味着出现了问题。你把这些
mysql\uuu
函数称为什么?如果我们不知道,
$db
是什么,我们该如何帮助他?@Josh这不是我们要找的代码。您的错误是由您发布的代码中没有出现的
mysql.*
函数引起的。我怀疑它们是从任何包装类
$db
的实例中调用的。我们要去看那个班。谢谢!阅读我发布的代码并试图找到错误的人。但是仍然有一个错误:/If仍然有一个错误,这意味着您的查询要么有语法错误,要么没有返回任何内容(就像Codemonkey在他的回答中指出的那样)。在将会话ID存储到数据库之前,您是否加密了它?如果不是,则不应在尝试查询它之前对其进行加密(
$this->sessionID=$core->encrypt(session_id())
)。如果手动运行查询(命令行/shell/query浏览器),会发生什么情况?我改变了一些事情,我得到了
https://lh3.googleusercontent.com/-zjy4uQGU_3k/TW1AU5fqS9I/AAAAAAAADvc/ecAc2LfXOaA/s1600/WOMEN-Y-U-NO-MAKE-SENSE.jpg
我不确定我是否理解该注释。不返回任何行的查询仍然会生成一个碰巧没有行的结果集。FALSE仅在查询因错误而失败时返回。True,如果没有行,则是mysql_fetch_*函数返回FALSE。请原谅混淆,我会更正答案:-)我已经这样做了,现在我得到了
注意:未定义的属性:User::$sessionId在C:\xampp\htdocs\habcms\inc\User.inc.php的第13行d97d0031704680f93b135e138e1f514b
现在我编辑了查询行,您的会话保存在$this->$sessionId,但在查询中用作$sessionId。这就是问题所在。只需查看$This->sessionID和$sessionQuery=$db->query(“从会话中选择*,其中
session\u id
='{$This->sessionID}');
$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;
        }
    }
}