PHP(pdo)限制数据库中的更改以及html中的更改

时间:2018-12-20 10:27:42

标签: php phpmyadmin

我是php新手,遇到了一些我不知道如何解决的问题,我做了 应当更改数据库名称的HTML表单

<div class="form-group">
    <form action="name.php" method="post">
        <input type="text" class="form-control" name="name">
        <input type="submit" value="Submit" name="submit">
    </form>
</div>

HTML表单也已连接到PHP编辑脚本

<?php

$servername = "localhost";
$username = "root";
$password = "root";
$dbname = "tbl_product";

try {
    $conn = new PDO("mysql:host=$servername;dbname=$dbname", $username, $password);
    // set the PDO error mode to exception
    $conn->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);

    $sql ="UPDATE tbl_product SET name='$name' WHERE id = ID LIMIT 1";

    // Prepare statement
    $stmt = $conn->prepare($sql);

    // execute the query
    $stmt->execute();

    // echo a message to say the UPDATE succeeded
    echo $stmt->rowCount() . " records UPDATED successfully";
    header("Refresh:0; url=products.php");
    }
catch(PDOException $e)
    {
    echo $sql . "<br>" . $e->getMessage();
    }

$conn = null;
?>      

我运行的脚本不会更改数据库名称,如果更改,它将更改所有数据库名称。 目前,脚本运行正常,但什么也没发生。 我需要限制数据库中不断变化的数据,因此一次更改不会全部更改。

2 个答案:

答案 0 :(得分:0)

您必须在where子句中设置id,然后它将只更新与id匹配的一行,而无需设置LIMIT 1。

$sql ="UPDATE tbl_product SET name='$name' WHERE id = $id";

您可以从表单中的隐藏输入中获取ID。

<div class="form-group">
    <form action="name.php" method="post">
        <input type="hidden" class="form-control" name="id" value="<?php echo $id; ?>">
        <input type="text" class="form-control" name="name">
        <input type="submit" value="Submit" name="submit">
    </form>
</div>

答案 1 :(得分:0)

您的SQL查询似乎有问题。根据我在本地MySQL实例上运行的快速测试,条件WHERE id = ID似乎总是正确的(它的评估结果可能类似于1=1。因此,您的查询与{{1 }},因此它会更新所有没有LIMIT的记录。

此外,您没有适当地利用准备好的语句(这不是问题的一部分,但无论如何您都应该以正确的方式进行操作)。

UPDATE tbl_product SET name='$name' LIMIT 1

那样就不可能进行SQL注入,并且您可以在查询中正确使用id并可以删除LIMIT部分。

编辑1(重定向):

重定向和发送头是一个完全不同的主题。基本上,您会像这样进行操作(有关更多详细信息,另请参见this

$id = 1; // assign the id of the record you want to change
$name = "the new name";
$sql ="UPDATE tbl_product SET name = :name WHERE id = :id";

// Prepare statement
$stmt = $conn->prepare($sql);

// execute the query and bind values to placeholders in the query
$stmt->execute([
    ':name' => $name,
    ':id' => $id
]);

此外,您不能在header('Location: products.php'); exit; 之前使用echo。它将引发错误。有关更多信息,请参见here

编辑2(更改随机记录):

更改随机记录似乎是一个奇怪的应用程序,但是使用以下查询可能会起作用:

header

由于您的查询中不再包含:id参数,因此您还需要从UPDATE tbl_product SET name = :name ORDER BY RAND() LIMIT 1 调用中删除:id部分。