如何在PDO中使用SELECT IFNULL?

时间:2016-08-31 08:59:28

标签: php mysql pdo

我正在寻找一种方法来返回错误,如果在MySql查询中找不到结果,首先我声明了一个变量值false,如果fetch()函数为true,它会将该boolean的值设置为是的,然后我检查它是真还是假,但后来我在互联网上搜索了因为我不喜欢我的解决方案那么多,所以我找到了函数IFNULL(查询,'错误消息'); 我试了但是我有一个错误,你能告诉我我的代码有什么问题吗?

if(isset($_POST['tosearchfor']))
        {
            $query = $db->query('SELECT IFNULL( (SELECT * FROM searchfor WHERE title LIKE \'%'.$_POST['tosearchfor'].'%) , \'Sorry, no resluts found for : <strong>'.$_POST['tosearchfor'].'strong');
            while($result = $query->fetch())
            {
                echo '<div class="result"><a class="title" href="#">'.$result['title'].'</a><span class="link"><span style="font-size:15px;position:relative;top:0.8px;padding-right:2px;">&#8227;</span>https://www.qsoft.com/'.$result['link'].'</span><span class="details">'.$result['details'].'</span></div>';
            }
        }
        else
        {
            echo 'Error : empty search';
        }

谢谢。

3 个答案:

答案 0 :(得分:1)

嘿,我使用的不同方法不是你的查询,而是使用$query->rowCount()。 让我们在查询之外使用IF :) $db->prepare保护您的查询,因为在没有保护的情况下,永远不会将$ _POST直接放在查询中。

if(isset($_POST['tosearchfor'])){
    //We prepare the query
    $query = $db->prepare("SELECT * FROM searchfor WHERE title LIKE '%:tosearch%'");
    //We had parameters
    $query->bindParam(':tosearch',$_POST['tosearchfor'], PDO::PARAM_STR);
    //We execute the query
    $query->execute();

    //We retrieve the results in array of objects
    $results = $query->fetchAll(PDO::FETCH_OBJ);

    if (count($results) > 0) {
        foreach ($results as $result){
            echo '<div class="result">
                    <a class="title" href="#">'.$result->title.'</a>
                    <span class="link">
                        <span style="font-size:15px;position:relative;top:0.8px;padding-right:2px;">&#8227;</span>
                        https://www.qsoft.com/'.$result->link.'
                    </span>
                    <span class="details">'.$result->details.'</span>
                </div>';
        }
    } else {
       echo 'Sorry, no resluts found for : <strong>'.$_POST['tosearchfor'].'</strong>';
    }
}else{
    echo 'Error : empty search';
}

答案 1 :(得分:1)

  

IFNULL(expr1,expr2)的默认结果值是“更一般”   这两个表达式的顺序为STRING,REAL或INTEGER。

您无法使用IFNULL评估一组记录。像下面的东西

也可以使用以下方法来避免sql注入,而不是使用直接替换值。

$stmt = $pdo->prepare('SELECT * FROM employees WHERE name = :name');

$stmt->execute(array(':name' => $name));

if(empty($stmt)){
  return false;
}

foreach ($stmt as $row) {
    // do something with $row
}

return result;

如果此方法返回false,则表示没有搜索结果。

答案 2 :(得分:0)

最后,这是我的代码,我还添加了最多结果数20。

$db = new PDO('mysql:host=localhost;dbname=search','root','');
        $db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
        if(isset($_POST['tosearchfor']))
        {
            $query = $db->query('SELECT * FROM searchfor WHERE title LIKE \'%'.$_POST['tosearchfor'].'%\'');

                    for($i=0; $i<20;  $i++)
                    {
                        if($result = $query->fetch())
                        {
                            echo '<div class="result">
                            <a class="title" href="#">'.$result['title'].'</a>
                            <span class="link">
                                <span style="font-size:15px;position:relative;top:0.8px;padding-right:2px;">&#8227;</span>
                                https://www.qsoft.com/'.$result['link'].'
                            </span>
                            <span class="details">'.$result['details'].'</span>
                            </div>';
                        }
                        else
                        {
                            if($i==0)
                            {
                                echo 'Sorry, no resluts found for : <strong>'.$_POST['tosearchfor'].'</strong>';
                            }
                        }
                    }   
        }
        else
        {
            echo 'Error : empty search';
        }