2016-11-10 52 views
1

我想添加一些功能到我的烹飪書,但我想不出一種包括我點擊編輯的ID的方式。php編輯記錄,如何包含當前編號

該表被稱爲「廚師」,是3列; -id爲AUTO_INCREMENT - 姓名 - 國家

然後,我有我在哪裏顯示廚師名單上的index.php名單:

<?php 
    $chefs = get_chefs(); 
?> 

<h3>Chefs' list</h3> 
    <ul> 
    <?php foreach ($chefs as $chef) { 
     echo '<li>' . $chef['name'] . ' from ' . $chef['country'] . '<a class="toLink" href="edit_chef.php?id=' . $chef['id'] . '" title="edit chef">Edit chef</a>' . '</li>'; 
    } ?> 
</ul> 

在功能PHP中,我有一個get_chefs()功能和find_chef_by_id($ ID)功能:

function get_chefs() { 
    include'db_connection.php'; 
    try { 
     return $conn->query("SELECT * FROM chefs"); 
    } catch (PDOException $e) { 
     echo 'Error:' . $e->getMessage() . "<br />"; 
     return array(); 
    } 
    return true; 
} 

function find_chef_by_id($id = ':chef_id') {   
      include 'db_connection.php'; 

    $sql = 'SELECT * FROM chefs WHERE id=:chef_id'; 

    try { 
     $results = $conn->prepare($sql); 
     $results->bindParam(':chef_id', $chef_id, PDO::PARAM_INT);  
     $results->execute(); 
    } catch(PDOException $e) { 
     echo 'Error: ' . $e->getMessage() . '<br />'; 
     return array(); 
    } 
     return $results->fetchAll(PDO::FETCH_ASSOC); 
} 

要處理一個廚師的版本,我創建了一個名爲edit_chef.php:

if ($_SERVER['REQUEST_METHOD'] == 'POST') { 
    $name = filter_input(INPUT_POST, 'name', FILTER_SANITIZE_STRING); 
    $country = filter_input(INPUT_POST, 'country', FILTER_SANITIZE_STRING); 

    if(empty($name)) { 
     $error_message = "Chef's name can not be empty"; 
    } elseif (empty($country)) { 
     $error_message = "Country can not be empty"; 
    }else { 
     if(edit_chef($name, $country)) { 
     header('Location: index.php'); 
     exit; 
     } else { 
      $error_message = "Could not update chef"; 
     } 
    } 
} 

include 'includes/header.php';?> 
    <div class="col-container"> 
     <h1>Edit chef</h1> 
     <?php 
     if (isset($error_message)) { 
      echo '<p class="message">' . $error_message . '</p>'; 
     } 

     $chefs = get_chefs(); 
     foreach ($chefs as $chef) { 
     $id = find_chef_by_id($chef["id"]); 


     ?> 
     <form method="POST" action="edit_chef.php?chef=<?php echo urldecode($id); ?>"> 
     <div> 
      <label for="name" class="required">Name</label> 
      <input name="name" type="text" value="<?php echo htmlentities($chef["name"]); ?>" /> 
     </div> 
     <div> 
      <label for="country" class="required">Country</label> 
      <input name="country" type="text" value="<?php echo htmlentities($chef["country"]); ?>" /> 
     </div> 
     <button class="submit" type="submit" name="submit">Submit</button> 
     </form> 
    </div> 

但目前,我不知道是不是因爲我不應該使用foreach循環,或者我的$ id值不是find_chef_by_id($ chef [「id」]),當我點擊編輯廚師時,它會轉到正確的地址「http://localhost/cooking_book/edit_chef.php?id=1」,但對於每位廚師來說,這不僅僅是我單擊的那個廚師。

我在做什麼錯?

謝謝

+0

如果您的'find_chef_by_id'函數bindParam調用的是$ id,而不是$ chef_id ? –

+0

其實你是對的,我已經修好了,但是,它根本沒有任何改變,但是,當我點擊編輯廚師出現一個表格,每個人都在dable –

+0

也你不應該需要'foreach ($ chefs as $ chef){'在您的edit_chef.php –

回答

2

的第一個錯誤是有$ chef_id而不是$ ID在你find_chef_by_id功能,你需要解決這個問題。

另一件事,我不明白爲什麼你需要繞過數據庫中的所有廚師,如果你已經知道通過地址傳遞的ID?

例如: 在你edit_chef.php您需要捕獲GET數據:

<?php 

    //Get the ID from the URL 
    $chefID = null; 
    if (isset($_GET['id'])) 
     $chefID = $_GET['id']; 

    if ($chefID == null) 
     die ("oops, Chef ID is null, bad request?"); 

    //Now find the chef we need 
    $theChef = find_chef_by_id($chefId); 

    //do stuff 

?> 

這應該是所有你需要修復。

另外,在表單中添加呼應的了,您通過GET請求獲得的電流ID隱藏的文本字段:

<input type="hidden" name="chefId" value="<?=$chefId?>"> 

使用這種方法你能夠從POST數據拉廚師ID下一次用戶按下編輯表單上的提交按鈕,因此您不需要在chef_edit.php表單上的自定義Action =「blah」

+0

哦',因爲你處理基於URL的數據(id in這種情況下)你需要find_chef_by_id函數的錯誤處理,例如,如果我傳遞了edit_chef.php?id = TheCakeIsALie,那麼很可能不是數據庫中的TheCakeIsALie的ID(更不用說它不是一個數字)。 而不是在該函數中返回$ results-> fetchAll,而是查看行數是否爲零,如果它返回NULL,否則返回fetchAll數據 - 然後您可以稍後檢查null並返回錯誤。 –

+0

如果您需要更多的幫助,請隨時加入PHP聊天室:http://chat.stackoverflow.com/rooms/11/php很多人,包括我自己都準備好解決您的問題:) –

+0

好的...好的,給我一點時間,我會處理所有這些,我會回到你身邊!在這裏的PHP聊天室? :o我一定會加入:) 謝謝! –