为什么我的更新声明和表单不起作用?

时间:2016-01-09 22:38:40

标签: php mysql database session

我对php比较新。在下面的代码中,我试图更新用户' dietID' (他们当前的饮食,他们在注册时选择了它们),以便它改变存储在用户数据库中的dietID。但是,在按下“更改”后,提交按钮,没有任何反应,没有任何更新。谁能理解为什么?

表格处理代码:

<?php 
if(trim($_POST['submit']) == "Change") {
        require_once("connect.php");
        if (!$db_server) {
            die("Unable to connect to MySQL: " . mysqli_connect_error($db_server));
        } else {
            mysqli_select_db($db_server, $db_database) or die("<h1>Couldn't find db</h1>");
            //UPDATE records of users table
            $query="UPDATE users SET dietID=".$dietopt." WHERE ID= $sess_userID";
            mysqli_query($db_server, $query) or die("Update failed" . mysqli_error($db_server));   
        }
        require_once("db_close.php");
    } else {
        $message= "Your diet has been updated";
}

?>

形式:

Would you like to change what your current diet is? Please select one
<br>
<form action="account.php" method="post">
<td><input type="radio" name="dietopt" value="Meat-eater"/>Meat-eater</td>
<tr>
<td><input type="radio" name="dietopt" value="Vegetarian"/>Vegetarian</td></tr>
<tr>
<td><input type="radio" name="dietopt" value="Vegan"/>Vegan</td></tr>
<br>
<input type="submit" name="Change" value="Change">
<br>
    </form>

和在注册页面上创建的会话变量(不以任何格式,从注册页面的整个代码的片段中复制和粘贴):

$dietopt = $row['dietID'];

$_SESSION['diet'] = $dietopt;

$dietopt= trim($_POST['dietopt']);

1 个答案:

答案 0 :(得分:1)

要纠正的一些事情:

首先,提交按钮的名称为&#34;更改&#34;,因此您应该更改:

if(trim($_POST['submit']) == "Change") {

由:

if(trim($_POST['Change']) == "Change") {

其次, $ dietopt 的值将是一个字符串,例如&#34; Vegan&#34; ,因此需要引用。如果这确实是你所期望的,那么替换这一行:

 $query="UPDATE users SET dietID=".$dietopt." WHERE ID= $sess_userID";

人:

 $query="UPDATE users 
         SET dietID='"
            .mysqli_real_escape_string($db_server,$_POST['dietopt']). "'
         WHERE ID= $sess_userID";

我在这里使用了$_POST['dietopt'],但如果您确定 $ dietopt 的值已正确设置,则可以使用它。

mysqli_real_escape_string的调用可防止通过该值注入SQL。我建议改为使用prepared statements

最后,设置 $ message 变量的位置也有问题:当用户到达此页面而未提交任何内容时,它会设置它。相反,它应该在成功更新后立即设置。所以删除它:

} else {
    $message= "Your diet has been updated";

在查询后添加消息分配,如下所示:

    mysqli_query($db_server, $query) or die("Update failed" . mysqli_error($db_server));   
    $message= "Your diet has been updated";

然后,您应该在某处显示该消息。这取决于您想要显示的其他内容,但您可以简单地添加到PHP块的末尾(在结束?>之前)以下内容:

 if (isset($message)) {
      echo "<h4 style='color:green'>$message</h4>";
 }

...或使用您想要的任何HTML和样式。

结束,最后一句话:

Please, don't use mysql_* functions in new code。它们不再被维护and are officially deprecated。请参阅red box?转而了解prepared statements,并使用PDOMySQLi - this article将帮助您确定哪个。如果您选择PDO here is a good tutorial