2012-12-04 17 views
0

在我看来,我有一个奇怪的问题。下面的部分工作正常作为方法使用时,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 
+3

坏人会杀死你的数据库....你的代码易受攻击 –

+3

第一个代码片段中有$ db变量;第二个不是。你没有显示它被初始化的地方,但它实际上是这里的关键。 – raina77ow

+0

它只适用于后端使用,可能是两个用户,我假设他们不想销毁他们自己的数据库。但它应该是安全的,我做错了什么? – Maurice

回答

0

必须提供$ DB无论是作为一个全球性的或作为一个类属性。否则,您无法在方法范围内访问它。

因此,要么:

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

,否则你必须将其设置$这个 - > DB在你的方法使用一个类属性(例如$这个 - > DB)与数据库连接对象和访问。

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

0

$ DB是从访问默认内?

尝试添加功能查询中的global $db;