使用PDO的简单登录表单。回声的输出工作正常。其他情况下的内部但不会进入foreach循环内部。 var_dump的输出给出了这个。
回音输出
1个SelectedEntered成功循环
var_dump输出
对象(PDOStatement)[3] public' queryString' =>字符串'选择* 来自tour_login,其中username =' admin'和密码=' admin'和 状态= 1' (长度= 81)
if(isset($_POST['login']))
{
$un=$_POST['un'];
$pass=$_POST['pass'];
$res=DB::getInstance()->query("select * from tour_login where username='$un' and password='$pass' and status=1");
$num_rows = $res->fetchColumn();
echo $num_rows."rows Selected";
if($num_rows<=0)
{ echo "Entered error loop";
echo "<script>alert('invalid username and password');document.location='index.php';</script>";
return false;
}
else
{
echo "Entered successfull loop";
foreach ($res as $row) {
echo "Entered successfull for loop";
if($row['type']==0)
{
$_SESSION['admn']=$un;
echo "<script>alert('welcome admin...');document.location='adminhome.php';</script>";
}
else
{
$_SESSION['usr']=$un;
echo "<script>alert('welcome user...');document.location='userhome.php';</script>";
}
}
}
}
我不理解为什么foreach不使用显示一行的行数。新的Php.I在这个StackOVerflow问题中找到了在pdo中使用mysql_num_rows()的替代方法 https://stackoverflow.com/questions/11305230/alternative-for-mysql-num-rows-using-pdo
答案 0 :(得分:1)
你的第一个问题是,作为一个新手,你只是从你找到的代码中抢过一行,不知道它做了什么。此行永远不会返回找到的行数,但是这一行会导致您的混淆,因为它会获取您选择的所有数据,而不会为foreach循环留下任何内容。虽然你也不需要后者。
你的第二个问题是,你有一个非常普遍的错觉,认为你需要多少返回的行。事实上,你实际上并不需要它。
你的第三个问题是你应该使用准备好的陈述,但你不是。
您需要的代码是
$sql = "select * from tour_login where username=? and password=? and status=1";
$res = DB::getInstance()->query($sql);
$res->execute(array($un, $pass));
$row = $res->fetch();
if(!$row) {
echo "Entered error loop";
echo "<script>alert('invalid username and password');document.location='index.php';</script>";
return false;
}
等等。只需删除无用的foreach循环即可。