【问题标题】:Having trouble creating a safe way for users to update their data无法为用户创建安全的数据更新方式
【发布时间】:2016-04-25 17:09:18
【问题描述】:

我正在为用户提供一种方法来编辑他们的数据。我的第一种方法奏效了,但后来我想起它非常不安全,我永远不应该将数据直接插入数据库;至少那是我被告知的。我尝试通过执行 VALUES (?,?,?,?,?) 来使其更安全,这样数据就不会直接进入,这在我的注册页面中似乎工作正常(如果你愿意,我可以包括在内)。

首先,这是我的原始更新数据页面,它运行良好,但没有使用 (?,?,?,?,?) 方法:

if(isset($_POST['submit'])) { 
    $userid=$_SESSION['userid'];
    $skype=$_POST['skype'];
    $email=$_POST['email'];
    $region=$_POST['region'];
    $crank=$_POST['league1'];
    $drank=$_POST['league2'];
        if(empty($skype) || empty($email) || empty($crank) || empty($drank) || empty($region))
        {
            echo "Cannot leave any field blank";
        }       
        else
        {   
            $host= "localhost";
            $dbname = "boost";
            $user = "root";
            $pwd = "";
            $port=3306; 

            try
            {
                $mysqli= new mysqli($host, $user, $pwd, $dbname,$port);
                if ($mysqli->connect_error) {
                die('Connect Error (' . $mysqli->connect_errno . ') ' . $mysqli->connect_error);
            }
            $query = "UPDATE usertable SET SkypeID = '$skype', Email = '$email', Region = '$region', CRank = '$crank', DRank = '$drank' WHERE UserID = '$userid'";
            $stmt = $mysqli->prepare($query);
            $stmt->bind_param("sssss",$skype,$email,$region,$crank,$drank); 
            $stmt->execute();
            $iLastInsertId=$mysqli->insert_id; 
            header('Location: http://localhost/Boost/account.php');
            $stmt->close(); 
            $mysqli->close();
        } catch (mysqli_sql_exception $e) { 
        throw $e; 
    } 
  }
}

这是我试图使其更安全的方法,但这似乎不起作用。具体来说,$query = "UPDATE usertable SET usertable(SkypeID,Email,Region,CRank,DRank) VALUES (?,?,?,?,?) WHERE UserID = '$userid'"; 似乎是问题所在,尽管语法对我来说看起来不错

if(isset($_POST['submit'])) { 
    $userid=$_SESSION['userid'];
    $skype=$_POST['skype'];
    $email=$_POST['email'];
    $region=$_POST['region'];
    $crank=$_POST['league1'];
    $drank=$_POST['league2'];
        if(empty($skype) || empty($email) || empty($crank) || empty($drank) || empty($region))
        {
            echo "Cannot leave any field blank";
        }       
        else
        {   
            $host= "localhost";
            $dbname = "boost";
            $user = "root";
            $pwd = "";
            $port=3306; 

            try
            {
                $mysqli= new mysqli($host, $user, $pwd, $dbname,$port);
                if ($mysqli->connect_error) {
                die('Connect Error (' . $mysqli->connect_errno . ') ' . $mysqli->connect_error);
            }
            $query = "UPDATE usertable SET usertable(SkypeID,Email,Region,CRank,DRank) VALUES (?,?,?,?,?) WHERE UserID = '$userid'";
            $stmt = $mysqli->prepare($query);
            $stmt->bind_param("sssss",$skype,$email,$region,$crank,$drank); 
            $stmt->execute();
            $iLastInsertId=$mysqli->insert_id; 
            header('Location: http://localhost/Boost/account.php');
            $stmt->close(); 
            $mysqli->close();
        } catch (mysqli_sql_exception $e) { 
        throw $e; 
    } 
  }
}

所以我不确定问题是什么。根据我使用 PHP 的经验,语法应该没问题,但我一定遗漏了一些东西。

【问题讨论】:

  • 您使用的是什么数据库? SQL 更新值语法是不寻常的。你确定它有效吗?为什么要改变以前更传统的语法?
  • 试试UPDATE usertable SET SkypeID = ?,Email = ?,Region = ?,CRank = ?,DRank = ? WHERE UserID = '$userid'
  • 您是否收到任何错误消息?通常这些有助于理解错误。
  • @Matt 谢谢,成功了!

标签: php database mysqli login


【解决方案1】:

其实很简单,你从

$query = "UPDATE usertable SET SkypeID = '$skype', Email = '$email', Region = '$region', CRank = '$crank', DRank = '$drank' WHERE UserID = '$userid'";

$query = "UPDATE usertable SET usertable(SkypeID,Email,Region,CRank,DRank) VALUES (?,?,?,?,?) WHERE UserID = '$userid'";

看来您在重写时混淆了 INSERT 语句与 UPDATE 语句,因此您只需将旧语句与新样式一起使用...

$query = "UPDATE usertable SET SkypeID = ?, Email = ?, Region = ?, CRank = ?, DRank = ? WHERE UserID = $userid";

【讨论】:

  • 哦,你说得对。我以为他们会是一样的。我把它改成了那个。但是,当我更改代码时出现错误:未捕获的异常 'mysqli_sql_exception' 带有消息'重复条目'?对于键“电子邮件”
  • 没关系,@Matt 的代码有效。奇怪的是,我猜 (') 不应该在那里?我什至不知道了
  • 更正没有引号,我已经编辑了我的答案以反映更新的值(我很抱歉从您的原始脚本中复制和粘贴工作)。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-10-13
  • 1970-01-01
  • 2020-12-08
  • 2020-12-25
  • 2019-11-10
  • 2020-12-24
  • 1970-01-01
相关资源
最近更新 更多