PHP PDO zwraca pojedynczy wiersz

113

AKTUALIZACJA 2:

Czy to jest najbardziej zoptymalizowany, jaki może uzyskać?

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

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

$STH -> execute();

$result = $STH -> fetch();

echo $result ["figure"];

$DBH = null;

AKTUALIZACJA 1:

Wiem, że mogę dodać limit do zapytania sql, ale chcę też pozbyć się pętli foreach, której nie potrzebuję.

PYTANIE ORYGINALNE:

Mam następujący skrypt, który jest dobrym IMO do zwracania wielu wierszy z bazy danych z powodu sekcji „foreach”.

Jak to zoptymalizować, jeśli wiem, że zawsze otrzymam tylko 1 wiersz z bazy danych. Jeśli wiem, że kiedykolwiek uzyskam tylko 1 wiersz z bazy danych, nie rozumiem, dlaczego potrzebuję pętli foreach, ale nie wiem, jak zmienić kod.

$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;
oshirowanen
źródło
2
$STH - $DBH -> prepare powinno być $STH = $DBH -> preparekilka miejsc na tej stronie.
Rune
Możesz użyć foreach w przerwie;
EgoistDeveloper

Odpowiedzi:

206

Po prostu przynieś. dostaje tylko jeden wiersz. Więc nie potrzeba pętli foreach: D

$row  = $STH -> fetch();

przykład (ty northkildonan):

$dbh = new PDO(" --- connection string --- "); 
$stmt = $dbh->prepare("SELECT name FROM mytable WHERE id=4 LIMIT 1"); 
$stmt->execute(); 
$row = $stmt->fetch();
mjspier
źródło
12
Najbardziej zoptymalizowane, jeśli używasz „LIMIT 1” w wyciągu przygotowawczym.
mjspier
2
wspaniale, proszę podać pełny przykład. Nie tylko pojedyncza linia, która musi znaleźć się gdzieś w powyższym przykładzie.
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)przetnie zwróconą tablicę na pół, jeśli potrzebujesz tylko tablicy klucz-wartość.
rybo111
Czy naprawdę potrzebujesz tego przez LIMIT 1cały czas? UNIQUEPrzychodzi mi na myśl świadomość, że wybierasz wartość.
Super Cat
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;

Możesz użyć jednocześnie pobierania i LIMIT. LIMIT powoduje, że baza danych zwraca tylko jeden wpis, więc PHP musi obsłużyć bardzo mniej danych. Za pomocą funkcji fetch otrzymujesz pierwszy (i jedyny) wynik z odpowiedzi bazy danych.

Możesz zrobić więcej optymalizacji, ustawiając typ pobierania, patrz http://www.php.net/manual/de/pdostatement.fetch.php . Jeśli uzyskujesz do niego dostęp tylko poprzez nazwy kolumn, potrzebujesz tablicy numerowanej.

Pamiętaj o klauzuli ORDER. Użyj ORDER lub WHERE, aby uzyskać potrzebny wiersz. W przeciwnym razie pierwszy wiersz tabeli będzie widoczny przez cały czas.

Strauberry
źródło
13

Próbowałeś:

$DBH = new PDO( "connection string goes here" );
$row = $DBH->query( "select figure from table1" )->fetch();
echo $row["figure"];
$DBH = null;
Bé Khỏe Bé Pro
źródło
4
Właściwie możesz pójść dalej i zrobić $row = $DBH->query($query)->fetch()['figure']. Jeśli fetchzwraca, falseponieważ nie ma żadnych wyników, PHP po cichu zignoruje nieprawidłowe odwołanie do klucza. Jeśli coś pójdzie nie tak query, w zależności od tego, jak masz skonfigurowaną obsługę błędów, albo zgłosi wyjątek (pożądany, moim zdaniem), albo otrzymasz Invalid object method reference "fetch" on "false"....błąd, którego i tak byś otrzymał, ponieważ zapytanie oczywiście nie powiodło się.
kael
8

Możesz spróbować tego dla zapytania SELECT bazy danych na podstawie danych wejściowych użytkownika przy użyciu 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);
user3162468
źródło
3
Myślę, że po prostu masz zły dzień, bracie lub po prostu chcesz wyróżnić swój profil. Moja odpowiedź potwierdza ten sam scenariusz przy użyciu zmiennej dla funkcji SELECT z zapytaniem PDO. Usunę komentarz sql injection z mojej odpowiedzi tylko po to, aby twój dzień (i mój).
user3162468
4

co powiesz na użycie limit 0,1do optymalizacji mysql

i o twoim kodzie:

$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;
KoolKabin
źródło
3

Dzięki sugestii Stevena, aby użyć fetchColumn, oto moja rekomendacja, aby skrócić jedną linię z twojego kodu.

$DBH = new PDO( "connection string goes here" );
$STH = $DBH->query( "select figure from table1" );
$result = $STH->fetchColumn();
echo $result;
$DBH = null;
żartowniś
źródło