在php和mysqli中仅获取一个字段

在php和mysqli中仅获取一个字段,php,mysql,database,mysqli,Php,Mysql,Database,Mysqli,我有以下代码 if (isset($_POST['change'])) { $current = mysqli_real_escape_string($con, $_POST['current']); $password = mysqli_real_escape_string($con, $_POST['password']); $cpassword = mysqli_real_escape_string($con, $_POST['cpassword']);

我有以下代码

if (isset($_POST['change'])) {
    $current = mysqli_real_escape_string($con, $_POST['current']);
    $password = mysqli_real_escape_string($con, $_POST['password']);
    $cpassword = mysqli_real_escape_string($con, $_POST['cpassword']);

    if(strlen($password) < 6) {
        $error = true;
        $password_error = "Password must be minimum of 6 characters";
    }
    if($password != $cpassword) {
        $error = true;
        $cpassword_error = "Password and Confirm Password doesn't match";
    }

    if(mysqli_fetch_field(mysqli_query($con, "SELECT password FROM users WHERE id = '" . $_SESSION['usr_id'] . "' LIMIT 1")) != md5($current)) {
        $error = true;
        $confirm_error = "Your actual password is not correct";
    }
}
这给了我一个错误

PHP可捕获致命错误:在第27行的/../password.PHP中,类stdClass的对象无法转换为字符串

我试过了

mysql\u结果(mysqli\u查询($con,“从id=”的用户中选择密码”。$\u会话['usr\u id']。“'LIMIT 1”),0)

但它不起作用,它给了我

PHP致命错误:未捕获错误:在/../password.PHP:27中调用未定义的函数mysql\u result()


我不想使用
mysqli\u fetch\u array()
while
循环。我已经搜索了一个函数或类似的东西,我发现了一些东西,但没有任何东西对我有用。

我认为这不是最好的解决方案,但根据您的要求,您可能希望使用mysqli\u fetch\u assoc

$result = mysqli_query($con, "SELECT password FROM users WHERE id = '" . $_SESSION['usr_id'] . "' LIMIT 1");
$row = mysqli_fetch_assoc($result);

 if( $row['password']!= md5($current)) {
        $error = true;
        $confirm_error = "Your actual password is not correct";
 }
在下面的评论中提到,您应该使用参数化查询。对于用户密码,请使用PHP5>=5.5.0、PHP7中的密码哈希库或内置函数

要参数化当前查询并避免可能的sql注入攻击,请尝试以下代码

$mysqliConnection = new mysqli("localhost", "my_user", "my_password", "my_dbname");

/* check connection */
if ($mysqliConnection->connect_errno) {
    echo "Failed to connect to MySQL: (" . $mysqliConnection->connect_errno . ") " . $mysqliConnection->connect_error;
}

$sql = "SELECT password FROM users WHERE id = ? LIMIT 1";
$stmt = $mysqliConnection->prepare($sql);
$stmt->bind_param("i", $_SESSION['usr_id']);
$stmt->execute();
$stmt->bind_result($password);
$stmt->store_result();
$row = $stmt->fetch()

现在,您可以使用$password变量来检查所使用的密码哈希。我希望这有帮助

您需要阅读以下文档:

返回结果集的一列作为对象的定义。重复调用此函数以检索有关结果集中所有列的信息

此函数不返回结果集中某一列中的值,而是返回关于该列的元数据。如列名、表名、数据类型、最大长度等

如果捕获字段并将其转储,则会看到:

$passhash = mysqli_fetch_field(mysqli_query($con, "SELECT password FROM users WHERE id = '" . $usr_id . "' LIMIT 1"));
print_r($passhash);
输出:

stdClass Object
(
    [name] => password
    [orgname] => password
    [table] => users
    [orgtable] => users
    [def] => 
    [db] => test
    [catalog] => def
    [max_length] => 32
    [length] => 65535    <-- I used TEXT for the password column 
    [charsetnr] => 8
    [flags] => 16
    [type] => 252
    [decimals] => 0
)
您的其他错误:

调用未定义的函数mysql_result()

该函数已弃用,并已在PHP7中删除。无论如何,它不会与mysqli_query()一起工作,因为它是另一个API的一部分,而且这两个API不会混合使用


(注意mysqli,不是mysql)是资源类的名称,不是函数。

mysqli\u real\u escape\u字符串($con,$\u POST['password'])
你知道这会适得其反。它可能与
mysqli\u fetch\u字段无关。转储
$\u会话['usr\u id']
,并分离mysqli\u查询和mysqli\u fetch\u字段语句。当然,mysql\u result不会工作,它不是mysqli函数。
我不想使用mysqli\u fetch\u array()和while循环。
。。。。为什么?你的代码使用起来不安全;尤其是您正在使用的密码功能
md5($current)
。不要把这个放在网上。我把你的代码失败称为“伪装中的祝福”。在散列之前,请确保你对它们进行了清理或使用了任何其他清理机制。这样做会更改密码,并导致不必要的额外编码。看起来我误解了这个问题,没有任何理由就被否决了。如果你在没有准备好的陈述的情况下发布了一个答案,你愿意解释一下为什么我可以改进吗。另外,你真的不应该使用PHP来处理密码安全问题。在散列之前,请确保对它们进行了清理或使用了任何其他清理机制。这样做会更改密码并导致不必要的额外编码。任何拒绝投票的人都有理由,他们可能不会选择发表评论。评论+否决票的问题已经在Meta上讨论过了。许多人只是选择用DV继续前进。许多人提供建议。许多人试图为新手开辟道路。教某人继续使用过时的方法和不安全的做法现在更有可能让你落选,因为许多人已经变得非常了解教真正的最佳做法。嗨@JayBlanchard我理解你的意思,对我来说,最好给落选提些意见,这样答案会更好。我非常专注于帮助op得到他想要的东西。我应该提到,这不是最好的答案,避免非标准编码。谢谢你让我知道你会更新我的答案。
stdClass Object
(
    [name] => password
    [orgname] => password
    [table] => users
    [orgtable] => users
    [def] => 
    [db] => test
    [catalog] => def
    [max_length] => 32
    [length] => 65535    <-- I used TEXT for the password column 
    [charsetnr] => 8
    [flags] => 16
    [type] => 252
    [decimals] => 0
)
$sql = "SELECT password FROM users WHERE id = ? LIMIT 1";
$stmt = mysqli_prepare($con, $sql);
$stmt->bind_param($stmt, "i", $_SESSION['usr_id']);
$stmt->execute();
$result = $stmt->get_result();
$match = false;
while ($row = $result->fetch_assoc()) {
    if ($row['password'] == md5($current) {
        $match = true;
    }
}
if (!$match) {
    $error = true;
    $confirm_error = "Your actual password is not correct";
}