【问题标题】:PHP - Update and Set aren't updating the database?PHP - 更新和设置不更新数据库?
【发布时间】:2013-02-07 21:14:51
【问题描述】:

已解决

在问这个之前我已经搜索过,但什么也没找到,所以我会在这里为将来的任何人写信。但是要修复它,我所要做的就是确保 $username 指向某个东西,我已经在 login.php 脚本中声明了它,但由于某种原因这没有找到它,所以设置 $username=$_SESSION['myusername '];解决了问题。


简而言之,我有一个名为“状态”的列,它是文本,140 个字符。这只是一个乱搞php的测试,所以我可以习惯它。现在起初它正在更新数据库但为空,我意识到我没有将帖子数据设置为 $status 并且在我这样做之后,我更新了数据库两次然后它就停止了工作......页面显示没有错误,但值与我上次更改时的值相同(uuu)。

我有一个表格:

    <form action="status-update.php" method="post">
    <p>
  <input name="status" type="text" id="status" value="<?PHP echo $query_row[status]; ?>">
  <input type="submit" name="submit" value="Update">
    </p>
  </form>

然后当按下按钮时,它会将您带到这个脚本:

<?php
SESSION_START();

//WAMP Login Details
$host = "localhost";
$username="root";
$password="";
$db_name="database";
$tbl_name="members";
mysql_connect("$host", "$username", "$password")or die("cannot connect"); 
mysql_select_db("$db_name")or die("Database doesn't exist.");

//Set $status to the post
$status=$_POST['status']; 

//This grabs the data from the form on the settings page and updates
$sql="UPDATE $tbl_name SET status='$status' WHERE username='$username'";
$result=mysql_query($sql);

//if true then redirect else echo error
if($result){
header("location:me.php");
}
else {
echo "ERROR";
}
?>

我试图让它再次将值设置为 null,但我什至不能再这样做了,这很奇怪,因为我是一个菜鸟,我不知所措。

【问题讨论】:

  • value="&lt;?PHP echo $query_row[status]; ?&gt;"&gt; -- XSS 攻击向量。
  • UPDATE $tbl_name SET status='$status' -- SQL 注入攻击向量。
  • 我已经解决了,我把 $username=$_SESSION['myusername'];在 WAMP 登录详细信息之后,它现在正在工作。
  • 您尝试使用用户名 root 更新用户是否正确?因为您正在尝试更新用于连接数据库的用户名。尝试回显 $sql 变量并禁用标头重定向以查看正在处理的 sql
  • 首先打印整个 print_r($_POST),$_POST['status'] 里面有什么,然后尝试像这样在 mysql_query() 中添加 die(mysql_error()):$result =mysql_query($sql) 或死 (mysql_error());

标签: php mysql null set


【解决方案1】:

您的代码有几个问题。 首先,它使用mysql_ API,而人们总是说这个 API 已经结束。从 PHP 5.5 开始,它甚至已被弃用。所以尝试使用mysqli或PDO。

那么你必须小心。您的 sql 查询容易受到注入的影响,因为您没有正确转义变量。

那么尝试使用 mysql_query 调用旁边的知名 or die(mysql_error());next 来调试您的代码怎么样?

【讨论】:

    【解决方案2】:

    尝试使用 PDO,它更不容易受到错误和攻击。这是使用 PDO 对您的脚本进行的基本更新:

    <?php
    
    // set PDO dsn by socket
    $dsn = 'dbname=DATABASE_NAME;unix_socket=/var/lib/mysql/mysql.sock';
    
    // or by tcp
    $dsn2 = 'dbname=DATABASE_NAME;host=localhost;port=3306';
    
    // create connection using sockets change $dsn to $dsn2 to use tcp if using windows or external host
    $conn = new PDO('mysql:' . $dsn, USERNAME, PASSWORD);
    
    // prepare query
    $pdo = $conn->prepare("UPDATE TABLE_NAME SET status = :status WHERE username = :username");
    
    // set up parameters
    $params = ['username' => $_POST['username'], 'status' => $_POST['status']];
    
    // loop through the paramaters to determine the type
    foreach ($params as $key => $value) {
    
        switch ($value) {
    
            case is_int($value):
                $param = PDO::PARAM_INT;
                break;
    
            case is_bool($value):
                $param = PDO::PARAM_BOOL;
                break;
    
            case is_null($value):
                $param = PDO::PARAM_NULL;
                break;
    
            default:
                $param = PDO::PARAM_STR;
                break;
        }
    
        // bind paramter to query
        $pdo->bindValue(":$key", $value, $param);
    }
    
    // execute the query
    $result = $pdo->execute($params);
    
    // if true then redirect else echo error
    if ($result) {
    
        header("location:me.php");
    
    } else {
    
        echo "ERROR";
    
    }
    

    您也不需要以?&gt; 结尾,不要使用它。如果您在结束标记后有空格,它将避免您遇到错误。

    【讨论】:

      【解决方案3】:

      使用 session_start();而不是 SESSION_START();

      请确认您的表中是否有一个名为root用户名

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2018-03-24
        • 1970-01-01
        • 2013-09-17
        • 1970-01-01
        • 1970-01-01
        • 2014-01-26
        • 2018-07-13
        相关资源
        最近更新 更多