PHP搜索获取字段中存在数据的位置

时间:2013-12-21 02:35:15

标签: php mysql search

我正在尝试创建搜索,无论如何我的网站是:

mysite.com/?p=search&t=[SEARCH VARIABLE]

所以在我的情况下,如果我的网址是我希望它在我的帖子表中搜索并向我提供表格中存在[SEARCH VARIABLE]的结果。主要是我想要检查这些列:标题,内容和作者。如果那里有任何[搜索变量],我希望它出现。

尝试[只有1列]但没有给我所有结果。

<?php
if (isset($_GET['t']))
{
    $stmt = $dbh->prepare('SELECT * FROM posts WHERE `title` like :t');
    echo ' <h1>Search results for: '.$_GET['t'].'</h1> ';
    if (!$stmt->execute(array(':t' => $_GET['t'])))
    {
        exit('Could not exec query with param: '.$_GET['t']);
    }

    while($row = $stmt->fetch(PDO::FETCH_ASSOC))
    {
        echo '<font size="4pt">'.$row["title"].'</font><br>
                        ';

    }
    }
 ?>

我的尝试与第一次尝试相同,但检查内容字段。也不起作用。

 <?php
    if (isset($_GET['t']))
    {
        $stmt = $dbh->prepare('SELECT * FROM posts WHERE `title` like :t AND `content` like :t;');
        echo ' <h1>Search results for: '.$_GET['t'].'</h1> ';
        if (!$stmt->execute(array(':t' => $_GET['t'])))
        {
            exit('Could not exec query with param: '.$_GET['t']);
        }

        while($row = $stmt->fetch(PDO::FETCH_ASSOC))
        {
            echo '<font size="4pt">'.$row["title"].'</font><br>
                            ';
        }
    }
  ?>

对于第一个,它只显示一个带有标题的字段。但是我希望它能用它来表达任何内容。例如,如果你搜索“嘿”并且有“嘿theres apples”,我希望它显示嘿theres apples。

编辑:

<?php
if (isset($_GET['t']))
{

    $stmt = $dbh->prepare('SELECT * FROM posts WHERE `title` like %:t%');

    echo ' <h1>Search results for: '.$_GET['t'].'</h1> ';

    while($row = $stmt->fetch(PDO::FETCH_ASSOC))
    {
        echo '<font size="4pt">'.$row["title"].'</font><br>
                        ';

                            }
                            }

                    ?>

仍然需要帮助。

1 个答案:

答案 0 :(得分:0)

问题是您没有在搜索字词周围放置LIKE通配符(%)。如果没有通配符,查询将在您的参数中查找字面值,这不是您想要使用的LIKE

所以这样的陈述:

$stmt->execute(array(':t' => $_GET['t'])

将改为:

$stmt->execute(array(':t' => '"%'.$_GET['t'].'%"')

编辑也许这样做会更好。将您的代码保留为原始问题,忽略上述更改并调整您的语句,如下所示:

    $stmt = $dbh->prepare('SELECT * FROM posts WHERE `title` like %:t%');

同样对于您的合并声明,我们也会进行类似更改,并可能将AND更改为OR

    $stmt = $dbh->prepare('SELECT * FROM posts WHERE `title` like %:t% OR `content` like %:t%;');

但不知何故,你需要那些通配符来获得你所暗示的结果。