【问题标题】:can't get result from sql database [duplicate]无法从sql数据库中获取结果[重复]
【发布时间】:2023-03-21 02:27:02
【问题描述】:

我对 php 很陌生,我正在尝试创建一个登录系统。这是我的代码

<?php

    $con=mysqli_connect("XXXXXXX","XXXXXXXX","XXXXXXXXX","XXXXXXXXXX");

    if (!$con)
        {
        echo "failed to connect";
        }

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

    $sql = "SELECT userID FROM users WHERE username = $username and password =          $password;";

    if (!$sql) {
        echo 'query invalid'.mysql_error();
        }

    $result = mysql_query($sql);

    echo "$result";

    $row = mysqli_fetch_array($sql, MYSQLI_ASSOC);

    $active = $row['active'];

    $count = mysqli_num_rows($result);

    mysql_close($con);

?>

我确定连接没有问题。但我的结果没有出现,也没有错误信息。以前我有一个 IF 语句,如果结果返回,它会执行进一步的操作。由于我想弄清楚发生了什么,我只是删除了那部分。有人请帮忙。非常感谢

【问题讨论】:

  • 这是我的代码 - 没有代码!
  • 他也是 Stack Overflow 的新手,伙计们。我编辑了它。对新手来说更全面。
  • 啊,来了!您忘记了用户名和密码周围的 ''!
  • 您对 SQL 注入持开放态度,应对密码进行哈希处理。
  • @Jeff... 也许$username 已经包含引号作为值的一部分,从表单中以这种方式传递?我们怎么知道?我们可以看到代码混合使用了客户端接口库(mysqli 和 mysql,这将无法正常工作,当该问题得到纠正时,代码似乎容易受到 SQL 注入的攻击。如果密码被散列,该操作在错误的地方执行,在客户端而不是服务器上。完美的三重奏:1)mysqli和mysql函数的无效混合2)sql注入漏洞,3)明文密码。

标签: php mysql


【解决方案1】:

您缺少变量周围的单引号,并且您将 mysql 与 mysqli 混合使用,这是行不通的。

$sql = "SELECT userID FROM users WHERE username = '$username' and password = '$password';";
$result = mysqli_query($con, $sql);

$row = mysqli_fetch_assoc($sql); // same as fetch_array with MYSQLI_ASSOC

$active = $row['active'];

$count = mysqli_num_rows($result);

你最后不需要mysql_close,但如果你想使用它,它是mysqli_close($con); 请记住,这是不安全的。

使用此功能过滤用户输入:

$username = mysqli_real_escape_string($con, $_POST['username']);
$password = mysqli_real_escape_string($con, $_POST['password']);

Read this 确保您的代码符合安全标准。

【讨论】:

  • 谢谢,但还是不行……
  • 是的,我刚刚注意到您将 mysql 与 mysqli 混淆了,我会更新我的答案。
  • 是的,我稍后会担心这个。但是您在我的代码中看到任何其他问题吗?因为那个功能也不起作用
  • 看看现在能不能用
  • 我的“mysql”都改成了“mysqli”,还是不行
【解决方案2】:

我推荐这个。

$sql = "SELECT userID FROM users 
WHERE username = " ._sql($username) ." and password = " ._sql($password);

// generate sql safe string function 

function _sql($txt) { 
    if ($txt === null || $txt === "") 
      return "NULL"; 
    if (substr($txt, 0, 2) == "##") 
      return substr($txt, 2); 
    //$txt = str_replace("'", "''", $txt); 
    $txt = mysql_real_escape_string($txt); 
    return "'" . $txt . "'"; 
}

【讨论】:

  • 这是什么?为什么推荐这个?
  • 你需要在开始之前结构化代码
  • 你的答案是什么? _sql() 是什么?
  • 我也很困惑
  • 就我个人而言,我建议使用 prepared statementbind placeholders。我还建议 not 存储明文密码。如果我们要推荐使用名为 _sql 的函数,提供一些关于它的信息可能会有所帮助......比如函数的定义,或者如果它是包的一部分,则提供有关如何使用的文档的链接安装包等。AFAIK _sql 不是 PHP 或 mysqli 接口库原生提供的函数。
猜你喜欢
  • 2019-02-17
  • 1970-01-01
  • 2017-07-19
  • 1970-01-01
  • 2015-11-09
  • 2014-12-20
  • 1970-01-01
  • 2016-07-17
  • 2019-10-04
相关资源
最近更新 更多