无法通过php更新sql表

Posted

技术标签:

【中文标题】无法通过php更新sql表【英文标题】:Unable to update sql table via php 【发布时间】:2019-04-23 18:10:20 【问题描述】:

这是我用来尝试更新记录的代码。我没有看到任何问题,但它不会引发错误并表示它已成功运行。我已经尝试了其他几种相同的方法,它只是不更新​​ MSSQL 表中的行。数据库/表在我运行 Windows 10 和 IIS 的机器上是本地的(我知道!!)。

<?php

/**
 * Use an html form to edit an entry in the
 * users table.
 *
 */

 require "C:\inetpub\wwwroot\Remediation\config.php";
 require "C:\inetpub\wwwroot\Remediation\common.php";

 if (isset($_POST['submit'])) 
   if (!hash_equals($_SESSION['csrf'], $_POST['csrf'])) die();

   try 
     $connection = new PDO($dsn, $username, $password);

     $user =[
       "id"        => $_POST['id'],
       "firstname" => $_POST['firstname'],
       "lastname"  => $_POST['lastname'],
       "email"     => $_POST['email'],
       "age"       => $_POST['age'],
       "location"  => $_POST['location'],
       "date"      => $_POST['date']
     ];

     $sql = "UPDATE users
             SET id = :id,
               firstname = :firstname,
               lastname = :lastname,
               email = :email,
               age = :age,
               location = :location,
               date = :date
             WHERE id = :id";

   $statement = $connection->prepare($sql);
   $statement->execute($user);
    catch(PDOException $error) 
       echo $sql . "<br>" . $error->getMessage();
   
 

 if (isset($_GET['id'])) 
   try 
     $connection = new PDO($dsn, $username, $password);
     $id = $_GET['id'];
     $sql = "SELECT * FROM users WHERE id = :id";
     $statement = $connection->prepare($sql);
     $statement->bindValue(':id', $id);
     $statement->execute();

     $user = $statement->fetch(PDO::FETCH_ASSOC);
    catch(PDOException $error) 
       echo $sql . "<br>" . $error->getMessage();
   
  else 
     echo "Something went wrong!";
     exit;
 
 ?>    

 <?php if (isset($_POST['submit']) && $statement) : ?>
    <blockquote><?php echo escape($_POST['firstname']); ?> successfully 
 updated.</blockquote>
 <?php endif; ?>

 <h2>Edit a user</h2>

 <form method="post">
     <input name="csrf" type="hidden" value="<?php echo 
   escape($_SESSION['csrf']); ?>">
     <?php foreach ($user as $key => $value) : ?>
       <label for="<?php echo $key; ?>"><?php echo ucfirst($key); ?></label>
        <input type="text" name="<?php echo $key; ?>" id="<?php echo $key; ?>" value="<?php echo escape($value); ?>" <?php echo ($key === 'id' ? 'readonly' : null); ?>>
     <?php endforeach; ?>
     <input type="submit" name="submit" value="Submit">
 </form>

我到底哪里错了。我可以很好地连接、删除和创建。我需要调整 $USER 或查询吗?

【问题讨论】:

如果您使用 id 来查找记录,则不应更新它。从您的 Update Set 语句中删除 id = :id, 并查看是否有效。 【参考方案1】:

您是否直接在 MSSQL 管理工作室中尝试过该查询?

之后,如果您发现它工作正常,请尝试“回显”您的 POST 变量以查看您是否正确获取它们。

【讨论】:

会的,查询在 SSMS 中针对表正常工作。 所以不要不明白为什么它以这种方式工作,而不是在你的代码中。【参考方案2】:

我犯了一个新手错误,我试图在 MSSQL 中更新一个 ID 和时间戳列,这是不允许的。我把我的代码改成了这个,它工作得很好:

   $user =[
     "id"        => $_POST['id'],
     "firstname" => $_POST['firstname'],
     "lastname"  => $_POST['lastname'],
     "email"     => $_POST['email'],
     "age"       => $_POST['age'],
     "location"  => $_POST['location'],
           ];

   $sql = "UPDATE users
           SET firstname = :firstname,
             lastname = :lastname,
             email = :email,
             age = :age,
            location = :location
           WHERE id = :id";

【讨论】:

【参考方案3】:

我没有看到任何INSERT。相反,您只使用UPDATE,这意味着仅修改现有记录。这是你想要的吗?

 $sql = "UPDATE users
         SET id = :id,
           firstname = :firstname,
           lastname = :lastname,
           email = :email,
           age = :age,
           location = :location,
           date = :date
         WHERE id = :id";

在这里,您选择带有id = :id 的(所有)记录,在这里SET id = :id 您将id 设置为已设置的值。不会破坏某些东西,但它暗示您的逻辑中的某些东西是错误的。

顺便说一句,您允许每个客户更改记录。不是 SQL 注入,但很可能非常糟糕。

【讨论】:

是的,记录已经在表中,并通过 ID 标识。这只是一个概念证明,我会在我开始工作后确保安全。

以上是关于无法通过php更新sql表的主要内容,如果未能解决你的问题,请参考以下文章

PHP在更新SQL表之前检查文件是不是存在

无法通过带有 TableAdapter 的视图更新 SQL

通过比较两个表来更新 SQL 查询

只允许通过 sql server、oracle 和 postgres 中的 jdbc 更新表

在一个SQL查询中更新多个表

无法使用 PHP 和 PDO 更新表