0

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


$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');
    }
}

我讨厌

致命错误:未捕获的异常“PDOException”
带有消息“无效的数据源名称”
在 /class.defaults.php:8

堆栈跟踪:
#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): 内容->write('/BraamsArchief/...')
#5 {main} 在第 8 行的 /class.defaults.php 中抛出
4

2 回答 2

0

$db 可以从默认值中访问吗?

尝试添加一个global $db;内函数查询

于 2012-12-04T16:28:57.197 回答
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。否则,您的方法可能无法找到它,您将得到相同的错误。

于 2012-12-04T16:30:05.880 回答