Bu PDO mysql kod geliştirmek için nasıl PHP PDO,

4 Cevap php

Thanks for checking. All helpful answers/comments are up voted. I have the following code, which does the job, but imo is not efficient. The reason I think it's not efficient is because I'm using fetchAll + loop even though I know that the query will return either 1 or no records.

//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
}

Nasıl ben (ben her zaman 1 veya 0 tek kayıt olacak biliyorum dikkate alınarak) foreach ve fetchAll hantal görünümünü kaldırmak için artırabilir? Ben idam böylece Ama yine benzer kontrol noktaları ihtiyaç aynı BLOCK A BLOCK B BLOCK C Benim şimdiki mantık ihtiyacı olarak.

4 Cevap

Ben yolunu aşağıdaki onu yeniden olacaktır:

$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
    }
}

Ayrıca ben olacak enable PDO tüm hatalar için istisnalar atmak için:

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

Yani her PDO sonucu hataları kontrol gerekmez gerekir. Sadece try/catch ana işlevi engellemek. Kodunun üst düzeyde Somewhere:

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

Eğer fazla bir satır ile başa çıkmak için bekliyor iseniz, fetch yerine fetchAll kullanabiliyordu.

Deneyin:

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

Bu sadece ilk satırı almak olacaktır.

Emin için sadece 1 veya 0 satır dönecektir biliyorum çünkü bu kullanmak olasıdır güvenlidir.

Eğer sadece ifadesi için yerel SQL kullanmak ve hazırlamak zorunda:

SELECT * FROM someTable WHERE specificVal = ?

If you did this, you can use ->fetch instead of ->fetchAll and also use ->bindParam. And ->prepare makes it easy to deal with ANY $myVal, because you can run the statement as often as you want. You just have to chance the ? by using another params.

Örnek:

$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
}