【问题标题】:Why am I receiving the error "Unknown column 'deposit' in 'field list'"为什么我收到错误“'字段列表'中的未知列'存款'”
【发布时间】:2021-05-07 01:18:02
【问题描述】:

我创建了一个简单的 HTML 表单,用于提交应存入帐户的金额。该表单由一个数字输入和一个提交按钮组成。

当我在输入框中输入10 后按下提交按钮时,我收到以下错误消息:

更新记录时出错:“字段列表”中的未知列“存款”

我的表格中没有这样的列,如下图所示:

Welcome to the Bank! <br><br>
<table bgcolor="orange" border="1" cellspacing="0" cellpadding="50">

<tr><td>
<form action="" method='post'><b>Amount of money you want to deposit:</b><br><br>
<input type='number'><input name ='deposit' type='submit' value='deposit'></td></form>

<?php include 'db.php';
if (isset($_POST['deposit']))
{
    $deposit = $_POST['deposit'];
    
   $sql = "UPDATE bank SET bank = bank + $deposit, cash_on_hand = cash_on_hand - $deposit WHERE id=1";
   
   if ($conn->query($sql) === TRUE)
   {
     echo "Record updated successfully"; /*Money Deposited successfully!*/
   }
   else
   {
     echo "Error updating record: " . $conn->error;
   }
   $conn-> close();
}
?>

【问题讨论】:

  • 请使用正确的代码 sn-p 更新您的问题。 (顺便说一句,您要插入数据的数据库表似乎没有所需的deposit 列。)
  • 警告:您对SQL Injections 持开放态度,应该使用参数化的prepared statements,而不是手动构建查询。它们由PDOMySQLi 提供。永远不要相信任何形式的输入!即使您的查询仅由受信任的用户执行,you are still in risk of corrupting your dataEscaping is not enough!
  • not bothering with security ...无关紧要,因为参数化解决的不仅仅是安全问题。不管怎样,如果你只是在玩,那就是学习如何使用它们的时候了,这样当你开始编写一个真正的应用程序时,你就已经知道该怎么做了。
  • 我现在明白了。即使您修复了 SQL 注入,您的主要问题仍然存在。您不知道 HTML 表单是如何工作的。这个&lt;input type='number'&gt;&lt;input name ='deposit' type='submit' value='deposit'&gt; 并没有按照你的想法去做。应该是&lt;input type='number' name ='deposit'&gt;&lt;input type='submit'&gt;
  • 不要使用 w3schools 来学习 PHP。他们有糟糕的教程。如果您想学习数据库交互,请使用我给您的链接。对于 HTML 表单,您可以使用 MDN developer.mozilla.org/en-US/docs/Learn/Forms

标签: php html sql forms


【解决方案1】:

改变这个:

<input type='number'><input name ='deposit' type='submit' value='deposit'>

到这里:

<input type='number' name="deposit"/><input name='submit' type='submit' value='deposit'/>

按照您现在的方式,它将“存款”一词发送到您的服务器,因为这是按钮的值(这是具有 name="deposit" 的字段。同时,您的数字字段没有根本没有名字,因此不会与表单一起提交。

这是您的错误的根本原因,因为您的 SQL(由于缺少适当的参数化查询)最终为

UPDATE bank SET bank = bank + deposit, cash_on_hand = cash_on_hand - deposit WHERE id=1

当然deposit,正如您所说的,不是您表格中的一列。

【讨论】:

    【解决方案2】:

    这段代码有两个问题。最大的一个是你有 SQL 注入。这就是您收到该错误消息的原因。

    永远不要将变量直接注入 SQL。这将破坏您的 SQL 并导致错误,甚至可能被攻击者滥用。当您通过按下按钮提交表单时,按钮的值将发送到 PHP。然后将该值注入 SQL。

    // The value comes from <input name ='deposit' type='submit' value='deposit'>
    $deposit = $_POST['deposit'];
    $sql = "UPDATE bank SET bank = bank + $deposit, cash_on_hand = cash_on_hand - $deposit WHERE id=1";
    // this becomes an invalid query
    $sql = "UPDATE bank SET bank = bank + deposit, cash_on_hand = cash_on_hand - deposit WHERE id=1";
    

    始终使用带有参数绑定的预处理语句。

    include 'db.php';
    if (isset($_POST['deposit'])) {
        $deposit = $_POST['deposit'];
    
        $stmt = $conn->prepare('UPDATE bank SET bank = bank + ?, cash_on_hand = cash_on_hand - ? WHERE id=1');
        $stmt->bind_param('ss', $deposit, $deposit); //bind the same variable twice for the two placeholders
        $stmt->execute();
    }
    

    您的第二个问题是 HTML 表单损坏。只有带有名称的&lt;input&gt;s 被提交到服务器。提交按钮不需要名称,但数字输入字段需要。修复后应如下所示:

    <form action="" method='post'>
        <b>Amount of money you want to deposit:</b>
        <br><br>
        <input type='number' name='deposit'>
        <input type='submit'>
    </form>
    

    如果您想了解有关 HTML 表单的更多信息,请联系guide on MDN

    【讨论】:

      猜你喜欢
      • 2020-02-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-10-13
      • 1970-01-01
      • 1970-01-01
      • 2016-10-05
      • 1970-01-01
      相关资源
      最近更新 更多