Fetchall () - действительно нужно?

Пример 1 °:

$stmt = 'SELECT * FROM table ORDER BY id DESC LIMIT 2';
$Dp = $conn->query($stmt)->fetchAll();

Пример 2 °:

$stmt = 'SELECT * FROM table ORDER BY id DESC LIMIT 2';
$Dp = $conn->query($stmt);

В чем разница между обоими примерами? Я новичок в PDO, и я не видел разницы между обоими примерами.

var_dump($Dp); и вы увидите разницу
tkausl 13.09.2018 20:52

Пример 1 возвращает массив, содержащий все оставшиеся строки в наборе результатов. Массив представляет каждую строку либо как массив значений столбца, либо как объект со свойствами, соответствующими имени каждого столбца. Пустой массив возвращается, если нет результатов для выборки, или FALSE в случае ошибки.

PrathapG 13.09.2018 20:55

@PrathapG С какой целью помещать fetchAll() в этот код?

Susi 13.09.2018 21:03
0
3
83
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Это как бы зависит от того, что вы хотите сделать с результатом.

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

Но fetchAll() возвращает чистый массив PHP, тогда как query возвращает объект PHP со скрытыми внутренними элементами. Один из двух, на котором вы можете (например) вызвать json_encode.

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

Я должен был задать это в другом месте, чтобы прояснить свой вопрос. Я действительно хочу знать, следует ли мне помещать fetchAll() в свой код, потому что, как я вижу ... нет никаких различий при отображении результатов на веб-странице.

Susi 13.09.2018 21:01

@Susi, если в вашем случае нет видимой разницы, вы можете получить небольшое преимущество в производительности, не используя fetchAll (). * Однако * с точки зрения строгого архитектурного проектирования я не уверен, хочу ли я, чтобы мой слой модели 'пропускал' объекты PDOStatement . Как и неправильный, так что делайте то, что вам удобнее всего. С архитектурной точки зрения я бы предпочел возвращать простые массивы PHP, потому что в вашем приложении будут некоторые случаи, когда вам потребуется пост-обработка результата запроса MySQL, и если вы вернете массивы с самого начала, вы можете оставаться на 100% согласованным.

Evert 13.09.2018 21:20
'leak' PDOStatement objects Я не уверен, правильно ли я понял эту часть. Вы имеете в виду, что если я не использую fetchAll(), у меня могут возникнуть проблемы с безопасностью?
Susi 13.09.2018 21:26

Нет, я имел в виду «утечку» в терминах «дырявых абстракций». Ваш модельный слой должен «абстрагировать» доступ к базе данных. Здесь нет проблем с безопасностью.

Evert 13.09.2018 22:50

Другие вопросы по теме