用作方法时,php查询执行错误

时间:2012-12-04 16:25:21

标签: php

在我看来,我有一个奇怪的问题。下面的部分工作正常


$sql = "
    UPDATE 
        ".$table[0]."
    SET 
        p_title = '".$_POST['p_title']."', 
        p_date = '".$_POST['p_date']."' 
    WHERE 
        p_id = '".$_POST['p_id']."'
";
if(!$db->exec($sql)){
    echo($defaults->throwError('MySql error',$sql,implode(":",$db->errorInfo())));
}else{
    $defaults->writeLog($table,$db->lastInsertId(),'update');
}

但是当我尝试下面的代码时,我得到一个'致命错误:在'

中的非对象上调用成员函数exec()

class Defaults{
    [..]
    public function query($sql){
        if(!$db->exec($sql)){
            echo($defaults->throwError('MySql error',$sql,implode(":",$db->errorInfo())));
        }else{
            $defaults->writeLog($table,$db->lastInsertId(),'update');
        }
    }
    [..]
}

然后在我的页面上


$defaults = new Defaults();
$defaults->query("
    UPDATE 
        ".$table[0]."
    SET 
        p_title = '".$_POST['p_title']."', 
        p_date = '".$_POST['p_date']."' 
    WHERE 
        p_id = '".$_POST['p_id']."'
");

怎么回事?

啊,这是关于班上的$db。但是,当我做像

这样的事情时

public function query($sql){
    $db = new PDO($dbdata->hostname,$dbdata->username,$dbdata->password);
    if(!$db->exec($sql)){
        echo($defaults->throwError('MySql error',$sql,implode(":",$db->errorInfo())));
    }else{
        $defaults->writeLog($table,$db->lastInsertId(),'update');
    }
}

我得到一个讨厌的

Fatal error: Uncaught exception 'PDOException' 
with message 'invalid data source name' 
in /class.defaults.php:8 

Stack trace: 
#0 /class.defaults.php(8): PDO->__construct('', NULL, NULL) 
#1 /class.form.php(269): Defaults->query('?????????UPDATE...') 
#2 /module.projectbeheer.edit.php(25): Form->proceed('update', 'p_id', 'rows', Array, Array, '') 
#3 /class.content.php(16): include_once('/path/') 
#4 /administratie.php(72): Content->write('/BraamsArchief/...') 
#5 {main} thrown in /class.defaults.php on line 8

2 个答案:

答案 0 :(得分:0)

可以在Defaults中访问$ db吗?

尝试在函数查询

中添加global $db;

答案 1 :(得分:0)

您必须提供$ db作为全局属性或类属性。否则,您无法在方法范围内访问它。

所以:

public function query($sql) {
    global $db;
    // now you can use $db as you would in global scope
}

或者您必须使用数据库连接对象设置类属性(例如$ this-> db),并在方法中使用$ this-> db访问它。

请注意,如果使用global解决方案,则需要确保在最初定义变量时始终将变量称为$ db。否则,您的方法可能无法找到它,您将收到相同的错误。