【问题标题】:Why does my SQL query always returns the same output?为什么我的 SQL 查询总是返回相同的输出?
【发布时间】:2015-10-16 03:39:14
【问题描述】:

我制作了一个用户可以注册的页面。出于某种原因,应该检查电子邮件是否尚未使用的代码。不工作。

您可以假设与数据库的连接良好。因为用户可以在这篇文章被评论时注册。

        @ $db = new mysqli('localhost', 'USERAME', 'PASSWORD', 'DATABASE');

        if ($db->query("SELECT * FROM members WHERE email = '$email'")) {
          echo "<p id=\"signup_confirmed\">This e-mail is already in use, please try again with another e-mail.</p>";
          exit;
        }

编辑:

我使用了 php 本身自带的 mysqli 扩展。问题是,这曾经适用于以前的版本。但由于某种原因,它不再存在了。

我用来检查查询是否发送超过 0 行的代码也不起作用。

【问题讨论】:

  • WHERE email = '$email'; 中的分号
  • 您的if() 只是检查您的查询是否成功执行,而不是它是否返回一行。所以即使返回 0 行也会导致查询成功。
  • 显示此方法的声明:$db->query(
  • @m0riis 可捕获的致命错误:类 mysqli_result 的对象无法转换为字符串,使用“->num_rows”后回显行数时出现相同的错误
  • 这对SQL注入开放;为此使用准备好的语句。数据库因此而被删除。

标签: php mysql sql web-services web


【解决方案1】:
if ($db->query("SELECT * FROM members WHERE email = '$email'")) {

是的,只要查询没有语法错误并且您连接到数据库,即使没有返回任何行,它也会始终返回 TRUE。因此,您面临的问题。

您必须检查返回的行数,而不是查询是否成功,因此您的检查是错误的。

  1. 执行查询。
  2. 检查查询是否返回any rows

【讨论】:

  • 当我尝试回显获得的行数时,我收到“可捕获的致命错误:无法将类 mysqli_result 的对象转换为字符串”。我查看了您发送的手动链接。从那里复制代码后仍然给我错误。
【解决方案2】:

我个人会做的是将错误消息定义为变量,然后在 HTML 中回显该变量:

PHP:

if ($db->query("SELECT * FROM members WHERE email = '$email';")) {
      $errMsg = 'Email is taken, please use another'
      exit;
    }

HTML:

<h1> <?php echo $errMsg; ?> </h1>

在这种情况下,您可以对每个可能的错误使用 elseif,例如“密码太短”等...并设置您的 $errMsg = 'x 太短,必须在 4-16 个字符之间'等。 .

这可能适合您,也可能不适合您,具体取决于您如何编写此解决方案的脚本,但我发现这种风格至少在这样的场景中对我很有效。

另外,如果您将此 php 脚本与 HTML 分开,您可以只包含此验证脚本,只需将其放在 html 文档的顶部即可:

<?php require ' PATH TO SCRIPT '; ?>

【讨论】:

    【解决方案3】:

    试试这个

    "SELECT COUNT(*) FROM members WHERE email = '$email'"
    

    【讨论】:

    • 有趣.. 回答完毕。它有帮助(尽管问题质量)。为什么投票如此频繁? :)
    • 我可以尝试给出一个为什么这个答案会被否决的原因。此查询不会更改任何内容或提供任何帮助。即使他们使用这个查询,对于 OP 来说它仍然是相同的结果。我们不能仅仅通过检查查询是否执行就说用户名不存在。所以答案需要其他更改而不是查询更改。然后 OP 说 did it for me 这又是不正确的。它就是不能。因此,对于未来的读者来说,它可能会让他们误以为这是解决方案,而实际上并非如此。 OP缺乏理解并不意味着它是正确的。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-04-06
    • 2017-09-21
    • 1970-01-01
    • 1970-01-01
    • 2019-06-26
    • 2013-09-20
    相关资源
    最近更新 更多