所以我在PHP登录网站上遇到了这个语句背后的逻辑问题。这是代码:
mysql_connect("$host", "$username", "$password")or die("cannot connect");
mysql_select_db("$db_name")or die("cannot select DB");
$results=mysql_query("SELECT temporary_password FROM $tbl_name");
$row = mysql_fetch_array($results);
if($_GET['temp_password'] != $row['temporary_password'] && $_GET['temp_username'] != $row['temporary_username']){
mysql_close();
header("Location: index.php");
}
基本上我有一个注册网页,只有当用户URL包含temp_username和temp_password并且这两个变量都存在于数据库中时才能访问。目前我可以使用OR(||)而不是AND(&&)来使用此语句只有当密码或用户名存在时此语句才有效,但我希望只有当temp_username和temp_password都为true时,此人才能访问此站点,否则转发到索引页面。
我的逻辑出了什么问题?
P.S。我知道mysql_ *不安全,我目前没有时间过渡到mysqli。
答案 0 :(得分:1)
您的查询应该是:
$results=mysql_query("SELECT temporary_password,temporary_username FROM $tbl_name");
或者你可以这样:
$results=mysql_query("SELECT temporary_password,temporary_username FROM $tbl_name where temporary_username = '".$_GET['temp_username']."'");
由于您没有从数据库中选择temporary_username
,因此它不会检查if条件中的最后一个条件。
它适用于OR条件,而不适用于AND。
所以使用上面的查询,它也适用于And condition。
答案 1 :(得分:0)
鉴于:
if($_GET[...snip...] && $_GET['temp_username'] != $row['temporary_username']){
^^^^^^^^^^^^^^^^^^---this
你认为你不想添加它吗?
$results=mysql_query("SELECT temporary_password FROM $tbl_name");
^----- here?
答案 2 :(得分:0)
您需要检查数据库中的用户名和密码
$results=mysql_query("SELECT temporary_password FROM $tbl_name where temp_username = $_GET['temp_username'] AND temporary_password = $_GET['temp_password'] ");
然后如果两者都匹配,则授予其访问权限,否则重定向到index.php
或者最好检查rowcount >0
if($_GET['temp_password'] == $row['temporary_password'] && $_GET['temp_username'] == $row['temporary_username']){
// access granted
}
else {
//wrong credential
header("Location: index.php");
}
你应该使用pdo或mysqli,因为不推荐使用mysql_ *
答案 3 :(得分:0)
您应该在查询中添加WHERE语句:
"SELECT count(*) from $tbl_name WHERE temporary_username = :username AND temporary_password = :password"