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;
$STH - $DBH -> prepare
powinno być$STH = $DBH -> prepare
kilka miejsc na tej stronie.Odpowiedzi:
Po prostu przynieś. dostaje tylko jeden wiersz. Więc nie potrzeba pętli foreach: D
przykład (ty northkildonan):
źródło
$dbh = new PDO(" --- connection string --- "); $stmt = $dbh->prepare("SELECT name FROM mytable WHERE id=4 LIMIT 1"); $stmt->execute(); $row = $stmt->fetch();
fetch(PDO::FETCH_ASSOC)
przetnie zwróconą tablicę na pół, jeśli potrzebujesz tylko tablicy klucz-wartość.LIMIT 1
cały czas?UNIQUE
Przychodzi mi na myśl świadomość, że wybierasz wartość.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.
źródło
Próbowałeś:
źródło
$row = $DBH->query($query)->fetch()['figure']
. Jeślifetch
zwraca,false
ponieważ nie ma żadnych wyników, PHP po cichu zignoruje nieprawidłowe odwołanie do klucza. Jeśli coś pójdzie nie takquery
, w zależności od tego, jak masz skonfigurowaną obsługę błędów, albo zgłosi wyjątek (pożądany, moim zdaniem), albo otrzymaszInvalid object method reference "fetch" on "false"....
błąd, którego i tak byś otrzymał, ponieważ zapytanie oczywiście nie powiodło się.Jeśli chcesz mieć tylko jedno pole, możesz użyć funkcji fetchColumn zamiast pobierania - http://www.php.net/manual/en/pdostatement.fetchcolumn.php
źródło
Możesz spróbować tego dla zapytania SELECT bazy danych na podstawie danych wejściowych użytkownika przy użyciu PDO:
źródło
co powiesz na użycie
limit 0,1
do optymalizacji mysqli o twoim kodzie:
źródło
Dzięki sugestii Stevena, aby użyć fetchColumn, oto moja rekomendacja, aby skrócić jedną linię z twojego kodu.
źródło