为什么我的else语句运行代码两次

时间:2015-03-18 08:58:35

标签: php mysql database if-statement pdo

我的代码:

  <?php
    $name = $_POST["name"];
//establishing connection through PDO
    require("database.php");

    try{
     //querying the firstname data from the people table    
        $sql = $conn->query("SELECT firstname FROM people");

    }catch (Exception $e) {
            echo "Data could not be retrieved from the database.";
            exit;
        }

//looping through the array of firstname and echoing it out if it equals to the user input of name. else just echo out sorry no match 
    while($theRow = $sql->fetch(PDO::FETCH_ASSOC)){
    if(strtolower( $name ) == strtolower( $theRow["firstname"] ) && isset($_POST['name']) ){
    echo $theRow['firstname'] . "<br />";
    }else {
        echo 'Sorry no match';
        exit;
    }
    }
    ?>

require database.php只是使用PDO与我的数据库建立连接。

我的数据库中只有两行

  
    

的'firstname'   
     
      
  • 杰克
  •   
  • 鲍勃
  •   

并且如果在我的输入字段中任何人键入这两个名称中的一个,那么php将从数据库中的people表中回显出该名称。非常简单,但我唯一的问题是在我的else语句中我希望它回显出抱歉没有匹配如果name的输入字段不等于数据库中的任何名称。相反,它回应出来抱歉每个名字都没有匹配一次。我知道我正在循环遍历数据库名称数组,但如果名称输入不等于数据库中的“firstname”,我只希望它回显抱歉没有匹配

EXTRA NOTE:

我也尝试过使用foreach循环而不是使用fetchAll方法进行while循环,而不仅仅是获取但没有运气。基本上给了我相同的结果。

更新问题:

  

当我加载页面时,else语句已经生效了   在我在输入中设置名称之前,回显抱歉没有匹配。   如果我键入了错误的名称,那么如果错误的话,那么就会发出两次抱歉没有匹配   我输入正确的名称,它将从数据库中回显出该名称   和抱歉没有匹配一次。

图示:

<?php
$name = $_POST["name"];
require("database.php");

try{
    $sql = $conn->prepare("SELECT firstname FROM people WHERE firstname = ?");
    $sql->bindParam(1,$name);
    $sql->execute();

}catch (Exception $e) {
        echo "Data could not be retrieved from the database.";
        exit;
    }

$theRow = $sql->fetch(PDO::FETCH_ASSOC);

if(strtolower( $name ) == strtolower( $theRow["firstname"] ) ){
echo $theRow['firstname'] . "<br />";
}else{
    echo 'no match'; 
}
?>

事实证明我甚至不需要循环对WHERE claus只获取匹配$ _POST ['name']的名字,所以这只是何时输出那些数据而且是if语句的时候但如果我不得不输出多个单一数据,我可能会使用foreach循环:

if(strtolower( $name ) == strtolower( $theRow["firstname"] ) ){
foreach( $theRow as $row ){
    echo $row . "<br />";
    }
    }else{
        echo 'no match'; 
    }

如果有人发现此代码或我的方法有任何问题,请告诉我们。谢谢

1 个答案:

答案 0 :(得分:3)

首先,您似乎回答了自己的问题:为什么else语句运行代码两次?答:不是;它为循环的每次迭代运行一次,因为你把它放在循环中。

只需将您的SQL更改为:

$stmt = $conn->prepare("SELECT firstname FROM people where firstname = ?");
$stmt->execute(array($name));
$result = $stmt->fetchAll();

它会返回1行或0行。因此,您的if语句将如下所示:

if($result->num_rows) // True if num_rows > 0; else false

while循环放在您的if语句中。将你的else语句保持为echo 'Sorry no match';