2016-11-10 55 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我一定会加入:) 谢谢! –