无法从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 statement 和 bind placeholders。我还建议 not 存储明文密码。如果我们要推荐使用名为 _sql
的函数,提供一些关于它的信息可能会有所帮助......比如函数的定义,或者如果它是包的一部分,则提供有关如何使用的文档的链接安装包等。AFAIK _sql
不是 PHP 或 mysqli 接口库原生提供的函数。以上是关于无法从sql数据库中获取结果[重复]的主要内容,如果未能解决你的问题,请参考以下文章
无法使用准备好的对象语句从 mysql 获取多行数据 [重复]