PHP PDO que devuelve una sola fila

113

ACTUALIZACIÓN 2:

Entonces, ¿es esto lo más optimizado que puede obtener?

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

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

$STH -> execute();

$result = $STH -> fetch();

echo $result ["figure"];

$DBH = null;

ACTUALIZACIÓN 1:

Sé que puedo agregar un límite a la consulta SQL, pero también quiero deshacerme del bucle foreach, que no debería necesitar.

PREGUNTA ORIGINAL:

Tengo el siguiente script que es bueno en mi opinión para devolver muchas filas de la base de datos debido a la sección "foreach".

¿Cómo optimizo esto, si sé que siempre obtendré solo 1 fila de la base de datos? Si sé que solo obtendré 1 fila de la base de datos, no veo por qué necesito el bucle foreach, pero no sé cómo cambiar el código.

$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
fuente
2
$STH - $DBH -> prepare debe haber $STH = $DBH -> preparevarios lugares en esta página.
Runa
Puede utilizar foreach en el descanso;
EgoistDeveloper

Respuestas:

206

Solo busca. solo obtiene una fila. Entonces no se necesita bucle foreach: D

$row  = $STH -> fetch();

ejemplo (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
fuente
12
Más optimizado si usa "LIMIT 1" en su declaración de preparación.
mjspier
2
magníficamente, por favor dé un ejemplo completo. No es solo una línea que debe ir en algún lugar del ejemplo anterior.
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)cortará la matriz devuelta a la mitad si solo necesita una matriz clave-valor.
rybo111
¿Realmente necesitas hacerlo LIMIT 1todo el tiempo? Me UNIQUEviene a la mente saber que está seleccionando un valor.
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;

Puede utilizar fetch y LIMIT juntos. LIMIT tiene el efecto de que la base de datos devuelve solo una entrada, por lo que PHP tiene que manejar muy menos datos. Con fetch obtienes la primera (y única) entrada de resultado de la respuesta de la base de datos.

Puede optimizar más configurando el tipo de búsqueda, consulte http://www.php.net/manual/de/pdostatement.fetch.php . Si accede a él solo a través de nombres de columna, necesita una matriz numerada.

Tenga en cuenta la cláusula ORDER. Use ORDER o WHERE para obtener la fila necesaria. De lo contrario, obtendrá la primera fila de la tabla todo el tiempo.

strauberry
fuente
13

Has probado:

$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
fuente
4
De hecho, podrías ir más allá y hacerlo $row = $DBH->query($query)->fetch()['figure']. Si fetchregresa falseporque no hay resultados, PHP ignorará silenciosamente la referencia de clave no válida. Si algo sale mal query, dependiendo de cómo haya configurado su manejo de errores, arrojará una Excepción (deseada, en mi opinión) o obtendrá un Invalid object method reference "fetch" on "false"....error, una forma que habría obtenido de todos modos porque la consulta obviamente falló.
Kael
8

Puede probar esto para una consulta SELECT de la base de datos basada en la entrada del usuario usando 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);
usuario3162468
fuente
3
Creo que solo estás teniendo un mal día, hermano, o solo estás buscando destacar tu perfil. Mi respuesta corrobora con el mismo escenario usando una variable para la función SELECT con una consulta PDO. Eliminaré el comentario de inyección SQL de mi respuesta solo para alegrarle el día (y el mío).
user3162468
4

¿Qué tal usar limit 0,1para la optimización de mysql?

y sobre tu código:

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

Gracias a la sugerencia de Steven de usar fetchColumn, aquí está mi recomendación de acortar una línea de su código.

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