PHP PDO, що повертається один рядок


113

ОНОВЛЕННЯ 2:

Так це найбільше оптимізовано це може отримати?

$DBH = new PDO( "connection string goes here" );

$STH = $DBH -> prepare( "select figure from table1" );

$STH -> execute();

$result = $STH -> fetch();

echo $result ["figure"];

$DBH = null;

ОНОВЛЕННЯ 1:

Я знаю, що можу додати обмеження до запиту sql, але я також хочу позбутися циклу foreach, який мені не потрібен.

ОРИГІНАЛЬНЕ ПИТАННЯ:

У мене є такий сценарій, який є хорошим IMO для повернення багатьох рядків із бази даних через розділ "foreach".

Як я це оптимізую, якщо я знаю, що завжди буду отримувати лише 1 рядок із бази даних. Якщо я знаю, що коли-небудь отримаю з бази даних лише 1 рядок, я не бачу, для чого мені потрібен цикл foreach, але я не знаю, як змінити код.

$DBH = new PDO( "connection string goes here" );

$STH = $DBH -> prepare( "select figure from table1" );

$STH -> execute();

$result = $STH -> fetchAll();

foreach( $result as $row ) {
    echo $row["figure"];
}

$DBH = null;

2
$STH - $DBH -> prepare$STH = $DBH -> prepareна цій сторінці повинно бути кілька місць.
Руна

Ви можете використовувати foreach у перерві;
EgoistDeveloper

Відповіді:


206

Просто забирай. виходить лише один ряд. Отже, не потрібна петля передбачення: D

$row  = $STH -> fetch();

приклад (ty northkildonan):

$dbh = new PDO(" --- connection string --- "); 
$stmt = $dbh->prepare("SELECT name FROM mytable WHERE id=4 LIMIT 1"); 
$stmt->execute(); 
$row = $stmt->fetch();

12
Найбільш оптимізовано, якщо ви використовуєте "LIMIT 1" у своїй заяві підготовки.
mjspier

2
чудово, будь ласка, наведіть повний приклад. Не просто окремий рядок, який повинен пройти кудись у наведеному вище прикладі.
andrebruton

3
@andrebruton $dbh = new PDO(" --- connection string --- "); $stmt = $dbh->prepare("SELECT name FROM mytable WHERE id=4 LIMIT 1"); $stmt->execute(); $row = $stmt->fetch();
low_rents

2
fetch(PDO::FETCH_ASSOC)скоротить повернутий масив навпіл, якщо вам потрібен лише масив ключових значень.
rybo111

Вам справді потрібно LIMIT 1весь час, хоча? Знання, що ви вибираєте UNIQUEзначення, приходить на думку.
Супер Кіт

15
$DBH = new PDO( "connection string goes here" );
$STH - $DBH -> prepare( "select figure from table1 ORDER BY x LIMIT 1" );

$STH -> execute();
$result = $STH -> fetch();
echo $result ["figure"];

$DBH = null;

Ви можете використовувати добір і LIMIT разом. LIMIT призводить до того, що база даних повертає лише один запис, тому PHP має обробляти дуже менше даних. За допомогою програми ви отримуєте перший (і єдиний) запис результату з відгуку бази даних.

Ви можете зробити більше оптимізації, встановивши тип отримання, див. Http://www.php.net/manual/de/pdostatement.fetch.php . Якщо ви отримуєте доступ до нього лише через імена стовпців, вам потрібно пронумерований масив.

Будьте в курсі пункту ЗАМОВЛЕННЯ. Використовуйте ЗАМОВЛЕННЯ або ДЕ, щоб отримати потрібний рядок. Інакше ви отримаєте перший рядок у таблиці за часом.


13

Ви спробували:

$DBH = new PDO( "connection string goes here" );
$row = $DBH->query( "select figure from table1" )->fetch();
echo $row["figure"];
$DBH = null;

4
Ви насправді могли б піти далі і зробити $row = $DBH->query($query)->fetch()['figure']. Якщо fetchповертається, falseоскільки немає результатів, PHP мовчки ігнорує недійсну посилання ключа. Якщо щось піде не так query, залежно від того, як у вас налаштовано обробку помилок, воно або викине Виняток (бажаний, на мій погляд), або ви отримаєте Invalid object method reference "fetch" on "false"....помилку, форму якої ви все-таки отримали б, оскільки запит, очевидно, не вдався.
каель


8

Ви можете спробувати це для запиту SELECT до бази даних на основі введення користувача за допомогою PDO:

$param = $_GET['username'];

$query=$dbh->prepare("SELECT secret FROM users WHERE username=:param");
$query->bindParam(':param', $param);
$query->execute();

$result = $query -> fetch();

print_r($result);

3
Я думаю, що у вас просто поганий день брато, або ур просто шукаєте, щоб виділити свій профіль. Моя відповідь підтверджує той самий сценарій, використовуючи змінну для функції SELECT із запитом PDO. Я видалю коментар sql з ін'єкцією з моєї відповіді лише для того, щоб зробити ваш день (і мій).
користувач3162468

4

як щодо використання limit 0,1для mysql оптимізації

та про ваш код:

$DBH = new PDO( "connection string goes here" );

$STH - $DBH -> prepare( "select figure from table1" );

$STH -> execute();

$result = $STH ->fetch(PDO::FETCH_ASSOC)

echo $result["figure"];

$DBH = null;

3

Завдяки пропозиції Стівена використовувати fetchColumn, ось моя рекомендація скоротити один рядок зі свого коду.

$DBH = new PDO( "connection string goes here" );
$STH = $DBH->query( "select figure from table1" );
$result = $STH->fetchColumn();
echo $result;
$DBH = null;
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.