PHP / MySQL hata işleme hakkında bazı tavsiyeler gerekir

4 Cevap php

Ben yöntemi son kullanıcıya okunabilir geribildirim verirken kullanmak için en iyisi olduğundan emin değilim. Ben bazı forumlarda okudum ama gerçekten herhangi akıllıca kazanılmış değil (ya da ben bunu anlamış değil) ettik

Ben ekleme / güncelleştirme başarısız olduğunda (bir öğe alread varsa kontrol gibi), özel geribildirim verirken bir başarıdır ve ne zaman, geribildirim vermek istiyorum.

On INSERT, UPDATE, DELETE, DROP etc., the query returns either TRUE or FALSE. Therefor my result property $this->query_result should always be either true or false.

Benim konular:

  • Dynamically display feedback to user after form submit (submits to same page)
  • $this->query_result is true if it returns a string

Ben (yanlış yapıyorum) ne yapıyorum görmek için kod ekledik

Bunlar benim DB sorgulamak / bağlamak için kullanabileceğiniz işlevleri şunlardır:

  public function connect() 
  { 

      if (!($this->conn = mysql_connect($this->host, $this->username, $this->pwd)))  {
         die("Error connecting to DB by user = " . $this->username); 
      } 

      $this->db = mysql_select_db($this->dbname,$this->conn) 
        or die("Unable to connect to database " . $this->dbname); 
  }  

  private function query($sql) 
  {
      $this->query_result = mysql_query($sql, $this->conn)or die("Unable to query local database <b>". mysql_error()."</b><br>$sql"); 

      if (!$this->query_result){ 
          die("database query failed."); 
      } else { 
          return $this->query_result; 
      }
  }

İşte benim sorunum: Ben Data Access Layer (DAL) hakkında geri bildirim veriyorum, örneğin bkz Bu:

  public function addNewPerson($formData)
  {
    $sql = "INSERT INTO my_table(`name`, `email`, `www`)";

    $sql .= " VALUES('".
      $formData['name']."','".
      $formData['email']."','".
      $formData['www']."','");

   $this->query($sql);
   return $this->query_result;
  }

By returning a text string, the return result will always be true. From what I read, I should probably have a function which handles errors / feedback.

Bu şu anda benim şablona geri besleme ile ne yapıyorum:

  if (isset($_POST['form_submit']))
  {

    if (isset($_POST['person_submit'])) {
      $formData = $sl->getFormData();
      $result = $myDB->addNewPerson($formData);

      if ($result == true)
      {
        echo '<script type="text/javascript" language="JavaScript">
              jQuery("#contentArea .messageWindow1").show(500);
              jQuery("#contentArea :input").click(function(){ jQuery("#contentArea .messageWindow1").hide(500); });
        </script>';
      } else {
        echo '<script type="text/javascript" language="JavaScript">
              jQuery("#contentArea .messageWindow2").show(500);
              jQuery("#contentArea :input").click(function(){ jQuery("#contentArea .messageWindow2").hide(500); });
        </script>';
      }
    }
  } 

<div id="contentArea">   
  <div class="messageWindow1"> <span class="msg"><?php echo $labelResult ?></span></div>
  <div class="messageWindow2"> <span class="msg"><?php echo $labelResult ?></span></div>
</div>

4 Cevap

Ben de hataları yakalamak ve muhtemelen doğrulama hataları PHP5 en yerleşik durum işleme kullanmak istiyorsunuz. Örneğin:

    class DatabaseException extends Exception {}
    class ValidatorException extends Exception {}

         public function connect() 
          { 

              if (!($this->conn = mysql_connect($this->host, $this->username, $this->pwd)))  {
                 throw new DatabaseException("Error connecting to DB by user = " . $this->username); 
              } 

              if(!($this->db = mysql_select_db($this->dbname,$this->conn))) { 
                throw new DatabaseException("Unable to connect to database " . $this->dbname);
 }
          }  

    //....


    public function addNewPerson($formData)
      {
        $sql = "INSERT INTO my_table(`name`, `email`, `www`)";

        $sql .= " VALUES('".
          $formData['name']."','".
          $formData['email']."','".
          $formData['www']."','");

       //If less than 2 characters, do not insert data.
       if (strlen($formData['name']) < 2)
        throw new ValidatorException( "Person not saved. Name field was to short or empty.");

       //If person already exists
       if($this->isPersonInList($formData['name']))
        throw new ValidatorException( "Person already exists!");

       //Process query
       $this->query($sql);
       return $this->query_result;
      }

Çağırma Senaryoda

try {
$formData = $sl->getFormData();
$result = $myDB->addNewPerson($formData);
} catch (DatabaseException $e) {
// display $e->getMessage()
} catch (ValidatorException $e) {
//display $e->getMessage()
}

Lütfen komut ile işaret etmek başka şeyler çift.

  1. It's better to use PDO and prepared statements.
  2. You can also use the following to determine if the string length is met.
$arr = 'Shoan';
var_dump(isset($arr[10])); //false
var_dump(isset($arr[2])); //true
  1. Filter the input for sql injection/XSS exploits before pushing it into your database or using it in your application.

Sadece bir ipucu: OO programlama yaparken özel durumlar kullanmak gerekir. Örneğin size farklı hata geri beslemesi için farklı istisnalar getirebilir.

class ValidationException extends Exception
{}

class DatabaseExceptionextends Exception
{}

throw ValidationException("Person not saved. Name field was to short or empty.");
throw DatabaseException("database query failed.");

Sonra tüm bu özel durum yakalamak ve farklı özel durumun türüne bağlı olarak tepki.

try {
    // ...
}
catch (ValidationException $e) {
    // ...
}
catch (DatabaseExceptionextends $e) {
    // ...
}

Sen addNewPerson () hata iletileri başına özel bir karakter eklemek olabilir. Mesajı olmadan görüntülemek istiyorsunuz, böylece çağrı komut (bir hata var biliyor ki) özel karakterini algılar ve bu karakteri kaldırmak için dize işlevlerini kullanabilirsiniz. Eğer bu isteyen konum ne işe yarayacağını düşünüyor musunuz?

Have to answer my own example to show code snippet. Taking up on Shoan suggestion, I'm trying to extend DAL to use PDO (class DAL extends PDO). But that gives me blank screen. This is my DAL class.

class DAL { 
  protected $username; 
  protected $pwd; 
  protected $host;
  protected $dbname;
  private $conn; 
  private $db; 
  private $query_result; 

  public function __construct($cfg_file = 'nf.config') 
  { 
    $config = parse_ini_file($cfg_file);

    $this->username     = $config['db_user']; 
    $this->pwd          = $config['db_password'];
    $this->host         = $config['db_host']; 
    $this->dbname       = $config['db_name'];
  } 

  public function connect() 
  { 
      ($this->conn = mysql_connect($this->host, $this->username, $this->pwd))  
        or die("Error connecting to DB by user = " . $this->username); 

      $this->db = mysql_select_db($this->dbname,$this->conn) 
        or die("Unable to connect to database " . $this->dbname); 
  }  


  private function query($sql) 
  {
      $this->query_result = mysql_query($sql, $this->conn)
        or die("Unable to query local database <b>". mysql_error()."</b><br>$sql"); 

      if ($this->query_result){ 
          return $this->query_result; 
      }
  } 

  public function getSomeData()
  {
    $sql ="SELECT * FROM myTable";
    //Process query
    $this->query($sql);
      return $this->query_result; 
  }
}

So in my code, I just do this:
$myDB = new DAL();
$myDB->connect();
$result = $myDB->getSomeData();

Ben 'extends PDO' eklemek Ama bir kez, benim sayfa kararıyor. Hepsi bana hata mesajları veriyor - Ben de herhangi bir try / catch / atışı kullanacak mümkün değilim.