PHP PDO restituendo riga singola


113

AGGIORNAMENTO 2:

Quindi questo è il più ottimizzato che può ottenere?

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

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

$STH -> execute();

$result = $STH -> fetch();

echo $result ["figure"];

$DBH = null;

AGGIORNAMENTO 1:

So di poter aggiungere un limite alla query sql, ma voglio anche sbarazzarmi del ciclo foreach, di cui non dovrei aver bisogno.

DOMANDA ORIGINALE:

Ho il seguente script che è un buon IMO per la restituzione di molte righe dal database a causa della sezione "foreach".

Come ottimizzo questo, se so che otterrò sempre solo 1 riga dal database. Se so che otterrò solo 1 riga dal database, non vedo perché ho bisogno del ciclo foreach, ma non so come modificare il codice.

$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 dovrebbero essere $STH = $DBH -> preparediversi posti in questa pagina.
Rune

Puoi usare foreach in pausa;
EgoistDeveloper

Risposte:


206

Basta andare a prendere. ottiene solo una riga. Quindi nessun ciclo foreach necessario: D

$row  = $STH -> fetch();

esempio (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
Più ottimizzato se utilizzi "LIMIT 1" nella dichiarazione di preparazione.
mjspier

2
superbamente, si prega di fornire un esempio completo. Non solo una singola riga che deve andare da qualche parte nell'esempio sopra.
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)taglierà a metà l'array restituito se è necessario solo un array di valori-chiave.
rybo111

Hai davvero bisogno di LIMIT 1tutto il tempo però? Mi UNIQUEviene in mente sapere che stai selezionando un valore.
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;

Puoi usare fetch e LIMIT insieme. LIMIT ha l'effetto che il database restituisce solo una voce, quindi PHP deve gestire molto meno dati. Con fetch ottieni la prima (e unica) voce di risultato dalla risposta del database.

Puoi ottimizzare di più impostando il tipo di recupero, vedi http://www.php.net/manual/de/pdostatement.fetch.php . Se si accede solo tramite i nomi delle colonne, è necessario un array numerato.

Sii consapevole della clausola ORDER. Usa ORDER o WHERE per ottenere la riga necessaria. Altrimenti otterrai la prima riga della tabella alle ore.


13

Hai provato:

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

4
Potresti effettivamente andare oltre e farlo $row = $DBH->query($query)->fetch()['figure']. Se fetchritorna falseperché non ci sono risultati, PHP ignorerà silenziosamente il riferimento di chiave non valido. Se qualcosa va storto query, a seconda di come hai impostato la gestione degli errori, verrà generata un'eccezione (desiderata, a mio parere) o riceverai un Invalid object method reference "fetch" on "false"....errore, una forma di cui avresti ottenuto comunque perché la query ovviamente fallì.
Kael


8

Puoi provare questo per una query SELECT del database basata sull'input dell'utente utilizzando 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
Penso che tu stia solo passando una brutta giornata fratello, o stai solo cercando di far risaltare il tuo profilo. La mia risposta conferma lo stesso scenario utilizzando una variabile per la funzione SELECT con una query PDO. Eliminerò il commento di sql injection dalla mia risposta solo per rendere la tua giornata (e la mia).
user3162468

4

che ne dici di utilizzare limit 0,1per l'ottimizzazione di mysql

e sul tuo codice:

$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

Grazie al suggerimento di Steven di utilizzare fetchColumn, ecco la mia raccomandazione di tagliare una riga corta dal codice.

$DBH = new PDO( "connection string goes here" );
$STH = $DBH->query( "select figure from table1" );
$result = $STH->fetchColumn();
echo $result;
$DBH = null;
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.