2015-12-09 2 views
-2

Мне была назначена задача обработки ошибок для университетского проекта, и я не могу заставить ее работать. Мне нужно уловить ошибки SQL с помощью Try catch и перенаправить пользователя на новую страницу error.php, которая отображает ошибку. Я знаю, что это не лучший способ справиться с ошибками, но это то, чего хочет профессор.Обработка ошибок PHP - перенаправление

Вот пример одного из страниц я пытаюсь поймать ошибки на:

<?php 
    $orderid = $_REQUEST['orderid']; 
    connectDB(); // database connections are defined in connect_to_DB.php 

    try{ 
     $strSql2 = "SELECT `order_date`, `status_id`, `emp_id`,`cust_id` FROM `salesorder` WHERE `order_id`='" .$orderid. "'" ; 

     $result = @mysqli_query($db, $strSql2) // or die("SQL error: " . mysqli_error()); 

     if($row = mysqli_fetch_array($result)){ 
      $orderDate = $row["order_date"]; 
      $orderStatus=$row["status_id"]; 
      $empid = $row["emp_id"]; 
      $custid=$row["cust_id"]; 

      if(!$result){ 
       throw new Exception(mysqli_error($db)); 
      } 

      mysqli_free_result($result); // Always release the recordset memory resources 
      mysqli_close($db); // Always close the database connection 

      connectDB(); 
      $sqlcount = "SELECT COUNT(order_id) AS numrows FROM orderitem WHERE order_id=".$_REQUEST['orderid']; 
      $resultcount = @mysqli_query($db,$sqlcount) // or die ("SQL error: ".mysqli_error()); 

      if($rowcount= mysqli_fetch_array($resultcount)){ 
       $orderamount = $rowcount['numrows']; 
       if(!$resultcount){ 
        throw new Exception(mysqli_error($db)); 
       } 

       mysqli_free_result($resultcount); 
       mysqli_close($db); 
      } 
     } 
    } catch (Exception $e){ 
     // redirect to a php error page 
     header("Location: error.php?msg=" . $e->getMessage() . "&line=" . $e->getLine()); 
    } 

Это код на странице ошибки, error.php:

<? 
    print "Error message: " . $_GET["msg"]; 
    if(isset($_GET["line"])){ 
     print " - line number: " . $_GET["line"]; 
    } 

К сожалению, случайно удалил конец этого сообщения ... Прямо сейчас есть ошибка с оператором if в строке 66 if($row = mysqli), который я не могу очистить. Прежде чем я начал добавлять обработку ошибок, все работало нормально.

Заранее благодарим за помощь.

+0

А что это вопрос? (Использовать urlencode для msg) – KiwiJuicer

+2

Вы не можете поймать вещи, пока вы подавляете вывод с помощью '@' –

+0

@JayBlanchard У меня создалось впечатление, что @ просто подавил сообщение для данного вызова функции, а не сама ошибка – colyerfs

ответ

1

Вы пропавшая: запятая

$result = @mysqli_query($db, $strSql2); 
+0

Спасибо, очистил ошибку if if – colyerfs

+0

Yup, thats все это неправильно с этим кодом! – RiggsFolly

0

1) Изменение if($row = mysqli_fetch_array($result)){ к while($row = mysqli_fetch_array($result)){

2) Поместите if(!$result){throw new Exception(mysqli_error($db));} перед тем while($row = mysqli_fetch_array($result)){ Поскольку if(!$result){ ложно, то почему он должен в то время цикла.

3) Не делайте несколько соединений.

<?php 
$orderid = $_REQUEST['orderid']; 
connectDB(); // database connections are defined in connect_to_DB.php 

try{ 
    $strSql2 = "SELECT `order_date`, `status_id`, `emp_id`,`cust_id` FROM `salesorder` WHERE `order_id`='" .$orderid. "'" ; 

    $result = @mysqli_query($db, $strSql2) // or die("SQL error: " . mysqli_error()); 

    if(!$result){ 
     throw new Exception(mysqli_error($db)); 
    } 

    while($row = mysqli_fetch_array($result)){ 
      . 
      . 
      // Remove this close and open connection. 
      //mysqli_close($db); // Always close the database connection 
      //connectDB(); 

    } 
} catch (Exception $e) { 
    header("Location: error.php?msg=" . $e->getMessage() . "&line=" . $e->getLine()); 
} 
+0

Yup, thats все это неправильно с этим кодом! – RiggsFolly

+0

Спасибо, очистили ошибку if if – colyerfs

+0

@colyerfs: Проверьте один раз. –

0

Существует только так много плохого в вашем коде, я просто предложить это в качестве лучшей отправной точкой для вас, чтобы продолжить свою домашнюю работу с

<?php 
$orderid = $_REQUEST['orderid']; 

// connect only once per script 
// useful comment here would be 

// connectDB() set the connection handle onto $db in the global scope 
// not good practice but at least now we know 
connectDB(); 

try{ 
    $sql = "SELECT `order_date`, `status_id`, `emp_id`,`cust_id` 
      FROM `salesorder` 
      WHERE `order_id`='$orderid'" ; 

    $result = mysqli_query($db, $sql); 
    // test statuses when you receive them not sometime later 
    // after attempting to use a potentially useless mysqli::result object 

    if(!$result){ 
     throw new Exception(mysqli_error($db)); 
    } 


    $row = mysqli_fetch_array($result); 

    $orderDate = $row["order_date"]; 
    $orderStatus = $row["status_id"]; 
    $empid  = $row["emp_id"]; 
    $custid  = $row["cust_id"]; 


    $sql = "SELECT COUNT(order_id) AS numrows 
      FROM orderitem 
      WHERE order_id={$_REQUEST['orderid']}"; 

    $resultcount = mysqli_query($db,$sqlcount); 

    // again test status now not later 
    if(!$resultcount){ 
     throw new Exception(mysqli_error($db)); 
    } 

    // only one result row so no loop necessary 
    $row = mysqli_fetch_array($resultcount)){ 

    $orderamount = $row['numrows']; 

} catch (Exception $e){ 
    // redirect to a php error page 
    header("Location: error.php?msg=" . $e->getMessage() . "&line=" . $e->getLine()); 
} 
Смежные вопросы