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;

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();

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.


13

Hast du versucht:

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

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);

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;

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;
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.