这是登录页面的后端,如果用户存在,它首先检查用户对数据库的用户名如果匹配数据库中的用户的密码,如果它们匹配我们登录如果它们不是我们不登录。那部分工作正常,但如果用户名不存在(我写了一些应该抓住的东西)我得到一个空白的白页,这不是预期的结果。有人能指出我的代码在哪里破碎吗?
<?php
/*
Handles Login Requests
*/
define('DB_HOST', 'localhost');
define('DB_NAME', 'sec_usr');
define('DB_USER', 'sec_usr');
define('DB_PASS', 'n89tzAh2w3Uf4GUu');
$con=mysql_connect(DB_HOST,DB_USER,DB_PASS) or die("Failed to connect to MySQL: " . mysql_error());
$db=mysql_select_db(DB_NAME, $con) or die("Failed to connect to MySQL: " . mysql_error());
/*
$ID=$_POST['user'];
$Password = $_POST['pass'];
*/
function LogIn()
{
session_start();
if(!empty($_POST['user']) && !empty($_POST['pass']))
{
$query = mysql_query("SELECT * FROM username where userName = '$_POST[user]'") or die(mysql_error());
$row = mysql_fetch_array($query) or die(mysql_error());
if(!empty($row['userName']))
{
if($row['userPass'] === $_POST['pass'])
{
echo"Success"; /* Works */
}
else
{
echo"Wrong Pass"; /* Works */
}
}
else
{
echo"Wrong User"; /* Does Not Work */
}
}
}
if(isset($_POST['submit']))
{
LogIn();
}
?>
在我问了关于如何使用mysqli的初步问题之后我添加了一个问题但是我原来的问题我将问题还原为与使用mysqli没有任何关系我认为如果人们告诉我使用mysqli我也可以问那些人如何使用它而不是如何一起使用它们。
答案 0 :(得分:0)
我建议您使用!empty()
来获取行数,然后检查它是否大于0,而不是使用mysql_num_rows()
检查查询。
empty()
或未设置,则 FALSE
返回true。
你可以试试这个:
$query = mysql_query("SELECT * FROM username where userName = '$_POST[user]'") or die(mysql_error());
$row = mysql_fetch_array($query) or die(mysql_error());
$num = mysql_num_rows($row);
if($num)
{
\\username exists.
}
else
{
\\username does not exist.
}
编辑:
此外,我建议您转移到mysqli
或PDO
,因为它们更安全。使用mysqli与mysql有很大的不同,除了一些变化,但你从mysqli中获得的收益远远超过了mysql。
mysql v / s mysqli
首先,
mysql_connect(host, username, password)
mysql_select_db(db)
更改为
mysqli_connect(host, username, password, db)
和
mysql_query(query)
更改为
mysqli_query(connect, query)
所以,正如你所看到的,没有重大差异,只是次要差异。你可以很容易地转移到mysqli。
使用mysqli更新代码
<?php
define('DB_HOST', 'localhost');
define('DB_NAME', 'sec_usr');
define('DB_USER', 'sec_usr');
define('DB_PASS', 'n89tzAh2w3Uf4GUu');
$con=mysqli_connect(DB_HOST,DB_USER,DB_PASS,DB_NAME) or die("Failed to connect to MySQL: " . mysqli_error($con));
/*
$ID=$_POST['user'];
$Password = $_POST['pass'];
*/
function LogIn()
{
session_start();
if(!empty($_POST['user']) && !empty($_POST['pass']))
{
$query = mysqli_query($con, "SELECT * FROM username where userName = '$_POST[user]'") or die(mysqli_error($con));
$row = mysqli_fetch_array($con, $query) or die(mysqli_error($con));
$num = mysqli_num_rows($con, $query);
if($num)
{
if($row['userPass'] === $_POST['pass'])
{
echo"Success"; /* Works */
}
else
{
echo"Wrong Pass"; /* Works */
}
}
else
{
echo"Wrong User"; /* Does Not Work */
}
}
}
if(isset($_POST['submit']))
{
LogIn();
}
?>
答案 1 :(得分:0)
正如你在评论中指出的那样,问题在于这一部分:
mysql_fetch_array()
如果找不到行,PHP函数FALSE
将返回FALSE
。当用户不存在时,查询将返回or
,PHP将在mysql_error()
之后执行该部分。问题是$row = mysql_fetch_array($query);
if($row)
{
if($row['userPass'] === $_POST['pass'])
{
echo "Success";
}
else
{
echo "Wrong Pass";
}
}
else
{
echo "Wrong User";
}
没有显示错误,因为查询执行成功,这就是你得到空页的原因。
要修复它,你可以这样做:
user
为了安全起见,如果您没有收到pass
或if
变量,您还可以在之前的if(!empty($_POST['user']) && !empty($_POST['pass']))
{
// query the database...
}
else
{
// Code will most likely not reach here.
throw new Exception("Form submitted but user/pass not received.");
}
中添加例外:
mysql_query("SELECT * FROM username where userName = '$_POST[user]'")
另外,请注意$query = sprintf("SELECT * FROM username where userName = '%s'",
mysql_real_escape_string($_POST[user])
);
mysql_fetch_array($query);
对SQL注入攻击是开放的,在SQL查询中使用之前必须先转义用户名。您可以在mysql_real_escape_string
页面上详细了解相关信息。可以这样做(取自该页面):
date("d-m-Y h:i:s")
最后,自PHP 5.5.0起,Original MySQL API已弃用,建议您使用MySQLi或PDO_MySQL扩展名。