0

代码将显示返回的值,如果它大于一,它将返回“是”。但是我在使用 $check 中的 WHERE 子句时遇到了问题。当我把它拿出来时,代码工作得很好,但是当我添加它时,页面返回不正确的值。有什么想法有什么问题吗?

<?php

$con = mysqli_connect("127.0.0.1","root","","lian");

$u= $_GET['username'];
$pw = $_GET['password'];

$check = "SELECT username,password FROM users WHERE username='$u' AND password='$pw'";

$login = mysqli_query($con,$check) or die(mysqli_error($con));

$num_rows = mysqli_num_rows($login);
echo "$num_rows \n";

if (mysqli_num_rows($login) == 1) {
$row = mysqli_fetch_assoc($login);
echo 'Yes'; 
exit;
}

else {
echo 'No';
exit;
}
4

3 回答 3

0

像这样试试

$u= trim(mysqli_real_escape_string($_GET['username']));
$pw = trim(mysqli_real_escape_string($_GET['password']));
$check = "SELECT username,password FROM users WHERE username='$u' AND password='$pw'";

另外,我希望您确保用户名和密码的唯一组合。因为假设您的用户表中有两个条目

用户名="abc" 密码="12345"

然后 mysqli_num_rows() 函数将返回两行和

if (mysqli_num_rows($login) == 1)

条件将返回false表示用户不存在。

于 2013-05-06T02:34:07.553 回答
0

抛开注入漏洞不谈,可能是因为特殊字符或空格。尝试修剪你的 GET 值。

$u = trim($_GET['username']);
$pwd = trim($_GET['password']);

您是否将结果数设为 0?还可以尝试在开发环境中回显该语句以准确检查该语句是什么。

于 2013-05-05T23:42:22.207 回答
0

以上注释对提高代码的安全性和保护vs sql注入是有效的。

关于您的实际问题,如果代码在您没有 where 子句时正确执行但在您这样做时失败,则有两种可能性:

  1. 用户名或密码错误 - 错误可能意味着它们有额外的空格、不区分大小写或列名不正确(区分大小写的数据库?)
  2. 您传递给服务器的字符串显示不正确。

在形成 SQL 字符串后,通过回显 $u、$pw 和 $check 来检查这两个选项。如果仍然不清楚,则复制 $check 回显的任何内容并将其直接传递到解析器(我猜是管理工作室?)并查看它返回的内容。

祝你好运。

于 2013-05-06T03:32:51.120 回答