2012-03-21 187 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