【问题标题】:Why is my update statement and form not working?为什么我的更新声明和表格不起作用?
【发布时间】:2016-04-14 11:26:14
【问题描述】:

我对 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>

以及在注册页面上创建的会话变量(不是任何格式,从注册页面整个代码的sn-ps复制粘贴):

$dietopt = $row['dietID'];

$_SESSION['diet'] = $dietopt;

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

【问题讨论】:

  • 您的提交按钮的名称是“更改”,因此您必须访问$_POST['Change']
  • 好吧,我改变了,然后得到这个错误:更新失败你的 SQL 语法有错误;检查与您的 MySQL 服务器版本相对应的手册,以在第 1 行的“WHERE ID= 34”附近使用正确的语法
  • 好吧,如果我不得不猜测,$dietopt 有问题。你在哪里设置值?
  • 也许 $dietopt 是空的。
  • 尝试$query="UPDATE users SET dietID=".$_SESSION['diet']." WHERE ID= $sess_userID" 而不是你的$query var;

标签: php mysql database session


【解决方案1】:

一些需要纠正的地方:

首先提交按钮的名称是“更改”,所以你应该更改:

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

作者:

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

其次,$dietopt 的值将是一个字符串,例如 "Vegan",因此需要被引用。如果这确实是您所期望的,则替换此行:

 $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 块的末尾(在结束 ?&gt; 之前)添加以下内容:

 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

【讨论】:

  • 感谢您抽出宝贵时间回复,非常感谢。我做了上述但不幸得到错误消息:您的 SQL 语法有错误;检查与您的 MySQL 服务器版本相对应的手册,以在第 1 行的“WHERE ID= 32”附近使用正确的语法。32 是该用户的 ID,所以我通过放置 sess_userID 做错了吗?
  • 不,你的 sess_userID 没问题。请在将 SQL 分配给 $query 之后立即添加 echo $query;print_r ($_POST['dietopt']);,并说明它们打印的内容。 dieopt 参数可能有问题。
  • 执行此操作时收到的错误消息是:UPDATE users SET DietID= WHERE ID= 32VeganUpdate failedYou have an error in your SQL syntax;检查与您的 MySQL 服务器版本相对应的手册,以在第 1 行的“WHERE ID= 32”附近使用正确的语法
  • 注:我没有将表单的值更改为 1/2/3,因为我不确定这是否正确。它会用数字而不是饮食来更新我的数据库中的列。或者我理解不正确
  • 好吧,我不确定您的数据库是如何组织的。只是列名“dietID”给人的印象是它存储了一个数字。但是,如果您确定它打算存储诸如“Vegan”之类的值,那么请不要进行我建议的 1/2/3 更改。我只是不确定你是否有你想要的。我现在正在查看您的错误...
猜你喜欢
  • 2017-04-06
  • 1970-01-01
  • 2014-12-12
  • 2015-09-30
  • 1970-01-01
  • 2011-03-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多