我编写了许多嵌套if
条件的PHP代码。我只想显示异常情况的警报以及if
条件。
这是我的源代码:
$username = $_POST['username'];
$password = $_POST['password'];
if (!empty($username) && !empty($password)) {
$query ="SELECT * FROM user where username='.$username.' AND pass='.$password.'";
$row = mysql_fetch_array($query);
$counted = mysql_num_rows($query);
if (($counted === 1) &&
($row['username'] === $username) &&
($row['password'] === $password))
{
session_destroy();
session_start();
echo "message";
} else {
do_alert("Exceptional alert");
}
} else {
do_alert("Exceptional alert");
}
这两个其他条件不起作用。我真的不知道我的错误在哪里。
答案 0 :(得分:1)
我认为这可能与代码中的do_alert
代码有关。跟我来完成代码。
$username = $_POST['username'];
$password = $_POST['password'];
if (!empty($username) && !empty($password)) { // if not empty
$query =""; // this is an empty query
$row = mysql_fetch_array($query); // returns nada
$counted = mysql_num_rows($query); // gives nada back
if (($counted === 1) && ($row['username'] === $username) && ($row['password'] === $password)) { // completely useless at this point cause no row is returned
session_destroy();
session_start();
echo "message";
} else { // this will not be executed
do_alert("Exceptional alert");
}
} else { // this will be executed
do_alert("Exceptional alert"); // where is this function defined?
}
好吧,我评论了你的代码出错了。如你所见,它发生在第一个if,所以它应该返回最后的其他。由于我不知道你的do_alert代码定义在哪里,我的猜测是这是你的错误。
首先尝试使用这样的回声替换它:echo "I am a super duper evil monkey";
并查看是否有效。
修改强>
既然您现在添加了查询,我还要指出您应该清理您的输入。这样可以使它更安全。但是,此处的安全术语有点不相关,导致您使用过时的mysql
集。 (mysqli / pdo
是现在的方法)
$username = mysql_real_escape_string($_POST['username']);
$password = mysql_real_escape_string($_POST['password']);
为什么呢?简单。看看这个!
$_POST['username'] = 'awesome';
$_POST['password'] = "' OR ''='";
它会变成像这样的东西。
SELECT * FROM users WHERE user='awesome' AND password='' OR ''=''
这意味着,每个人都可以登录,因为空白总是空白。就像一个单挑。
此处提供更多信息:http://php.net/manual/en/function.mysql-real-escape-string.php
编辑2
// very first thing you do if you work with sessions, is actually starting it. you dont do this in your if else statement, cause you could not benefit of the session variable on a later stage on this page.
session_start();
// these variables come from a form with a form name, so we are going to do a check if indeed this came from that form.
$username = mysql_real_escape_string($_POST['username']);
$password = mysql_real_escape_string($_POST['password']);
if (!empty($username) &&
!empty($password)) {
$query ="SELECT name, password FROM user WHERE name='".$username."' AND password = '".$password."'";
$row = mysql_fetch_array($query);
$counted = mysql_num_rows($query);
if (($counted === 1) &&
($row['username'] === $username) &&
($row['password'] === $password)) {
echo "message";
} else {
echo "no entrees found";
}
} else {
echo "failed to input some variable";
}
我用自己的语言清理了一些,你可能不得不弄乱查询,并且我进一步修复了一点,因为你没有适当地使用会话。
现在回显消息,你应该设置一个会话变量,你可以在以后注销时销毁它。您可以在会话本身中调用的会话变量,在其中包含sessionstart()的每个页面上。在这里你可以检查它是否有效,如果有,那么你就登录了。我希望这可以帮助你。