2013-08-10 6 views
1

В приведенном ниже коде может ли кто-нибудь сказать мне, где переменная $ row исходит из инструкции foreach?

public function getProcResultSet($cmd) 
    { 
     try 
     { 
      $meta = $cmd->result_metadata(); 

      while ($field = $meta->fetch_field()) 
      { 
       $params[] = &$row[$field->name]; 
      } 

      call_user_func_array(array(
       $cmd, 
       'bind_result'), $params); 

      while ($cmd->fetch()) 
      { 
       foreach ($row as $key => $val) 
       { 
        $c[$key] = $val; 
       } 

       $results[] = $c; 
      } 

      return $results; 
     } 
     catch (Exception $e) 
     { 
      logToFile("Exception: " . $e); 
      return resultFailedUnknown(); 
     } 
} 

Редактировать, вот вызывающий эту функцию:

public static function getPlayerUnits($playerId, $unitTypeId) 
    { 
     $mysqli = new mysqli(GDB_HOST, GDB_USERNAME, GDB_PASSWORD, GDB_NAME); 

     if ($mysqli->connect_errno) 
     { 
      throw new Exception('DB Connection Failed. Error Code: ' . $mysqli->connect_errno); 
     } 

     $cmd = $mysqli->prepare('CALL sp_get_player_units(?, ?)'); 

     if (!$cmd) 
     { 
      throw new Exception($mysqli->error); 
     } 

     $cmd->bind_param('ii', $playerId, $unitTypeId); 
     $cmd->execute(); 

     $results = parent::getProcResultSet($cmd); 

     $cmd->close(); 
     $mysqli->close(); 

     return $results; 
    } 

Вот массив результата, который все, что я делал, был получить на клиенте и JSON.stringify (..):

[{"Id":1,"Name":"Machine Gunner","Quantity":0},{"Id":2,"Name":"Rocket Soldier","Quantity":0},{"Id":3,"Name":"Paratrooper","Quantity":0},{"Id":4,"Name":"Demolition Soldier","Quantity":0}] 

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

+0

Его не определено, возможно, вы имеете в виду while ($ row = $ cmd-> fetch) – Stony

+0

Примечание для всех: строка «$ params [] = & $ row [$ field-> name];" это то, что определяет переменную $ row. –

ответ

3

В первом цикле while из-за справочного оператора &. Пока этого не существует.

Линия $params[] = &$row[$field->name] создает переменную $row. Что происходит, так это то, что PHP хочет взять ссылку на $row, которая не существует, поэтому она создает ее без какого-либо сообщения (достаточно источник ошибок, если вы спросите меня). $row создается как массив с ключом $field->name, установленным ни к чему.

$rowделает существует в петле foreach, но не в петле while. Там он создается как массив с пустыми значениями.

Все это довольно запутанный код и не очень читаемый. Иногда быть многословным в коде - это хорошая вещь.

+0

Я подтвердил, что строка «$ params [] = & $ row [$ field-> name];" создает переменную $ row. –

+0

Бах. Я ненавижу PHP :), пожалуйста, напишите ответ. –

+1

@MeshMan обновил мой ответ, по-видимому, при использовании ссылочного оператора PHP тихо создает переменную. Я тоже кое-что узнал ...;). –

-1

Обычно люди объявляют $row результатом mysql_fetch_row($result), где $result - это то, что вы получаете после запроса базы данных SQL. Тем не менее, я не вижу упоминания здесь нигде, поэтому я не думаю, что ваш код действительно должен работать.

Редактировать: очевидно, исключение из этого было бы, если это не весь ваш файл, и он определен где-то выше этого. но да, не должно работать иначе.

+0

Он отлично работает, вот что меня озадачивает , –

+3

работает отлично Я предполагаю, что вы имели в виду, что «ничего не делает» –

+0

Нет, я имею в виду массив, который это производит, ТОЧНО, что я ожидал. Столбцы из полученного запроса прекрасно устанавливаются в результирующем массиве. –

Смежные вопросы