PHP PDO retornando linha única

113

ATUALIZAÇÃO 2:

Então, isso é o mais otimizado que pode ser?

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

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

$STH -> execute();

$result = $STH -> fetch();

echo $result ["figure"];

$DBH = null;

ATUALIZAÇÃO 1:

Sei que posso adicionar limite à consulta sql, mas também quero me livrar do loop foreach, do qual não devo precisar.

PERGUNTA ORIGINAL:

Eu tenho o seguinte script que é bom IMO para retornar muitas linhas do banco de dados por causa da seção "foreach".

Como faço para otimizar isso, se sei que sempre vou obter apenas 1 linha do banco de dados. Se eu sei que só vou obter 1 linha do banco de dados, não vejo por que preciso do loop foreach, mas não sei como alterar o 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
fonte
2
$STH - $DBH -> prepare deve haver $STH = $DBH -> preparevários lugares nesta página.
Rune
Você pode usar foreach no intervalo;
EgoistDeveloper

Respostas:

206

Basta buscar. obtém apenas uma linha. Portanto, nenhum loop foreach necessário: D

$row  = $STH -> fetch();

exemplo (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
fonte
12
Mais otimizado se você usar "LIMITE 1" em sua instrução de preparação.
mjspier
2
soberbamente, dê um exemplo completo. Não apenas uma única linha que deve estar em algum lugar do exemplo acima.
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á a matriz retornada pela metade se você só precisar de uma matriz de valor-chave.
rybo111
Você realmente precisa disso LIMIT 1o tempo todo? Saber que você está selecionando um UNIQUEvalor vem à mente.
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;

Você pode usar fetch e LIMIT juntos. LIMIT tem o efeito de que o banco de dados retorna apenas uma entrada, então o PHP precisa lidar com muito menos dados. Com fetch, você obtém a primeira (e única) entrada de resultado da resposta do banco de dados.

Você pode otimizar mais definindo o tipo de busca, consulte http://www.php.net/manual/de/pdostatement.fetch.php . Se você acessá-lo apenas por meio de nomes de coluna, será necessário um array numerado.

Esteja ciente da cláusula ORDER. Use ORDER ou WHERE para obter a linha necessária. Caso contrário, você obterá a primeira linha da tabela todo o tempo.

Strauberry
fonte
13

Você tentou:

$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
fonte
4
Você poderia realmente ir mais longe e fazer $row = $DBH->query($query)->fetch()['figure']. Se fetchretornar falseporque não há resultados, o PHP irá ignorar silenciosamente a referência de chave inválida. Se algo der errado query, dependendo de como você configurou o tratamento de erros, ele lançará uma exceção (desejada, na minha opinião) ou você obterá um Invalid object method reference "fetch" on "false"....erro, uma forma que você teria obtido de qualquer maneira, porque a consulta obviamente falhou.
Kael
8

Você pode tentar isso para uma consulta SELECT de banco de dados com base na entrada do usuário 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);
user3162468
fonte
3
Acho que você está apenas tendo um dia ruim, mano, ou você está apenas querendo destacar seu perfil. Minha resposta corrobora com o mesmo cenário usando uma variável para a função SELECT com uma consulta PDO. Vou deletar o comentário de injeção de sql da minha resposta apenas para tornar o seu dia (e o meu).
user3162468
4

que tal usar limit 0,1para otimização mysql

e sobre o seu 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
fonte
3

Graças à sugestão de Steven de usar fetchColumn, aqui está minha recomendação para cortar uma linha do seu código.

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