PHP mySQL - вы можете вернуть связанный массив с индексом числа? - PullRequest
2 голосов
/ 04 декабря 2008

У меня есть этот метод в моем классе БД

public function query($queryString)
    {

      if (!$this->_connected) $this->_connectToDb(); //connect to database

      $results = mysql_query($queryString, $this->_dbLink) or trigger_error(mysql_error());

      return mysql_num_rows($results) > 0 ? mysql_fetch_assoc($results) : false;            

    }

Это прекрасно работает для запросов, которые возвращают 1 строку, но как я могу получить массив, возвращающий что-то вроде этого?

$array[0]['name'] = 'jim'
$array[0]['id'] =  120
$array[1]['name'] = 'judith' 
$array[1]['ID'] = 121

Теперь я знаю, что могу использовать цикл while для вставки этих данных в массив следующим образом, но мне было интересно, может ли PHP сделать это с помощью внутренней функции? Я не смог найти в документах, что мне нужно.

Причина, по которой я не хочу запускать while в методе, заключается в том, что я собираюсь повторить возврат по массиву при его возврате, и я бы предпочел не просматривать результаты дважды (из соображений производительности).

Есть ли способ сделать это? У меня есть проблема с моим общим дизайном метода запроса?

Большое спасибо!

Ответы [ 5 ]

4 голосов
/ 04 декабря 2008
public function query($queryString)
    {

        if (!$this->_connected) $this->_connectToDb(); //connect to database

        $results = mysql_query($queryString, $this->_dbLink) or trigger_error(mysql_error());

        $data = array();
        while($row = mysql_fetch_assoc($results))
         {
               $data[] = $row;
         }
        return $data;

    }

это всегда будет возвращать массив.

EDIT: Я плохо прочитал вопрос. Если вы действительно не хотите использовать цикл, я бы сделал это:

public function query($queryString)
    {

        if (!$this->_connected) $this->_connectToDb(); //connect to database

        return mysql_query($queryString, $this->_dbLink) or trigger_error(mysql_error());

    }

затем зациклите его, однако я бы просто использовал цикл.

2 голосов
/ 10 декабря 2008

Вы также можете посмотреть расширение PDO . Вы можете загрузить весь набор результатов в массив или выполнить цикл, используя foreach.

<?php
$db = new PDO($connection_string, $username, $password);
$result = $db->query($queryString);
foreach($result as $row) {
    // do something
}

// or

$result = $db->query($queryString);
$result_array = $result->fetchAll(PDO::FETCH_ASSOC);
?>
1 голос
/ 04 декабря 2008

Большинство людей используют в запросе цикл while(), чтобы сделать именно то, что вам нужно, а затем цикл по массиву для его обработки.

Однако вы правы: это тратит впустую память, что может быть проблемой с большим набором данных. Альтернативой является метод запроса, который возвращает ресурс набора результатов. Тогда ваш цикл while может использовать это для извлечения каждой строки, как это требуется.

Чтобы абстрагироваться, я бы предложил другой класс сделать это для вас. Тогда ваш запрос запроса вернет новый экземпляр этого класса, который имеет ресурс набора данных MySQL в качестве переменной экземпляра и упаковывает вызов mysql_fetch_assoc().

0 голосов
/ 19 февраля 2009

спасибо за идеи. У меня есть функция, которая возвращает ассоциативный массив из SQL (используется в Moodle).

$ results = get_records_sql ($ sql);

//to create a numerically indexed array:
$data = array();
foreach ($results as $row)
     {
           $data[] = $row;
     }
return $data; 

}

0 голосов
/ 04 декабря 2008

Посмотрите на PEAR :: MDB2 ( Quickstart Cheatsheet ). Он предоставляет множество различных функций для выполнения чего-то подобного. Он также не привязывает вас к использованию специфических функций MySQL, потому что это уровень абстракции базы данных.

$ result = $ db-> queryRow ($ query, MDB2_FETCHMODE_ASSOC);

Существуют и другие уровни абстракции, такие как ADO.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...