在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";
}