2012-12-04 26 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;