我已经解决了这个问题,干净功能出现问题以及其他一些小错误,谢谢你的帮助。
我的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 />
答案 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;
}
}
}