2010-01-18 86 views
4

下面是其他人寫的PHP數據庫類的一部分,我已經刪除了它的80%左右的代碼,所有與我的問題無關的代碼已被刪除,只剩下數量可以讓我無需真正測試這個類打到真正的數據庫。這個PHP如何知道使用哪個數組鍵/值?

這個類有幾個方法可以讓你設置一個鍵值,然後把它變成一個使用數組的mysql UPDATE和INSERT sql查詢。我想弄清楚如何使用這個代碼100%,所以我可以在我自己的應用程序中使用它的UPDATE和INSERTS的這個特性。

Basicly從我收集你做這樣的事......

// assign some key/values to insert into DB 
$db->assign('name', 'dfgd'); 
$db->assign('age', 87); 
$db->assign('sex', 'female'); 
$db->assign('user_id', 4556); 

// Do the insert 
$db->insert('testing2'); 

現在,我很困惑是我能繼續這樣一遍又一遍地在頁面上運行的代碼,它總是會使用正確的鍵/值數組集。上面可以看到我使用的分配()方法4次,然後叫我辦另一組這樣在同一頁面上創建此

INSERT INTO test (name, age, sex, user_id) VALUES (jason davis, 26, male, 5345) 

現在insert()方法...

// assign some key/values to insert into DB 
$db->assign('name', 'dfgd'); 
$db->assign('age', 87); 
$db->assign('sex', 'female'); 
$db->assign('user_id', 4556); 

// Do the insert 
$db->insert('testing2'); 

然後創建這個...

INSERT INTO testing2 (name, age, sex, user_id) VALUES (dfgd, 87, female, 4556) 

那麼它如何不組合的4 2臺,所以不是在第二插入插入8條,它completey替換第一組4個值新的設置。這是偉大的,我想要但我不明白它是如何發生的?無論如何,這也可以改善嗎?

下面是一個完整的類和我的演示代碼,它可以在不需要連接到此演示的mysql時運行,它將打印以屏蔽它構建的SQL。

此外,公用函數reset()需要在下面的代碼中使用,還是不需要?

<?php 
class DB{ 
    public $fields; 

    public function assign($field, $value){ 
     $this->fields[$field] = ($value)==""?("'".$value."'"):$value; 
    } 

    public function assign_str($field, $value){ 
     $this->fields[$field] = "'".addslashes($value)."'"; 
    } 

    public function reset(){ 
     $this->fields = array(); 
    } 

    public function insert($table){ 
     $f = ""; 
     $v = ""; 
     reset($this->fields); 
     foreach($this->fields as $field=>$value){ 
      $f.= ($f!=""?", ":"").$field; 
      $v.= ($v!=""?", ":"").$value; 
     } 
     $sql = "INSERT INTO ".$table." (".$f.") VALUES (".$v.")"; 
     //print SQL to screen for testing 
     echo $sql; 
     //$this->query($sql); 
     return $this->insert_id(); 
    } 

    public function update($table, $where){ 
     $f = ""; 
     reset($this->fields); 
     foreach($this->fields as $field=>$value){ 
      $f.= ($f!=""?", ":"").$field." = ".$value; 
     } 
     $sql = "UPDATE ".$table." SET ".$f." ".$where; 
     echo $sql; 
     //$this->query($sql); 
    } 

    public function query($_query){ 
     $this->query = $_query; 
     $this->result = @mysql_query($_query, $this->link_id) or die($_query."<p>".mysql_error($this->link_id)); 
     return $this->result; 
    } 

    public function insert_id(){ 
     return @mysql_insert_id($this->link_id); 
    } 
} 


// start new DB object 
$db = new DB; 

// assign some key/values to insert into DB 
$db->assign('name', 'jason davis'); 
$db->assign('age', 26); 
$db->assign('sex', 'male'); 
$db->assign('user_id', 5345); 

// Do the insert 
$db->insert('test'); 


echo '<hr />'; 

// assign some key/values to insert into DB 
$db->assign('name', 'dfgd'); 
$db->assign('age', 87); 
$db->assign('sex', 'female'); 
$db->assign('user_id', 4556); 

// Do the insert 
$db->insert('testing2'); 


echo '<hr />'; 

// assign some key/values to UPDATE the DB 
$db->assign('name', 'jason davis'); 
$db->assign('age', 26); 
$db->assign('sex', 'male'); 
$db->assign('user_id', 5345); 

// DO the DB UPDATE 
$db->update('blogs', 'WHERE user_id = 23'); 

?> 
+0

在太多人不斷爭論這個問題的「含義」之前,你可能想要接受一個答案。 – 2010-01-18 03:09:25

+0

答案是42! xP – 2010-01-18 03:11:25

+0

我的代表恰好是7777。至少它低了1,111。 – 2010-01-18 03:13:18

回答

0

insert()update()應該(最初)將$this->fields屬性設置回執行時的空數組,但你以某種方式(錯誤地)刪除該代碼?

更新你的代碼這件事:關聯數組

public function insert($table){ 
     $f = ""; 
     $v = ""; 
     foreach($this->fields as $field=>$value){ 
      $f.= ($f!=""?", ":"").$field; 
      $v.= ($v!=""?", ":"").$value; 
     } 
     $sql = "INSERT INTO ".$table." (".$f.") VALUES (".$v.")"; 
     $this->reset(); 
     //print SQL to screen for testing 
     echo $sql; 
     //$this->query($sql); 
     return $this->insert_id(); 
    } 

    public function update($table, $where){ 
     $f = ""; 
     foreach($this->fields as $field=>$value){ 
      $f.= ($f!=""?", ":"").$field." = ".$value; 
     } 
     $sql = "UPDATE ".$table." SET ".$f." ".$where; 
     $this->reset(); 
     echo $sql; 
     //$this->query($sql); 
    } 
+0

問題不在於班級無法正常工作,而是因爲即使存在這種明顯的「錯誤」,它也能工作。 – 2010-01-18 02:59:31

0

好吧,我們得出的結論是,我以前的答案是正確的:


由於您使用的名稱鍵,它取代了舊密鑰與新的密鑰。

$db->assign('user_id', "1"); 

基本上做到這一點:

$this->fields['user_id] = (1)==""?("'1'"):1; 

而當你有做一遍,它取代它

$this->fields['user_id'] = (2)==""?("'2'"):2; 

嘗試做一個分配,然後才能再次分配USER_ID,其餘的數據將保持不變。


要解決這個問題,我們會在查詢後調用$this->reset()函數。

public function query($_query){ 
     $this->query = $_query; 
     $this->result = @mysql_query($_query, $this->link_id) or die($_query."<p>".mysql_error($this->link_id)); 
     $this->reset(); 
     return $this->result; 
    } 

,或者你可以把它在個人insertupdate功能:

public function insert($table){ 
    // .... stuff 
    $this->query($sql); 
    $this->reset(); 
    return $this->insert_id(); 
} 

另一種可能是,原來的程序員沒有傳達他的意圖,你不夠好。他可能希望你在每次查詢後都打電話$db->reset()

+0

由於更好的安全與和平哇我就像死腦筋今天 – JasonDavis 2010-01-18 02:44:16

+0

-1:復位 - 一個數組的內部指針設置爲它的第一個元素。應該是'$ this-> reset();' – 2010-01-18 02:44:45

+0

任何想法是什麼公共職能reset()這是$ this-> fields = array();會被要求嗎? – JasonDavis 2010-01-18 02:44:58

2

主要是唯一的;分配一個新的值會擦除舊的。

+0

貶低這種想法的人會解釋爲什麼? – 2010-01-18 02:54:38

+0

你是錯的。鍵被替換,但這不是班級應該如何工作的(仔細檢查代碼和例子)。 – 2010-01-18 02:58:22

+0

它一直分配給'$ this-> fields [$ field]'。我說什麼不解釋? – 2010-01-18 03:00:23

2

如果你仍然打開另一個數據庫abstaction庫,我想建議你使用AdoDB。它可以連接到多個數據庫,因此如果您決定稍後切換數據庫,則代碼將保持不變。它具有在插入/更新之前清理數據的功能。

對於上面的代碼,當您使用ADODB,你會寫這樣的:

$adodb =& ADONewConnection($dsn); 
$data['name'] = 'dfgd'; 
$data['age'] = 87; 
$data['sex'] = 'female'; 
$data['user_id'] = 4556; 

// Do the insert 
$result = $adodb->AutoExecute($table_name, $data, 'INSERT'); 

//If update, must have one of the key, such as id column 
$result = $adodb->AutoExecute($table_name, $data, 'UPDATE', "id=$id"); 

您可以從網站上閱讀文檔,或zip文件中,您可以下載。我總是在我的所有項目中使用這個庫,即使我更喜歡在CodeIgniter數據庫庫中構建它。

+0

謝謝我會檢查出來 – JasonDavis 2010-01-18 03:09:24

相關問題