2013-05-31 3 views
1

Я использую PDO для захвата записей из таблицы mysql. Данные будут закодированы с json_encode() и печатается через Слим рамки для API:Использование PDO: выборка vs fetchObject для распечатки JSON

$app->get('/get/profile/:id_user', function ($id_user) use ($app) { 
    $sql = 'SELECT * FROM user WHERE id_user = :id_user'; 
    try { 
     $stmt = cnn()->prepare($sql); 
     $stmt->bindParam(':id_user', $id_user, PDO::PARAM_INT); 
     $stmt->execute(); 
     $data = $stmt->fetch(PDO::FETCH_ASSOC); // THIS!!! 
     if($stmt->rowCount()) { 
      $app->etag(md5(serialize($data))); 
      echo json_encode($data,JSON_PRETTY_PRINT); 
     } else { 
      $app->notfound(); 
     } 
    } catch(PDOException $e) { 
     echo $e->getMessage(); 
    } 
}); 

Должен ли я использовать

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

или

$data = $stmt->fetchObject(); 

? Любые прямые выгоды от сбора данных как объекта? Я читал несколько примеров, но они никогда не объясняют, почему. Единственное использование полученных данных - это распечатать их в формате JSON. Благодаря!

+3

Это зависит только от вас. Вам нравится вводить '$ data ['colname']' или '$ data-> colname'? – Barmar

+0

В этом примере я вижу небольшую разницу (оба будут приводить к JSONed Object). Но может быть разница, если вам нужно каким-то образом увеличить найденные строки. После многих попыток с JS, я иногда склонен забывать, что массивы на PHP должны передаваться по ссылке в этом случае.) И да, '->' синтаксис более чист в строковых литералах PHP. – raina77ow

+1

Я думаю, что они оба получат одинаковые значения в JSON, так как ассоциативные массивы выполняются как объекты в JSON. – Barmar

ответ

2

Это не имеет значения. Хотя я вырезал объект с бритвой Оккама.

Также ваш код немного ошибочен и избыточен. Вот это правильная версия

$sql = 'SELECT * FROM user WHERE id_user = :id_user'; 
$stmt = cnn()->prepare($sql); 
$stmt->bindParam(':id_user', $id_user, PDO::PARAM_INT); 
$stmt->execute(); 
if ($data = $stmt->fetch()) { 
    $app->etag(md5(serialize($data))); 
    echo json_encode($data,JSON_PRETTY_PRINT); 
} else { 
    $app->notfound(); 
} 
  • нет никакого смысла в установлении режима выборки для каждого запроса, когда вы можете set it globally.
  • звонок numless() также бесполезен.
  • и, конечно же, исключение является излишним, небезопасным и ненадежным.
+0

спасибо за советы. Я оптимизировал свой код. Только один вопрос: почему вы говорите, что исключение ловли является избыточным, ненадежным и ненадежным? – andufo

+0

означает ловить в вашем случае, просто для устранения ошибки. Это нормально поймать, если вы хотите справиться с самой ошибкой, а не с сообщением –

+0

, но в этом случае это для API. если разработчик получает код ошибки, он может обрабатывать дружественное сообщение для пользователя в клиентском приложении. например «Служба в настоящее время недоступна» – andufo

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