2009-10-15 3 views
3

확인해 주셔서 감사합니다. 모든 유용한 답변/의견이 투표되었습니다. 다음 코드는 작업을 수행하지만 imo는 효율적이지 않습니다. 내가 효율적이지 않다고 생각하는 이유는 fetchAll + 루프 을 사용하고 있기 때문입니다.하지만 쿼리가 1 또는 2 개의 레코드를 반환한다는 것을 알고 있습니다.PHP에서 PDO,이 PDO mysql 코드를 개선하는 방법

//assume the usual new PDO, binding, and execute are up here 

$myval = "somevalue"; 

$res = $stmt->fetchAll(PDO::FETCH_ASSOC); 

if (!$res) { 
    //no record matches 
    //BLOCK A CODE HERE 
} else { 
    //found matching record (but always going to be 1 record, no more) 
    foreach($res as $row) { 
     if ($myval == $row['val']){ 
      //myval is the same as db 
      //BLOCK B CODE HERE 
     } else { 
      //myval is different from db 
      //BLOCK C CODE HERE 
     } 
    }//foreach 
} 

가 어떻게 그것이 foreach는하고 fetchAll의 부피가 큰 모양을 제거하기 위해 개선 할 수 (I는 항상 1 개 또는 0 만 기록 될 것 알고 고려)? 하지만 여전히 비슷한 체크 포인트가 필요하므로 현재 로직이 필요로하는 것과 동일한 BLOCK ABLOCK BBLOCK C을 실행할 수 있습니다.

답변

6
$myval = "somevalue"; 

$row = $stmt->fetch(PDO::FETCH_ASSOC); 

if (!$row) { 
    //no record matches 
    //BLOCK A CODE HERE 
} else if ($myval == $row['val']) { 
    //myval is the same as db 
    //BLOCK B CODE HERE 
} else { 
    //myval is different from db 
    //BLOCK C CODE HERE 
} 
1

두 행 이상을 처리하려는 경우 fetchAll 대신 fetch을 사용할 수 있습니다.

1

당신은 당신의 문에 대한 네이티브 SQL을 사용하고 준비해야한다 : 당신이 이런 짓을하면, 당신은 ->bindParam를 사용 또한 ->fetch 대신 ->fetchAll를 사용할 수 있습니다

SELECT * FROM someTable WHERE specificVal = ? 

. ->prepare은 ANY $myVa l을 쉽게 처리 할 수 ​​있습니다. 원하는만큼 자주 명령문을 실행할 수 있기 때문입니다. 다른 매개 변수를 사용하여 ?에 방금 도착해야합니다.

예 :

$stmt->prepare($yourQuery); 
$stmt->bindParam($one,$two); 

if($stmt->fetch(PDO::FETCH_ASSOC)) 
{ 
// here you can access $two (the result) 
} 
elseif(empty($two) || !checkForOtherComparisons($two)) 
{ 
// here you go if $two is not available or does not match to any other logic 
} 
1

시도 :

$stmt->fetch(PDO::FETCH_ASSOC); 

이 바로 첫 번째 행을 가져옵니다.

확실히 1 행 또는 0 행만 반환하므로이 값을 사용하는 것이 안전 할 수 있습니다.

3

나는 다음과 같은 방법으로 재 작성됩니다

또한
$res = $stmt->fetchAll(PDO::FETCH_ASSOC); 
$first_row = (count($res) ? $res[0] : null); 
if (is_null($first_row)) { 
    // nothing found code 
} 
else { 
    // we found something 
    if ($myval == $first_row['val']) { 
     // result is good 
    } 
    else { 
     // result is bad 
    } 
} 

내가 enable PDO 모든 오류에 대한 예외를 던질 것이다 :

$pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); 

그래서 나는에 대한 오류를 점검 필요가 있습니다 각각 PDO 결과. 주요 기능의 블록은 try/catch입니다. 코드의 최상위 위치 :

try { 
    // main script logic 
} 
catch (PDOException $e) { 
    // sql error appeared somewhere, we should save it for futher investigation 
} 
+0

+1 예외 사용! – ChrisR

+0

네, +1이에요. – Chris