无法从sql数据库中获取结果[重复]

Posted

技术标签:

【中文标题】无法从sql数据库中获取结果[重复]【英文标题】:can't get result from sql database [duplicate] 【发布时间】:2016-10-04 00:57:52 【问题描述】:

我对 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)明文密码。 【参考方案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 接口库原生提供的函数。

以上是关于无法从sql数据库中获取结果[重复]的主要内容,如果未能解决你的问题,请参考以下文章

无法使用准备好的对象语句从 mysql 获取多行数据 [重复]

如何获取在 SQL Server 内部数据库的不同表中重复的列[重复]

SQL查询从两个表中获取数据[重复]

连接多个表后如何从sql查询结果中删除重复记录

无法获取记录 SQL [重复]

排序后如何从 SQL 中获取数据并确保没有重复