当前位置: 首页 > 知识库问答 >
问题:

mysqli查询结果为空

谯振国
2023-03-14

我正在制作一个php注册脚本,注册工作正常,所有内容都已成功输入数据库,激活电子邮件工作正常,但每当我使用mysqli查询来选择或更新信息时,它都不起作用。

例如,当我使用我知道数据库中存在的帐户登录时,它告诉我用户名不存在,当单击电子邮件中的激活链接时,查询无法以相同的方式更新数据库。

我相信这是一个非常简单的错误,我忽略了我的新手,但我找了几个小时后找不到合适的答案。我真的不确定问题出在哪里。

使活动php

require "/functions.php";

if (isset($_GET['user'])) {
  $user = $_GET['user'];
}
if (isset($_GET['key']) && (strlen($_GET['key']) == 32)){
  $key = $_GET['key'];
}

if (isset($user) && isset($key)) {
$sql = <<<SQL
  UPDATE users
  SET validation = NULL
  WHERE username='$user'
  AND validation='$key',
  user_group = 'member'
SQL;

$count = $db->affected_rows;

if ($count == 1)
{
    echo '<div>Your account is now active. You may now <a href="login.php">Log in</a></div>';

} else {
 echo '<div>Oops! Your account could not be activated. Please recheck the    link or contact the system administrator.</div>';

}
ob_end_flush();

} else {
  echo '<div>Error Occured .</div>';
}

?>

登录。php

// Globals & error variable
require "/functions.php";

    session_start();
    $error = "";

if (isset( $_POST['Submit'])) {
    if (empty($_POST['username']) || empty($_POST['password'])) {
        $error = "Please fill in all fields!";
}
else {

    $username=$_POST['username']; 
    $password=$_POST['password']; 

    // Injection-protection!
    $username = stripslashes($username);
    $password = stripslashes($password);
    $username = mysqli_real_escape_string($db, $username);
    $password = mysqli_real_escape_string($db, $password);

$sql = <<<SQL
    SELECT *
    FROM `users`
    WHERE `username`='$username'
SQL;

    $result = $db->query($sql);
    $count->num_rows;

    if($count==1){
        while ($row = mysqli_fetch_array($result)) {
            $hash = $row['password'];
            $ug = $row['user_group'];
        }

        salt();

        $options=['salt'=>$bcrypt_salt, 'cost'=>12];
        $password=$argv[1];

        if (crypt($password,$hash) == $hash) {
            $_SESSION['login_user']= $username;
            $_SESSION['user_group']= $ug;
            header("location:index.php");
        }
        else {
            $error = "Username or password is invalid!";
        }
    }
    else {
        $error = "That username doesn't exist!";
    }
    ob_end_flush();
    }
}

功能。php

 // db connect
 $db = new mysqli('HOST', 'USER', 'PASS', 'DB');

if($db->connect_errno > 0){
   die('Unable to connect to database [' . $db->connect_error . ']');
}

另一方面,请随意提出你们看到的任何明显的不良做法。我是新来的,但我不想养成坏习惯!

共有1个答案

卢元龙
2023-03-14

除了注释中已经声明的你没有执行那个查询(在通读之前,我确实发现了),现在你执行了,除了注释中的额外逗号之外,还有这个代码块,你说它已经被删除了:

WHERE username='$user'
AND validation='$key',
user_group = 'member'

它缺少AND---和验证=“$key”和用户组=“member”

检查错误会发出语法错误的信号http://php.net/manual/en/mysqli.error.php

您还应该添加exit 在头之后,否则您的代码可能需要继续执行/运行。

旁注:

  • 记住关于$count的评论中已经说明的内容-

将错误报告添加到文件的顶部,这将有助于查找错误。

<?php 
error_reporting(E_ALL);
ini_set('display_errors', 1);

// rest of your code

旁注:错误报告只应在暂存中完成,而不应在生产中完成。

脚注:

激活文件的当前代码对注入SQL开放。使用准备好的语句,或者使用准备好的语句的PDO,它们要安全得多。

  • 请仔细阅读以下内容,我的测试代码中有注释说明/信息。

使用下面的代码,证明对我来说是成功的。

确保:

  • 验证键的列是VARCHAR
  • 它的长度是50,作为测试,但32可能不够。
  • 在新的测试之前,首先改变列的长度,至少使用40。
  • 验证列接受NULL值。
  • 您选择了正确的数据库和表。
  • 验证键不包含任何尾随空格。

MD5生成的字符串长度为32,因此您可能需要为您的列增加它,例如40或50。我的测试用了50。

您的WHERE子句将依赖于它。

如果通过电子邮件发送的字符串包含空格,请确保后面没有空格。

  • 使用trim()

即。:

$key = $_GET['key'];
$key = trim($key);
  • 如果您的表仍然包含test和正在使用的测试键b5bad6f02c247458e3d888f94b568819,受影响的行将无法工作。
  • 为了让affected_rows()真正工作,您需要重新开始,为用户和键创建一个清晰的表。
  • 所以,在运行新的测试之前清除这些。

我还将去掉这个条件语句if(isset($user)

  • 这可能弊大于利

您已经在此块中使用了类似的方法:

if (isset($_GET['user'])) {
  $user = $_GET['user'];
}
if (isset($_GET['key']) && (strlen($_GET['key']) == 32)){
  $key = $_GET['key'];
}

但是,我会将其修改为:(和测试)

if (isset($_GET['user'])) {
  $user = $_GET['user'];
}
else{ 
   echo "User is not set"; 
exit; // Stop the entire process, it's not set
}

if (isset($_GET['key']) && (strlen($_GET['key']) == 32)){
  $key = $_GET['key'];
}
else{ 
   echo "Key is not set"; 
exit; // Stop the entire process, it's not set
}

旁注:与其使用isset(),不如使用!改为empty()

我的测试代码:

旁注:您说过您删除了user\u group='member',请确保这不会改变流程。

<?php 
$DB_HOST = 'xxx'; // Change those
$DB_USER = 'xxx'; // to your
$DB_PASS = 'xxx'; // own
$DB_NAME = 'xxx'; // credentials

$db = new mysqli($DB_HOST, $DB_USER, $DB_PASS, $DB_NAME);
if($db->connect_errno > 0) {
  die('Connection failed [' . $db->connect_error . ']');
}

$activation = md5(uniqid(rand(), true));

echo $activation . "<br>";

$user = "test";
$key = "b5bad6f02c247458e3d888f94b568819 "; 
// deliberate space added at the end of the string, remove it from this when testing.

$key = trim($key); // trims off the space at the end of the key string.

echo strlen($key); // yep, gotten 32

$sql = <<<SQL
  UPDATE users
  SET validation = NULL
  WHERE username='$user'
  AND validation='$key'

SQL;

$result = $db->query($sql);

if($result) {
  echo "Success" . "<br>"; 
// This does not always mean it was truly successful. Use affected_rows()
}

else{
  echo "Failed" . mysqli_error($db);
}

$affected = $db->affected_rows;

if($affected){
  echo "Affected yes";
}

else{
  echo "Not affected";
}

如果这对你不起作用,那么我不知道我还能说什么或做什么来帮助你;对不起,但我尽力了。

我真诚地祝你一切顺利,希望这件事得到解决。

 类似资料:
  • 问题内容: 我有以下代码: 如果只有一个结果(因为我可以回显)就很好了,但是如果有很多结果,如何使它循环遍历并打印每一行? 我敢肯定这确实很简单,但是我不确定我需要在Google中搜索什么。 我正在寻找与之等效的东西: 问题答案: 只需将其替换为or :) 几乎所有功能都有相应的功能。

  • 问题内容: 这是我在phpi中使用mysqli面向对象样式的简单查询: 这很好。我获得了从select语句检索的名称列表。 现在,在一段时间内,我想将该变量用作另一个查询的参数,但是mysqli不允许这样做,因为我必须关闭第一个查询,然后调用第二个查询。 因此,我认为我必须存储第一个查询的结果,然后遍历结果以调用新查询。 我尝试了以下方法: 但这是行不通的。永远不会到达while内的代码。 注意

  • 我正在为我的网站做一个注册页面。我在PHPMyAdmin中维护一个包含7个字段的数据库(id、用户名、密码、电子邮件、活动、代码和日期)。我正在使用代码和活动字段来实现电子邮件激活。注册表单使用post方法获取4个参数(名称、电子邮件、密码和重新键入密码),并将提交按钮的信息传递给PHP代码,以检查用户是否是新的,电子邮件ID是否应该是新的,并在单击提交按钮后检查空字段。PHP代码如下所示: 当我

  • 我正在将我的PHP代码从mysql更新到mysqli,但我似乎找不到这个问题的答案:mysqli更新查询是否返回结果? 使用mysql,我可以 即使该查询不返回任何行,也将为true。 现在,在mysqli代码中,我有如下内容(为了清晰起见,删除了错误处理): 结果是错误的。 对于记录来说,查询是有效的(忽略我可能在将其转录到stackoverflow中时犯的任何错别字),字段1在数据库中按预期正

  • 要运行查询,在工具栏中点击 运行 。如果查询语句是正确的,该查询将被运行,如果该查询应该返回数据,结果 选项卡会打开查询返回的数据。如果运行查询时发生错误,运行停止,显示相应的错误信息。 结果 选项卡以网格显示查询返回的结果数据。数据可以用两种模式显示:网格查看 和 表单查看。详细信息请看表查看 器。 提示:Navicat 支持返回 10 个结果集。 注意:你可以通过选择 查看 -> 显示结果 -

  • 你可以在任何的服务器运行查询。在工具栏的下拉式列表中选择目标服务器和数据库。然后点击 “运行”。如果该查询语句是正确的,它将被运行。如果该查询应该返回数据,“结果”选项卡会打开并显示返回的数据。如果运行查询时发生错误,运行会停止并显示相应的错误信息。 “结果”选项卡以网格显示查询返回的结果数据。数据可以用三种模式显示:网格视图、树视图和 JSON 视图。详细信息请参阅数据查看器。 【注意】Navi