PHP PDO gibt einzelne Zeile zurück

113

UPDATE 2:

Ist dies also das optimierteste, das es bekommen kann?

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

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

$STH -> execute();

$result = $STH -> fetch();

echo $result ["figure"];

$DBH = null;

UPDATE 1:

Ich weiß, dass ich der SQL-Abfrage ein Limit hinzufügen kann, aber ich möchte auch die foreach-Schleife entfernen, die ich nicht benötigen sollte.

URSPRÜNGLICHE FRAGE:

Ich habe das folgende Skript, das IMO für die Rückgabe vieler Zeilen aus der Datenbank aufgrund des Abschnitts "foreach" gut ist.

Wie optimiere ich das, wenn ich weiß, dass ich immer nur 1 Zeile aus der Datenbank bekomme? Wenn ich weiß, dass ich immer nur 1 Zeile aus der Datenbank erhalten werde, verstehe ich nicht, warum ich die foreach-Schleife benötige, aber ich weiß nicht, wie ich den Code ändern soll.

$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
quelle
2
$STH - $DBH -> prepare sollte $STH = $DBH -> preparemehrere Stellen auf dieser Seite sein.
Rune
Sie können foreach in break verwenden.
EgoistDeveloper

Antworten:

206

Einfach holen. bekommt nur eine Zeile. Es wird also keine foreach-Schleife benötigt: D.

$row  = $STH -> fetch();

Beispiel (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
quelle
12
Am optimiertesten, wenn Sie "LIMIT 1" in Ihrer Prepare-Anweisung verwenden.
mjspier
2
Hervorragend, bitte geben Sie ein vollständiges Beispiel. Nicht nur eine einzelne Zeile, die im obigen Beispiel irgendwohin muss.
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)schneidet das zurückgegebene Array in zwei Hälften, wenn Sie nur ein Schlüsselwert-Array benötigen.
Rybo111
Müssen Sie wirklich die LIMIT 1ganze Zeit? Zu wissen, dass Sie einen UNIQUEWert auswählen, fällt Ihnen ein .
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;

Sie können Fetch und LIMIT zusammen verwenden. LIMIT hat zur Folge, dass die Datenbank nur einen Eintrag zurückgibt, sodass PHP sehr wenig Daten verarbeiten muss. Mit fetch erhalten Sie den ersten (und einzigen) Ergebniseintrag aus der Datenbankantwort.

Sie können weitere Optimierungen vornehmen, indem Sie den Abruftyp festlegen (siehe http://www.php.net/manual/de/pdostatement.fetch.php) . Wenn Sie nur über Spaltennamen darauf zugreifen, müssen Sie das Array nummerieren.

Beachten Sie die ORDER-Klausel. Verwenden Sie ORDER oder WHERE, um die gewünschte Zeile zu erhalten. Andernfalls erhalten Sie die erste Zeile in der Tabelle zu jeder Zeit.

Strauberry
quelle
13

Hast du versucht:

$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
quelle
4
Sie könnten tatsächlich weiter gehen und tun $row = $DBH->query($query)->fetch()['figure']. Wenn fetchzurückgegeben wird, falseweil keine Ergebnisse vorliegen, ignoriert PHP die ungültige Schlüsselreferenz stillschweigend. Wenn etwas schief geht query, abhängig davon, wie Sie Ihre Fehlerbehandlung eingerichtet haben, wird entweder eine Ausnahme ausgelöst (meiner Meinung nach erwünscht) oder Sie erhalten einen Invalid object method reference "fetch" on "false"....Fehler, dessen Form Sie ohnehin erhalten hätten, weil Die Abfrage ist offensichtlich fehlgeschlagen.
Kael
8

Sie können dies für eine Datenbank-SELECT-Abfrage versuchen, die auf Benutzereingaben mit PDO basiert:

$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
quelle
3
Ich denke, du hast gerade einen schlechten Tag, Bruder, oder du willst nur dein Profil hervorheben. Meine Antwort bestätigt dasselbe Szenario mit einer Variablen für die SELECT-Funktion mit einer PDO-Abfrage. Ich werde den SQL-Injection-Kommentar aus meiner Antwort löschen, um Ihren (und meinen) Tag zu gestalten.
user3162468
4

Wie wäre es mit limit 0,1für MySQL-Optimierung

und über Ihren Code:

$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
quelle
3

Dank des Vorschlags von Steven, fetchColumn zu verwenden, ist hier meine Empfehlung, eine Zeile aus Ihrem Code herauszuschneiden.

$DBH = new PDO( "connection string goes here" );
$STH = $DBH->query( "select figure from table1" );
$result = $STH->fetchColumn();
echo $result;
$DBH = null;
jhloke
quelle