2013-08-09 5 views
0

Я пытаюсь получить определенное поле из первой строки результатов моего запроса. Следующие работает просто отлично ...PHP PDO query: выборка из первой строки

$result = $db->query($query); 

$firstrow = $result->fetch(); 
$desired_field = $firstrow["field"]; 

мой вопрос, могу ли я сделать это в одном шаге без сохранения первой строки результатов в переменной? Заранее спасибо!

+3

Зачем вам это нужно? Это намного чище. – jeremy

+0

его не единственный столбец. Я согласен с Джереми, его единственными 2 строками, но мне было интересно, есть ли метод, о котором я не знаю, чтобы сделать трюк. –

ответ

0

Вы можете использовать fetchColumn(), чтобы вернуть один столбец из следующей строки в результирующем наборе. Если есть только один столбец в наборе результатов, сделайте следующее:

$desired_field = $result->fetchColumn(); 

Если существует несколько столбцов в наборе результатов, конкретнее числовой индекс, который вы хотите:

$desired_field = $result->fetchColumn(1); 

обратить внимание предупреждение содержится в документации fetchColumn():

Там нет никакого способа, чтобы вернуть еще один столбец из одной и той же строки, если вы используете PDOStatement :: fetchColumn() для извлечения данных.

+0

есть что-то подобное, что я могу передать ассоциативный индекс? это будет то, что я ищу –

+0

@Neil Нет, о котором я знаю, но числовой индекс выводим, если вы укажете поля в запросе или (обычно), если знаете порядок столбцов в таблице. –

+0

Удивительно, поэтому индекс применяется к столбцам в результате запроса? поэтому, если я укажу поля в запросе, мне не нужно будет беспокоиться о фактическом индексе этого поля в базе данных? –

0

Вы можете использовать что-то вроде $firstrow = $db->query($query)->fetch(), но это не очень хорошая практика в отношении функций, которые не гарантируют возврата объекта.

Функция query() может возвращать FALSE при ошибке, а динамический вызов fetch() будет фатальной ошибкой. Вы не можете позвонить ->fetch() по скалярному значению FALSE.

Например, попробуйте выполнить следующие действия и сценарий взорвется:

$firstrow = $db->query("SELECT * FROM table_that_does_not_exist")->fetch(); 

PDO поддерживает режим бросать исключения вместо возврата FALSE, так что в этом случае вы гарантированно либо query()->fetch() работы, либо запрос() выдаст исключение, поэтому вы никогда не достигнете фатальной ошибки. Но вы, возможно, не используете режим исключения PDO.

Ответ от @GeorgeCummins указывает, что существует метод fetchColumn(), который вы можете использовать, когда у вас есть объект PDOStatement, это хороший способ получить один столбец. Если вам нужен только один столбец, назовите этот столбец в качестве только столбца в списке выбора, а затем всегда использовать fetchColumn(0):

$oneValue = $db->query("SELECT oneColumn FROM table")->fetchColumn(0); 

В противном случае, если вы используете выборки(), это возвращает массив. PHP 5.4 поддерживает разрывы в матрице:

$oneValue = $db->query("SELECT oneColumn FROM table")->fetch()[0]; 

Но если вы используете PHP 5.3 или ранее, это не поддерживается. И я никогда не пробовал его с массивом, возвращаемым PDOStatement, поэтому, если он фактически возвращает ArrayObject или что-то, что это может не сработать.

-1

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

$db->query($query)->fetch(PDO::FETCH_OBJ)->field; 
+0

После того, как я получил downvote, я провел тест, и он работает так, как ожидалось. – invisal

+0

Я обновил ответ. Тем не менее, мне показалось довольно странным, что вы получите downvote для ответа на вопрос с непроверенным кодом, который я использовал раньше. (неопределенность в том, что я не тестировал код, но, по крайней мере, он основан на моем опыте). – invisal

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