Нужен совет по обработке ошибок в PHP / mysql - PullRequest
0 голосов
/ 10 июня 2009

Я не уверен, какой метод лучше всего использовать при предоставлении READABLE обратной связи конечному пользователю. Я читал некоторые форумы, но на самом деле не стал мудрее (или не понял)

Я хотел бы дать отзыв, если вставка / обновление не удалось, когда это произойдет, и когда будет предоставлен пользовательский отзыв (например, проверка наличия элемента уже существует).

При INSERT, UPDATE, DELETE, DROP и т. Д. Запрос возвращает значение TRUE или FALSE. Поэтому мое свойство результата $ this-> query_result всегда должно иметь значение true или false.

Мои проблемы:

  • Динамически отображать обратную связь с пользователем после отправки формы (подчиняется страница)
  • $ this-> query_result - true, если оно возвращает строку

Я добавил код, чтобы посмотреть, что я делаю (делаю неправильно)

Это функции, которые я использую для подключения / запроса к БД:

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

Вот моя проблема: я даю отзыв об уровне доступа к данным (DAL), см., Например, это:

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

Возвращая текстовую строку, возвращаемый результат всегда будет истинным. Из того, что я прочитал, у меня, вероятно, должна быть функция, которая обрабатывает ошибки / обратную связь.

Это то, что я сейчас делаю с отзывами в моем шаблоне:

  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 ]

4 голосов
/ 10 июня 2009

Я бы использовал встроенную обработку исключений в PHP5 для перехвата ошибок и, возможно, ошибок валидации. Например:

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

В скрипте вызова

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

Пара других вещей, на которые нужно указать в вашем сценарии.

  1. Лучше использовать PDO и подготовить заявления.
  2. Вы также можете использовать следующее, чтобы определить, является ли длина строки мет.
$arr = 'Shoan';
var_dump(isset($arr[10])); //false
var_dump(isset($arr[2])); //true
  1. Фильтр ввода для sql инъекция / XSS эксплойты до вставив его в вашу базу данных или используя его в вашем приложении.
2 голосов
/ 10 июня 2009

Только один совет: вы должны использовать исключения при программировании OO. Например, вы можете ввести разные исключения для разных сообщений об ошибках.

class ValidationException extends Exception
{}

class DatabaseExceptionextends Exception
{}

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

Затем вы ловите все эти исключения и реагируете по-разному в зависимости от типа исключения.

try {
    // ...
}
catch (ValidationException $e) {
    // ...
}
catch (DatabaseExceptionextends $e) {
    // ...
}
0 голосов
/ 12 июня 2009

Должен ответить на мой собственный пример, чтобы показать фрагмент кода. Принимая предложение Shoan, я пытаюсь расширить DAL для использования PDO (класс * DAL расширяет PDO ). Но это дает мне пустой экран. Это мой класс DAL.

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

Так что в моем коде я просто делаю это:
$ myDB = new DAL ();
$ myDB-> connect ();
$ result = $ myDB-> getSomeData ();

Но как только я добавлю ' extends PDO ', моя страница станет пустой. Я также не могу использовать любой try / catch / throw - все это выдает мне сообщения об ошибках.

0 голосов
/ 10 июня 2009

Вы можете добавить специальный символ в начало сообщений об ошибках в addNewPerson (). Вызывающий скрипт будет использовать строковые функции для обнаружения специального символа (чтобы он знал, что есть ошибка) и удаления этого символа, чтобы сообщение отображалось без него. Как вы думаете, это будет работать для того, что вы хотите?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...