2013-08-18 3 views
-1

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

function M($username){ 

      $query = "SELECT * FROM msg WHERE `to` = '".$this->userid."' && `to_viewed` = '0' && `to_deleted` = '0' ORDER BY `created` DESC"; 
      $stmt = $this->connection->prepare($query); 
      $stmt->execute(); 

    $data = $stmt->fetch(PDO::FETCH_ASSOC); 
    $num_rows = $stmt->fetchColumn(); 

     if($num_rows) { 
      $i=0; 
      $this->messages = array(); 
      while($row = $data) { 
// want to return these 3 for each result 
       $this->messages[$i]['id'] = $row['id']; 
       $this->messages[$i]['title'] = $row['title']; 
       $this->messages[$i]['message'] = $row['message']; 

       $i++; 
      } 
     } else { 
      return 1; 
     } 
    } 

Если я хочу, чтобы вернуть 3 переменные, то итерация остановится, и не будет продолжаться до тех пор, пока цикл делается .. может кто-нибудь помочь мне? Я немного бил головой об этом.

+3

Похоже на проблему XY. Не можете ли вы просто вернуть массив? – elclanrs

+0

Нет .. если я поместил его в массив: return array (var1, var2, var3), функция закончится .. и итерация также прекратится, что победит всю точку хранения всех найденных записей с использованием запроса в массив. – user2693390

+0

use 'while ($ row = $ stmt-> fetch (PDO :: FETCH_ASSOC)) {' –

ответ

1

Данные два, пока петли не равны:

while($row = $stmt->fetch(PDO::FETCH_ASSOC)) 
{ 
print_r($row); 
} 

и

$data = $stmt->fetch(PDO::FETCH_ASSOC); 
while($row = $data) { 

Различия:

  1. Второй будет производить бесконечный цикл, если по крайней мере одна строка возвращается, так как $row=$data всегда верно и покажет только первый результат.
  2. $stmt->fetch(PDO::FETCH_ASSOC) следует вызывать для извлечения строк, так что каждый раз, когда вы его вызываете, вы извлекаете одну строку (следующую строку). На это нельзя ссылаться просто = функция назначения для извлечения всех строк.
  3. Результат: ваш код завершит выполнение в соответствии с максимальным временем выполнения.

Еще одно замечание, согласно http://php.net/manual/en/pdostatement.rowcount.php:

Для большинства баз данных, PDOStatement :: ROWCOUNT() не возвращает число строк, затронутых ЗЕЬЕСТ. Вместо этого используйте PDO :: query(), чтобы выдать инструкцию SELECT COUNT (*) с теми же предикатами в качестве вашего предполагаемого оператора SELECT, а затем использовать PDOStatement :: fetchColumn() для извлечения числа строк, которые будут возвращены , Затем ваше приложение может выполнить правильное действие.

Но вы использовали непосредственно fetchColumn() без использования select count(*)

0

Почему не возвращают массив данных из запроса, как это после проверки, влияет ли там некоторые строки и дело с 3-х переменных вне функции, потому что есть нет простого способа вернуть 3 переменные. Или верните строку из трех переменных, используя функцию implode().

функция M ($ имя пользователя) {

  $query = "SELECT * FROM msg WHERE `to` = '".$this->userid."' && `to_viewed` = '0' && `to_deleted` = '0' ORDER BY `created` DESC"; 
      $stmt = $this->connection->prepare($query); 
      $stmt->execute(); 

    $data = $stmt->fetch(PDO::FETCH_ASSOC); 
    $num_rows = $stmt->fetchColumn(); 
    $return_data = array(); 
     if($num_rows) { 
      $return_data = $data; 
     } else { 
      $return_data[] = "Error!"; 
     } 

return $return_data; 
    }