php mysql pdo结果集,一行没有输入foreach

时间:2015-09-03 11:56:25

标签: php mysql pdo

使用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

1 个答案:

答案 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循环即可。