PDO问题 - >调用非对象上的成员函数

时间:2011-09-06 19:04:17

标签: php mysql pdo

我一直在转向并扭曲这个我不存在的PDO知识,但仍然没有运气。

代码:

function write($id, $data) {
        global $dbcon;

        $id = mysql_real_escape_string($id);
        $data = mysql_real_escape_string($data);
        $sql = $dbcon->exec("INSERT INTO `sessions` 
                                        (`session_id`, `session_data`, 
                                         `session_expire`, `session_agent`, 
                                         `session_ip`, `session_referrer`) 
                                        VALUES
                                        (\"".$id."\", \"".$data."\",
                                         \"".time()."\",\"".($this->session_encryption($_SERVER['HTTP_USER_AGENT']))."\",
                                         \"".($this->session_encryption($_SERVER['REMOTE_ADDR']))."\", \"".($this->session_encryption((isset($_SERVER['HTTP_REFERER']) ? $_SERVER['HTTP_REFERER'] : str_shuffle('ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-_^~@&|=+;!,(){}[].?%*#'))))."\")
                                        ON DUPLICATE KEY UPDATE 
                                        `session_data` = \"".$data."\",
                                        `session_expire` = \"".time()."\"");
        return true;
    }

给我以下错误:

  

致命错误:在非对象上调用成员函数exec()

上的

  

$ sql = $ dbcon-> exec(

线。 我整个晚上都试图解决这个问题,但没有运气。

这是我的PDO连接脚本:

require_once(INC_PATH.'/config.php');

$dsn = "$db_type:host=$db_host;port=$db_port;dbname=$db_name;charset=$db_charset";
try{
    $dbcon = new PDO($dsn, $db_user, $db_pass);
    $dbcon->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);

    //$dbcon = null; //Close database connection.
}
catch(PDOException $e){
    echo $e->getMessage();
}
希望你们中间有一位善良的灵魂可以帮助我,我会深深体会到这一点!

感谢。

更新: 我有一个global.php文件,如下所示:

//Load database
require_once(INC_PATH.'/database.php');

//Load session handler
require_once(INC_PATH.'/class_sessions.php');
$Sessions = new SessionManager();
session_start();

database.php包含在sessions类之前,当我查看网站时,它不会在session类的这一部分上给出任何错误(在写函数之前:

function read($id) {
        global $dbcon;

        $data = '';
        $id = mysql_real_escape_string($id);
        $sql = $dbcon->prepare("SELECT 
                                `session_data` 
                            FROM 
                                `sessions` 
                            WHERE 
                                `session_id` = '".$id."'");

        $sql->execute();

        $a = $sql->columnCount();
        if($a > 0) {
            $row = $sql->fetchObject();
            $data = $row['session_data'];
        }

        return $data;
    }

2 个答案:

答案 0 :(得分:2)

您确定您的连接脚本正在执行吗?尝试检查是否设置了$dbcon。此外,您可能在连接脚本中缺少global $dbcon

顺便说一句,由于您已经在使用PDO,我建议您在查询中使用占位符:

$sql = "INSERT INTO `sessions` 
    (`session_id`, `session_data`, `session_expire`, 
        `session_agent`, `session_ip`, `session_referrer`) 
    VALUES
    (:session_id, :session_data, :session_expire, 
        :session_agent, :session_ip, :session_referrer)
    ON DUPLICATE KEY UPDATE 
    `session_data` = :session_data,
    `session_expire` = :session_expire";

$params = array(
    ':session_id' => $id,
    ':session_data' => $data,
    ':session_expire' => time(), 
    ':session_agent' => $this->session_encryption($_SERVER['HTTP_USER_AGENT']),
    ':session_ip', => $this->session_encryption($_SERVER['REMOTE_ADDR']),
    ':session_referrer' => $this->session_encryption((isset($_SERVER['HTTP_REFERER']) ? $_SERVER['HTTP_REFERER'] : str_shuffle('ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-_^~@&|=+;!,(){}[].?%*#';
);
$stmt = $dbcon->prepare($sql);
if ($stmt->execute($params) === FALSE) {
   // handle error
}

答案 1 :(得分:1)

首先检查全局对象是否未被其他函数覆盖。我强烈建议您使用依赖注入而不是全局变量。

$Sessions = new SessionManager($dbcon);

在Session Management类中,您可以执行类似

的操作
class SessionManager
{
    protected $db;
    public function __construct($db) { $this->db = $db; }

    public function read($id) 
    {
        $stmt = $this->db->prepare("SELECT session_data
                            FROM sessions
                            WHERE session_id = ?");
        $stmt->execute(array($id));
        return $stmt->fetchColumn();
     }
}

其次,既然你正在使用PDO,你不需要调用mysql_real_escape_string(),使用预处理语句和占位符:)