2014-09-30 2 views
0

Мои пользователи управляют клиентами компании через веб-интерфейс. Они могут перемещаться по клиентам, используя (среди других) вход для непосредственного выбора идентификатора клиента, который покажет им клиентскую запись.Наличие PDO :: fetch (PDO :: FETCH_CLASS) возвращает нулевой экземпляр объекта вместо bool (false)

Для этого я использую PDO :: FETCH_CLASS для сопоставления значений базы данных в объектах php. Эти объекты затем используются для генерации html; указанный html будет отображаться на экране как идентификатор клиента.

$oSTMT = $oDB->prepare("SELECT id,name FROM clients WHERE id=?"); 
$oSTMT->setFetchMode(PDO::FETCH_CLASS,'client'); 
$oSTMT->execute(array(12673)); 
$oClient = $oSTMT->fetch(); // returns false when no row is selected 
$oClient->makeHTML(); // which resultd in Fatal error: Call to a member function on a non-object 

перед тем перепроектирования иметь объект обернуть сгружен объект так, чтобы он не сломается, если это логическое значение, я хотел бы попробовать, чтобы иметь PDO генерировать инстанс объект в любом случае.

Моя проблема двоякая: ввод несуществующего идентификатора клиента во вход и создание нового клиента. В обоих случаях идентификатор клиента ссылается на отсутствие строки в базе данных; execute(array([values]) вернет bool(true) (оператор выполнен успешно), но ->fetch(PDO::FETCH_CLASS,'client') возвратит bool(false)

мое решение создать клиента строку с идентификатором = 0, так что, когда он не существует, я запрос с идентификатором = 0 вместо того, чтобы получить моя «стандартная» клиентская строка, но мне было интересно:

Есть ли команда, которая дает команду PDO::FETCH_CLASS генерировать экземпляр выбранного объекта, если никакие строки не выбраны оператором?

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

+1

Сначала вы можете создать экземпляр класса, а затем использовать режим 'FETCH_INTO' вместо' FETCH_CLASS'. –

+0

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

ответ

3

Инстанцировать класс первый, а затем используйте FETCH_INTO вместо FETCH_CLASS.

$client = new client(); 
$oSTMT = $oDB->prepare("SELECT id,name FROM clients WHERE id=?"); 
$oSTMT->setFetchMode(PDO::FETCH_INTO,$client); 
$oSTMT->execute(array(12673)); 
$client = $oSTMT->fetch(); 
$client->makeHTML(); 
Смежные вопросы