2012-03-21 185 views
1

我的代碼如下:輸出錯誤

class Database 
{ 
    private $db_host; 
    private $db_user; 
    private $db_pass; 
    private $db_name; 
    private $con; 

    public function __construct() { 
     $this->db_host = "localhost"; 
     $this->db_user = "admin"; 
     $this->db_pass = 'password'; 
     $this->db_name = 'test';  
     $this->con = ''; 
    } 

    public function connect() { 
     $db_name = "test";  
     $this->con = mysql_connect($this->db_host, $this->db_user, $this->db_pass); 
    } 

    public function select(){ 
     $q = "SELECT name, city FROM customers;"; 
     mysql_select_db($this->db_name, $this->con); 
     $result = mysql_query($q); 
     return mysql_fetch_assoc($result); 
    } 
} 


$db = new Database(); 
$db->connect(); 
$tempArray = Array(); 
$rs = $db->select('customers', 'name, suburb'); 
foreach ($rs as $row) 
{ 
    echo $rs['name'] . "<br>"; 
} 

而我的表中的數據是

name | city 
-------------- 
Anne | Sydney 
Jane | London 

實際的輸出是:

Anne 
Anne 

所需的輸出是:

Anne 
Jane 

有人能告訴我我做錯了什麼。這似乎是我錯過了一些基本的東西。我讀過50篇文章,似乎沒有任何解釋我做錯了什麼。

注意:這是我的代碼的縮小版本。我打算用這個來創建一個更通用的對象,從我的數據庫中提取信息。

感謝,

佈雷特

+0

只是爲了讓你知道,你的「選擇」功能沒有任何意義。數據庫類必須用於運行自定義查詢,而不是硬編碼的。 – 2012-03-21 04:12:30

+0

@YourCommonSense,我確定他只是把這一行放在最小化參數錯誤的可能性,只是爲了調試,對嗎? - 明確規劃後,在弄清楚問題所在之後,將其改變爲合理工作。 – 2012-03-21 04:28:06

+0

@Ben Oh。我不是那麼擅長心靈感應:) – 2012-03-21 04:30:07

回答

1

你需要調用mysql_fetch_assoc每個行。它只返回一行數據,而不是全套數據。例如,你可以將它移出到循環:

class Database 
{ 
    /* ... */ 

    public function select(){ 
     $q = "SELECT name, city FROM customers;"; 
     mysql_select_db($this->db_name, $this->con); 
     return mysql_query($q); 
     /* Remove your line here, returning the query result, not the first row */ 
    } 
} 

$db = new Database(); 
$db->connect(); 
$tempArray = Array(); 
$result = $db->select('customers', 'name, suburb'); 
/* Note that I'm now using mysql_fetch_assoc to get each row from the result */ 
while ($row = mysql_fetch_assoc($result)); 
    echo $row['name'] . "<br>"; 
} 

您可以使用while循環那裏,因爲最後一排已經被檢索後,mysql_fetch_assoc將返回FALSE和退出循環。

+0

這個答案有什麼問題?爲什麼downvote? – 2012-03-21 04:25:06

+0

感謝本,這曾經是一種魅力! Re @Sudhir和其他幫助。我很抱歉,但我不會嘗試你的解決方案,因爲這是優雅的,它的工作原理。謝謝大家。 :-) – Brett 2012-03-21 04:33:57

+1

我並沒有完全得到反對票,但即使你所建議的改變也沒有反映出select()函數被調用的方式與它所定義的不同,這是OP不會「無法得到他期望的答案。 – 2012-03-21 04:34:38

0

在代碼中的這一部分:

return mysql_fetch_assoc($result); 

你只是返回第一行。我建議你創建一個數組。

public function select(){ 
    $q = "SELECT name, city FROM customers;"; 
    mysql_select_db($this->db_name, $this->con); 
    $result = mysql_query($q); 
    $toReturn = array(); 
    while($row = mysql_fetch_assoc($result)) 
     $toReturn[] = $row; 
    return $toReturn; 
} 
+1

我不會推薦這樣做。爲什麼要一次將整個結果集加載到內存中?在很多情況下,這是瘋狂的。 – 2012-03-21 04:26:04

+0

(可以選擇加載@ YourCommonSense的答案中的整個結果集,因此您可以在知道它的地方使用它,但不要將它作爲* only *選項)。 – 2012-03-21 04:33:06

0

Should'nt它是:


foreach ($rs as $row) 
{ 
    echo $row['name'] . "<br>"; 
} 

和:


$resArr = array(); 
while($res = mysql_fetch_assoc($result)) { 
    $resArr[] = $res; 
} 
return $resArr; 
0

你的班級的一個理智的版本。它沒有當然的要害部位,在現實生活中使用,只是你的素描:

class Database 
{ 
    private $con; 

    public function __construct() { 
     $this->con = mysql_connect("localhost", "admin", 'password'); 
     mysql_select_db("test",$this->con); 
    } 
    public function query($sql,$this->con){ 
     return mysql_query($sql); 
    } 
    public function get_all($sql,$this->con){ 
     $ret = array(); 
     $res = mysql_query($sql); 
     while ($row = mysql_fetch_array($row)) { 
      $ret[] = $row; 
     } 
     return $ret; 
    } 
} 

$db = new Database(); 
$rs = $db->get_all("SELECT name, city FROM customers"); 
foreach ($rs as $row) 
{ 
    echo $rs['name'] . "<br>"; 
} 
0

似乎有點奇怪的是,沒有人在代碼拿起有點魚叉這裏。

你定義select()像這樣:

public function select(){ 
    $q = "SELECT name, city FROM customers;"; 
    mysql_select_db($this->db_name, $this->con); 
    $result = mysql_query($q); 
    return mysql_fetch_assoc($result); 
} 

但是,你這樣稱呼它:

$rs = $db->select('customers', 'name, suburb'); 

我假設你的意圖是能夠指定表和字段選擇來自數據庫。如果是,你select功能應該看起來更像是這樣的:

public function select($table, $fields){ 
    $q = "SELECT $fields FROM $table;"; 
    mysql_select_db($this->db_name, $this->con); 

    return mysql_query($q); 
} 

從那裏,你會關注@ BENLEE的例子在他的回答,因爲你需要遍歷一個結果。每個字段成爲關聯數組中的一個鍵。

我不會推薦在生產代碼中實際執行字符串插入,但我認爲它更接近你的意圖。

HTH。

+0

如果這種方法在現實生活中可行,我會給這個答案+1。但選擇整個表格的內容很難用於教育以外的環境...... – 2012-03-21 04:47:20

+0

Heh。我也不會使用mysql庫,但每個人似乎都拒絕停止,那麼你能做什麼? – 2012-03-21 04:49:28

+0

這是另一回事。除了一些PHP團隊的懶惰以外,沒有任何理由可以阻止它。 – 2012-03-21 04:52:41