PHP PDO renvoyant une seule ligne

113

MISE À JOUR 2:

Alors, est-ce le plus optimisé possible?

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

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

$STH -> execute();

$result = $STH -> fetch();

echo $result ["figure"];

$DBH = null;

MISE À JOUR 1:

Je sais que je peux ajouter une limite à la requête SQL, mais je veux aussi me débarrasser de la boucle foreach, dont je ne devrais pas avoir besoin.

QUESTION ORIGINALE:

J'ai le script suivant qui est bon IMO pour renvoyer de nombreuses lignes de la base de données à cause de la section "foreach".

Comment optimiser cela, si je sais que je n'obtiendrai toujours qu'une ligne de la base de données. Si je sais que je n'obtiendrai qu'une seule ligne de la base de données, je ne vois pas pourquoi j'ai besoin de la boucle foreach, mais je ne sais pas comment changer le code.

$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
la source
2
$STH - $DBH -> prepare devrait être à $STH = $DBH -> prepareplusieurs endroits sur cette page.
Rune
Vous pouvez utiliser foreach en pause;
EgoistDeveloper

Réponses:

206

Allez chercher. n'obtient qu'une seule ligne. Donc pas de boucle foreach nécessaire: D

$row  = $STH -> fetch();

exemple (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
la source
12
Le plus optimisé si vous utilisez "LIMIT 1" dans votre instruction de préparation.
mjspier
2
superbement, veuillez donner un exemple complet. Pas juste une seule ligne qui doit aller quelque part dans l'exemple ci-dessus.
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)coupera le tableau retourné de moitié si vous n'avez besoin que d'un tableau clé-valeur.
rybo111
Avez-vous vraiment besoin de LIMIT 1tout le temps? Savoir que vous sélectionnez une UNIQUEvaleur vient à l'esprit.
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;

Vous pouvez utiliser simultanément Fetch et LIMIT. LIMIT a pour effet que la base de données ne renvoie qu'une seule entrée, donc PHP doit gérer très moins de données. Avec fetch, vous obtenez la première (et seule) entrée de résultat de la réponse de la base de données.

Vous pouvez faire plus d'optimisation en définissant le type de récupération, voir http://www.php.net/manual/de/pdostatement.fetch.php . Si vous y accédez uniquement via les noms de colonnes, vous devez numéroter un tableau.

Soyez conscient de la clause ORDER. Utilisez ORDER ou WHERE pour obtenir la ligne requise. Sinon, vous obtiendrez la première ligne du tableau avec l'heure.

strauberry
la source
13

As-tu essayé:

$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
la source
4
Vous pourriez en fait aller plus loin et faire $row = $DBH->query($query)->fetch()['figure']. Si fetchretourne falsecar il n'y a aucun résultat, PHP ignorera silencieusement la référence de clé invalide. Si quelque chose ne va pas avec query, selon la façon dont vous avez configuré votre gestion des erreurs, soit cela lancera une exception (souhaitée, à mon avis), soit vous obtiendrez une Invalid object method reference "fetch" on "false"....erreur, une forme que vous auriez de toute façon obtenue parce que la requête a manifestement échoué.
kael
8

Vous pouvez essayer ceci pour une requête SELECT de base de données basée sur l'entrée utilisateur à l'aide de 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);
utilisateur3162468
la source
3
Je pense que vous passez juste une mauvaise journée, ou que vous cherchez simplement à mettre en valeur votre profil. Ma réponse corrobore avec le même scénario en utilisant une variable pour la fonction SELECT avec une requête PDO. Je supprimerai le commentaire d'injection SQL de ma réponse juste pour rendre votre journée (et la mienne).
user3162468
4

que diriez-vous d'utiliser limit 0,1pour l'optimisation mysql

et à propos de votre 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
la source
3

Grâce à la suggestion de Steven d'utiliser fetchColumn, voici ma recommandation de couper une ligne de votre code.

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