PHP deneyin ve SQL Ekle için Yakala

7 Cevap php

Her sayfa yük üzerinde bir ekleme yapar web siteme (yüksek trafik) hakkında bir sayfa var.

Ben (bir hata yakalamak) ve sistem MySQL içine ekleme yapmak mümkün değilse devam etmek en hızlı ve en güvenli şekilde merak ediyorum. I try / catch veya ölmek ya da başka bir şey kullanmak gerekir. Ben uç olur emin olmak istiyorum ama nedense ben sayfa zaten yüklemeye devam etmek istemiyorsanız eğer.

...
$db = mysql_select_db('mobile', $conn);
mysql_query("INSERT INTO redirects SET ua_string = '$ua_string'") or die('Error #10');
mysql_close($conn);
...

7 Cevap

Denetleme documentation gösteriyor ki, bir hata üzerine döner false. Yani dönüş durumunu ziyade or die() kullanın. Bu başarısız olursa (yapmak istediğiniz ne olursa olsun ya da) giriş yapabilirsiniz, hangi return false ve sonra devam edecek.

$rv = mysql_query("INSERT INTO redirects SET ua_string = '$ua_string'");
if ( $rv === false ){
     //handle the error here
}
//page continues loading

Bu hile yapabilirsiniz,

function createLog($data){ 
    $file = "Your path/incompletejobs.txt";
    $fh = fopen($file, 'a') or die("can't open file");
    fwrite($fh,$data);
    fclose($fh);
}
$qry="INSERT INTO redirects SET ua_string = '$ua_string'"   
$result=mysql_query($qry);
if(!$result){
    createLog(mysql_error());
}

Ben böyle bir şey ile sopa yasaluyari 'ın cevabı tertipleyerek:

Şöyle Biz sadece bizim mysql_query değiştirebilirsiniz:

function mysql_catchquery($query,$emsg='Error submitting the query'){
    if ($result=mysql_query($query)) return $result;
    else throw new Exception($emsg);
}

Şimdi biz sadece bu, bazı iyi bir örnek gibi kullanabilirsiniz:

try {
    mysql_catchquery('CREATE TEMPORARY TABLE a (ID int(6))');
    mysql_catchquery('insert into a values(666),(418),(93)');
    mysql_catchquery('insert into b(ID, name) select a.ID, c.name from a join c on a.ID=c.ID');
    $result=mysql_catchquery('select * from d where ID=7777777');
    while ($tmp=mysql_fetch_assoc($result)) { ... }
} catch (Exception $e) {
    echo $e->getMessage();
}

Ne kadar güzel unutmayın. QQ herhangi başarısız olduğunda bizim hataları ile gtfo. Ve aynı zamanda bizim fonksiyonu şimdi kendisi tarafından kolları çünkü biz, doğrulama için bir $result değişken içine sorguları yazma durumunu saklamak artık gerekmez dikkat edebilirsiniz. Ve seçer kolları aynı şekilde, sadece normal işlevini yaptığı gibi bir değişkene sonucu atar, henüz kendi içinde hatalar işler.

Ayrıca onlar büyük bir güvenlik riski taşıdıkları için biz özellikle bu modası geçmiş uzantılı yüzden, gerçek hataları göstermek gerekmez, unutmayın. Bizim varsayılan çoğu zaman sadece iyi olacak nedeni budur. Biz bazı özel sorgu hata kullanıcıya bildirmek istiyorum eğer Oysa, biz her zaman özel bir hata iletisi görüntülemek için ikinci parametre iletebilirsiniz.

Kendi başarısız mysql sorgusunda durumlar atma uygulayabilirsiniz. Ne gerek mysql_query fonksiyonu için, örneğin bir sarıcı yazmak için:

// user defined. corresponding MySQL errno for duplicate key entry
const MYSQL_DUPLICATE_KEY_ENTRY = 1022;

// user defined MySQL exceptions
class MySQLException extends Exception {}
class MySQLDuplicateKeyException extends MySQLException {}

function my_mysql_query($query, $conn=false) {
    $res = mysql_query($query, $conn);
    if (!$res) {
        $errno = mysql_errno($conn);
        $error = mysql_error($conn);
        switch ($errno) {
        case MYSQL_DUPLICATE_KEY_ENTRY:
            throw new MySQLDuplicateKeyException($error, $errno);
            break;
        default:
            throw MySQLException($error, $errno);
            break;
        }
    }
    // ...
    // doing something
    // ...
    if ($something_is_wrong) {
        throw new Exception("Logic exception while performing query result processing");
    }

}

try {
    mysql_query("INSERT INTO redirects SET ua_string = '$ua_string'")
}
catch (MySQLDuplicateKeyException $e) {
    // duplicate entry exception
    $e->getMessage();
}
catch (MySQLException $e) {
    // other mysql exception (not duplicate key entry)
    $e->getMessage();
}
catch (Exception $e) {
    // not a MySQL exception
    $e->getMessage();
}

vb hata oturum isterseniz dont eğer, try / catch kullanmak; Sadece mysql_query önce @ koymak

edit : you can use try catch like this; so you can log the error and let the page continue to load

function throw_ex($er){  
  throw new Exception($er);  
}  
try {  
mysql_connect(localhost,'user','pass'); 
mysql_select_db('test'); 
$q = mysql_query('select * from asdasda') or throw_ex(mysql_error());  
}  
catch(exception $e) {
  echo "ex: ".$e; 
}

Use any method described in the previous post to somehow catch the mysql error.
Most common is:

$res = mysql_query('bla');
if ($res===false) {
  //error
  die();
}
//normal page

Bu da işe:

function error() {
  //error
  die()
}
$res = mysql_query('bla') or error();
//normal page

try { ... } catch {Exception $e) { .... } çalışmayacaktır!

Note: doğrudan sizinle ilgili değil soru ama kullanıcıya şey Faydalı gösterilecek olursa çok daha iyi olur bence. Ben sadece boş bir ekran veya herhangi bir gizemli hata mesajı görüntüleyen bir web sitesini yeniden asla.

Sen kullanabilirsiniz:

$result = mysql_query(" INSERT INTO (field_1, field_2) values (' ',' ') ")
    or exit ( mysql_error() );