PHP ve MySQL ile hata işleme için önerilen yaklaşım

4 Cevap php

Benim PHP web uygulaması veritabanı (MySQL) hataları yakalamaya çalışıyorum. Şu anda, ben) mysqli_error gibi fonksiyonları (olduğunu görmek, son yakalamak için mysqli_errno () hatası oluştu. Ancak, bu hala benim php kod tekrarlanan if / else ifadeleri kullanarak hata oluşması için kontrol etmemi gerektiriyor. Ne demek istediğimi görmek için aşağıdaki kodumu kontrol edebilirsiniz. Bunu yapmak için daha iyi bir yaklaşım var mı? (Ya da) ben istisnaları yükseltmek ve tek bir yerde onları yakalamak için kendi kod yazmak mı? Ayrıca, PDO istisnalar zam yok? Teşekkürler.

function db_userexists($name, $pwd, &$dbErr)
{
    $bUserExists = false;
    $uid = 0;
    $dbErr = '';

    $db = new mysqli(SERVER, USER, PASSWORD, DB);

    if (!mysqli_connect_errno())
    {       
        $query = "select uid from user where uname = ? and pwd = ?";
        $stmt = $db->prepare($query);

        if ($stmt)
        {
            if ($stmt->bind_param("ss", $name, $pwd))
            {
                if ($stmt->bind_result($uid))
                {
                    if ($stmt->execute())
                    {
                        if ($stmt->fetch())
                        {
                            if ($uid)
                                $bUserExists = true;
                        }
                    }
                }
            }
            if (!$bUserExists)
                $dbErr = $db->error();

            $stmt->close();
        }       
        if (!$bUserExists)
            $dbErr = $db->error();      

        $db->close();
    }
    else
    {
        $dbErr = mysqli_connect_error();
    }

    return $bUserExists;
}

4 Cevap

Ben istisnalar iyi yaklaşım olduğunu düşünüyorum. PDO Eğer sadece nesne oluşturduğunuzda PDO::ERRORMODE_EXCEPTION ayarlamanız gerekir istisnalar atmak yok.

Ben MySQL ifadeleri yürütmek ve onlar başarısızlık farklı nedenleri için özel istisnalar dahil olmak üzere, başarısız olursa istisnalar yükseltmek için kendi kod oluşturduk. Çarpışmalar me try..catch blokları ve catch DatabaseCollisionException s kullanmak ve farklı diğer veritabanı istisnalar gelenler işlemek için izin, ortaya çıktığında bunların en yararlı biridir.

Ben bu iş için kolay, her tablo sadece üye değişkenleri atamak ve benzeri, veritabanına kaydetmek için save yöntemi diyebiliriz bir PHP sınıfı (modeller) tarafından temsil edildi MVC tasarım deseni bulundu ne için:

try
{
   $user = new User();
   $user->username = 'bob';
   $user->setPassword($_POST['password'); // Could do some SHA1 functions or whatever
   $user->save
}
catch(DatabaseCollisionException $ex)
{
   displayMessage("Sorry, that username is in use");
}
catch(DatabaseException $ex)
{
   displayMessage("Sorry, a database error occured: ".$ex->message());
}
catch(Exception $ex)
{
   displayMessage("Sorry, an error occured: ".$ex->message());
}

Benzer tasarım modelleri hakkında daha fazla bilgi için, bkz:

Tabi ki bu size yardımcı bulabilirsiniz sadece bazı fikirler var, tek cevap değildir.

this still requires me to check for error occurrence using repeated if/else statements

How's that? You don't need to check for every possible error. I'd make just final check for the returned value and nothing else.

Ne amaçla bu iç içe koşulları kullanabilirim?

Aşağıdaki şekilde onu yeniden olabilir:

$bUserExists = false; $uid = false;

if (!mysqli_connect_errno())
    {       
        if($stmt = $db->prepare("select uid from user where uname = ? and pwd = ?")
                   ->bind_param("ss", $name, $pwd))
        {
           $stmt->execute();

           $stmt->bind_result($uid);

           $stmt->fetch();

           $stmt->close();
        }

        if ($uid)
           $bUserExists = true;

        $db->close();
    }
    else
    {
        $dbErr = mysqli_connect_error();
    }