“更新MySQL时出现问题”;用户名";在表中使用PHP

“更新MySQL时出现问题”;用户名";在表中使用PHP,php,mysql,sql-update,Php,Mysql,Sql Update,我可能没有使用最好的方法来创建用户系统,但它不需要花哨。我也知道我不是最有条理的 登录和一切正常,但我在更新凭据时遇到问题 例如,我允许用户更改他们的用户名。我有“更改用户名”(不是那个名字)表单要提交到update-Username.php 在另一个页面的函数“cleanString”中,我已经有了mysql\u real\u escape\u字符串。My textarea submitting中已经有旧文本,因此您可以更改并查看它。 $user_id = ""; if(isset($_POS

我可能没有使用最好的方法来创建用户系统,但它不需要花哨。我也知道我不是最有条理的

登录和一切正常,但我在更新凭据时遇到问题

例如,我允许用户更改他们的用户名。我有“更改用户名”(不是那个名字)表单要提交到update-Username.php

在另一个页面的函数“cleanString”中,我已经有了mysql\u real\u escape\u字符串。My textarea submitting中已经有旧文本,因此您可以更改并查看它。

$user_id = "";
if(isset($_POST['id']))
{
    $user_id = $_POST['id'];    
}

$query = "SELECT username,email,display_name,access,password FROM users WHERE user_id='$user_id'";
$results = mysql_query($query);

if(!$results) { //Check to see if query failed
die(mysql_error());
}

$resultsfetch=mysql_fetch_array($results);
$username = $resultsfetch['username'];
$usernamenew = $_POST['usernameinput'];
if(isset($_POST['usernameinput'])) {
    $usernamenew = cleanString($_POST['usernameinput']);
}

if($usernamenew !=$username){
    $submit = "UPDATE users SET username = '$usernamenew' WHERE user_id = '$user_id'";
    mysql_query($submit);
    if(!$submit) { //Check to see if query failed
        die(mysql_error());
    }
}

可能是我错过了一些愚蠢或简单的事情,或者是一些非常巨大的事情。主要是因为我心不在焉。

如果页面被加载,
$user\u id
为空
,因此注意事项将被更新!通过发送
$\u POST['id']
确保此页面已加载。如果这些是正确的,请检查此项

$submit = sprintf("UPDATE users SET username = '%s' WHERE user_id = %d",mysql_real_escape_string($usernamenew),mysql_real_escape_string($user_id));

“数据库用户是否有更新表的权限?”

我已重新排列了您的代码。在我更改的地方添加了注释。试试这个

if (isset($_POST['id'], $_POST['usernameinput'])) { // Check if both POST id and usernameinput is available
    $user_id = (int)$_POST['id']; //assuming this is an integer

    $query = "SELECT username,email,display_name,access,password FROM users WHERE user_id='$user_id'";
    $results = mysql_query($query);

    if (!$results) {//Check to see if query failed
        die(mysql_error());
    }
    if (mysql_num_rows($result) > 0) { //verify if there is really a user with such id
        $resultsfetch = mysql_fetch_array($results);
        $username = $resultsfetch['username'];
        $usernamenew = cleanString($_POST['usernameinput']);

        if ($usernamenew != $username) {
            $submit = "UPDATE users SET username = '$usernamenew' WHERE user_id = '$user_id'";
            if (!mysql_query($submit)) {//Check to see if query failed
                die(mysql_error());
            }
        }

    }else{
        die("no such user with userid=$user_id");
    }
}

警告:
mysql\ucode>函数从PHP 5.5.0开始就不推荐使用,将来将被删除。相反,应该使用or扩展名。

所以,我想我找到了答案。这是我的代码进入下一页的问题

我看到的代码只会破坏页面,不管是缺少整数还是其他什么。我不是100%肯定

谢谢大家的帮助,但现在我知道了

编辑:
我忘了在我的隐藏字段中回显
用户id

用户id从哪里来?为什么在分配后要检查是否设置了POST?
cleanString()
做什么?如果
$user\u id
是int,则不应引用它。您的最后一次检查(
如果(!$submit)
)将永远无法工作,因为
$submit
是字符串,因此它始终处于设置状态;您可能需要检查mysql查询($submit)
的返回。不管怎样,会发生什么?错误,数据未更改,…?不是问题的解决方案,而是
$usernamew=$\u POST['usernameinput']
应该是
$usernamenew=$resultsfetch['username']。或者,如果未设置
$\u POST['usernameinput']
,您将收到警告。@bansi同意可能出现的错误,但我认为$usernamennew应该是发布的用户名,以便与DBI中忘记包含变量来源的旧用户名进行比较。我已经更新了帖子。页面照常继续,不更新数据库。如果使用此选项,应使用
mysql\u real\u escape\u string
。想象一下
$\u POST['id']=“1”或'1'=“1”
。现在,您的SQL是
updateusers SET username='$usernamenew',其中user\u id=''或'1'='1'
。并且所有用户名都更改为相同。或者可以将typecast转换为int
$user\u id=(int)$\u POST['id']
在int上使用
mysql\u real\u scape\u STRING()
?为什么不改为键入呢?你不应该引用ints…而且,正如我在另一条评论中所说,
$submit
是查询,是字符串,所以
如果(!$submit)
没有意义。您应该检查
是否(!mysql_query($submit))
@DamienPirsy感谢您指出错误,修复了它。此外,在查询中引用INT(尝试将编辑保持在最小行数)不是必需的,但有效。因此,发布正确的答案并接受它,或者完全删除该问题,因为答案与此无关。你写的这篇文章不是答案。