【问题标题】:Trying to update mysql using a html form and php尝试使用 html 表单和 php 更新 mysql
【发布时间】:2013-03-21 13:53:48
【问题描述】:

...这通常不会太难,但由于某种原因,我无法让它工作。我可能遗漏了什么或打错了字,我不知道,但不管是什么,我都找不到。

include('connect-db.php');

mysql_connect("$host", "$username", "$password")or die("cannot connect");
mysql_select_db("$db_name")or die("cannot select DB");


$query = "SELECT * FROM articles ORDER BY orderid";
$result = mysql_query($query) or die(mysql_error());

$count = mysql_num_rows($result);
?>
<div class="content-holder">
    <form action="" method="post">
        <table border='1' cellpadding='10' id='ViewTable'>
            <tr>
            <th>Volgorde</th>
            <th>Titel</th>
            </tr>
            <?php
            while($row = mysql_fetch_array($result))
            {
                $orderid = $row['orderid'];
                $title = $row['title'];
            ?>
            <tr>
                <td><input type="textbox" class="TextAreaTitle" name="order" value="<?=$orderid?>"></td>
                <td><?=$title?></td>
            </tr>
            <?php
            }
            ?>
        </table>
        <input type="submit" name="submit" class="submitlink" Value="Verzenden">
    </form>
</div>

<?php
if(isset($_POST['submit']))
{
    mysql_query("UPDATE articles SET orderid=$orderid  WHERE title=$title");
    echo "Updated!";
}
?>

为了确定,我只是将整个代码粘贴到这里。在网页上,您基本上会看到一个带有列 orderid 和标题的表格,以及它们各自的所有行。 orderid 可以更改,因为它们是一个文本框。我想要实现的是一个(或多个)orderid 被更改,然后您单击按钮,然后我希望 orderid 在我的数据库中相应地更改。

提前感谢您的帮助。有任何问题欢迎提问。

编辑:我完全忘了提及这一点,但是当我点击按钮时会发生什么,它返回回声说“更新!”但数据库实际上并没有更新。

【问题讨论】:

  • 你为什么不在你的脚本中做任何成功/错误控制?评估 mysql_query 的返回值,并使用 mysql_error。它很可能会在 where 子句中的标题之前提醒您一个错误,因为——假设它是一个文本值——你在它周围缺少单引号。第二点,你不应该再使用旧的 mysql 扩展,如果可能的话,应该使用 mysqli/pdo。而且您必须告知自己有关 SQL 注入的信息以及如何应对它。
  • 我最近查了一些关于 SQL 注入的知识,只是还没有在这个特定的脚本中实现它。暂时不用担心,以后我一定会这样做的。这是目前的主要问题。那么,我现在会拼命尝试成功/错误控制。 :p
  • 顺便说一句,submit 不是一个好的元素名称。这将导致进一步的问题。
  • 你犯了最大的错误-mysql_connect ( "$host" , "$username" , "$password" )。不要使用mysql_ 函数,使用 PDO。

标签: php html mysql sql-update


【解决方案1】:
mysql_query("UPDATE articles SET orderid=$orderid  WHERE title=$title");

这需要在你的表单中引用&lt;input&gt;字段,像这样:

$orderid = $_POST['order'];
$title = $_POST['title'];
mysql_query("UPDATE articles SET orderid=$orderid  WHERE title=$title");

您永远不会从表单返回title 值。您的表单中需要&lt;input name="title" /&gt;,所以添加它。否则,它将始终使用您的 while 循环中的最后一个值。

如果您从 $_POST 读取数据,则需要添加输入验证。否则你很容易受到攻击。

编辑:我修改了一下。

include('connect-db.php');

mysql_connect("$host", "$username", "$password")or die("cannot connect");
mysql_select_db("$db_name")or die("cannot select DB");


$query = "SELECT * FROM articles ORDER BY orderid";
$result = mysql_query($query) or die(mysql_error());

$count = mysql_num_rows($result);
?>
<div class="content-holder">
    <form action="" method="post">
        <table border='1' cellpadding='10' id='ViewTable'>
            <tr>
            <th>Volgorde</th>
            <th>Titel</th>
            </tr>
            <?php
            while($row = mysql_fetch_array($result))
            {
                $orderid = $row['orderid'];
                $title = $row['title'];
            ?>
            <tr>
                <td><input type="textbox" class="TextAreaTitle" name="order[]" value="<?=$orderid?>"><input type="hidden" name="title[]" value="<?=$title?>"></td>
                <td><?=$title?></td>
            </tr>
            <?php
            }
            ?>
        </table>
        <input type="submit" name="submit" class="submitlink" Value="Verzenden">
    </form>
</div>

<?php
if(isset($_POST['submit']))
{
    for ($i=count($_POST['title']); $i--;) {
        $orderid = $_POST['order'][$i];
        $title = $_POST['title'][$i];
        mysql_query("UPDATE articles SET orderid=$orderid  WHERE title=$title");
    }
    echo "Updated!";
}
?>

【讨论】:

  • 啊好的,我明白了。谢谢,我试试看。
  • 我已经更新了我的答案。如果您希望标题为只读,请使用&lt;input type="hidden" name="title" value="&lt;?=$title?&gt;" /&gt;&lt;?=$title?&gt;
  • 它仍然显示“更新!”的回声,但数据库实际上并没有更新。问题可能出在我的包含...?
  • 不,不是包含。更新时不要使用mysql_query,而是将其替换为echo,看看会发生什么。
  • WHERE title=$title 应该有引号。 WHERE title='$title'
【解决方案2】:

如果你使用name="order[]" 它将返回数组,您必须使用 foreach 将数组转换为字符串

【讨论】:

    【解决方案3】:

    有时它会产生这些类型的错误。它在插入数据或从数据库检索时有不同的语法,所以应该尝试所有解决方案

    mysql_query("更新文章 SET orderid='".$orderid ."' WHERE title='".$title ."'"); echo "更新了!";

    【讨论】:

      【解决方案4】:

      我希望它可见

      mysql_query("更新文章 SET orderid='".$orderid."'WHERE title='".$title."'");回声“更新!”;

      【讨论】:

      • 我用这个结果是一样的。
      猜你喜欢
      • 2013-09-30
      • 1970-01-01
      • 1970-01-01
      • 2014-01-15
      • 1970-01-01
      • 1970-01-01
      • 2014-03-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多