Неправильный вывод из php функции Mysql - PullRequest
1 голос
/ 21 марта 2012

Мой код выглядит следующим образом:

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 статей, и ничто не объясняет, что я делаю неправильно.

Примечание. Это уменьшенная версия моего кода.Я намерен использовать это для создания более общего объекта, который извлекает информацию из моей базы данных.

Спасибо,

Бретт

Ответы [ 5 ]

1 голос
/ 21 марта 2012

Вам необходимо вызвать 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 голосов
/ 21 марта 2012

Кажется странным, что никто не заметил в этом коде ошибки.

Вы определяете 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 голосов
/ 21 марта 2012

Вменяемая версия вашего класса.Конечно, в нем отсутствуют жизненно важные части, которые можно использовать в реальной жизни, но только по вашему эскизу:

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 голосов
/ 21 марта 2012

Должно ли это быть:


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

И


$resArr = array();
while($res = mysql_fetch_assoc($result)) {
  $resArr[] = $res;
}
return $resArr;
0 голосов
/ 21 марта 2012

В этом разделе вашего кода:

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;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...