단일 행을 반환하는 PHP PDO


113

업데이트 2 :

그래서 이것이 얻을 수있는 가장 최적화 된 것일까 요?

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

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

$STH -> execute();

$result = $STH -> fetch();

echo $result ["figure"];

$DBH = null;

업데이트 1 :

SQL 쿼리에 제한을 추가 할 수 있다는 것을 알고 있지만 필요하지 않은 foreach 루프를 제거하고 싶습니다.

원래 질문 :

"foreach"섹션으로 인해 데이터베이스에서 많은 행을 반환하는 데 좋은 IMO 인 다음 스크립트가 있습니다.

데이터베이스에서 항상 하나의 행만 얻을 수 있다는 것을 알고 있다면 이것을 어떻게 최적화합니까? 데이터베이스에서 1 행만 얻을 수 있다는 것을 알고 있다면 foreach 루프가 필요한 이유는 알 수 없지만 코드를 변경하는 방법은 모릅니다.

$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$STH = $DBH -> prepare이 페이지의 여러 위치에 있어야합니다 .
Rune

휴식 시간에
EgoistDeveloper

답변:


206

그냥 가져 오세요. 하나의 행만 가져옵니다. 따라서 foreach 루프가 필요하지 않습니다.

$row  = $STH -> fetch();

예 (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
prepare 문에서 "LIMIT 1"을 사용하면 가장 최적화됩니다.
mjspier 2011 년

2
훌륭하게 완전한 예를 들어주세요. 위의 예에서 어딘가로 가야하는 한 줄이 아닙니다.
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)키-값 배열 만 필요한 경우 반환 된 배열을 반으로 자릅니다.
rybo111

LIMIT 1그래도 항상 필요 합니까? UNIQUE가치를 선택하고 있다는 사실이 떠 오릅니다.
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;

fetch와 LIMIT를 함께 사용할 수 있습니다. LIMIT는 데이터베이스가 하나의 항목 만 반환하므로 PHP는 매우 적은 데이터를 처리해야합니다. 가져 오기를 사용하면 데이터베이스 응답에서 첫 번째 (유일한) 결과 항목을 가져옵니다.

가져 오기 유형을 설정하여 더 많은 최적화를 수행 할 수 있습니다 ( http://www.php.net/manual/de/pdostatement.fetch.php 참조) . 열 이름을 통해서만 액세스하는 경우 번호가 지정된 배열이 필요합니다.

ORDER 절에 유의하십시오. ORDER 또는 WHERE를 사용하여 필요한 행을 가져 오십시오. 그렇지 않으면 테이블의 첫 번째 행이 항상 표시됩니다.


13

시도해 보았 니:

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

4
당신은 실제로 더 나아가 할 수 $row = $DBH->query($query)->fetch()['figure']있습니다. 경우 fetch반환 false결과가없는 때문에, PHP는 자동으로 잘못된 키 참조를 무시합니다. query오류 처리를 설정 한 방법에 따라에서 무언가 잘못 되면 예외가 발생하거나 (제 생각에) Invalid object method reference "fetch" on "false"....오류가 발생합니다.이 형식은 어쨌든 발생했을 것입니다. 쿼리가 분명히 실패했습니다.
kael


8

PDO를 사용하는 사용자 입력을 기반으로 데이터베이스 SELECT 쿼리에 대해 이것을 시도 할 수 있습니다.

$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
나는 당신이 나쁜 하루를 보내고 있다고 생각하거나 당신의 프로필을 돋보이게 찾고 있습니다. 내 대답은 PDO 쿼리와 함께 SELECT 함수에 대한 변수를 사용하여 동일한 시나리오로 확증됩니다. 나는 당신의 하루를 (그리고 나의) 만들기 위해 내 대답에서 SQL 주입 주석을 삭제할 것입니다.
user3162468

4

limit 0,1mysql 최적화 에 사용하는 방법

및 귀하의 코드에 대해 :

$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

fetchColumn을 사용하라는 Steven의 제안 덕분에 여기에 코드에서 한 줄을 줄 이도록 권장합니다.

$DBH = new PDO( "connection string goes here" );
$STH = $DBH->query( "select figure from table1" );
$result = $STH->fetchColumn();
echo $result;
$DBH = null;
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.