【问题标题】:problems with my search module on my website我网站上的搜索模块出现问题
【发布时间】:2013-03-09 18:00:36
【问题描述】:

我的网站上的搜索模块出现了一些问题。我正在使用此代码:

    if(!isset($_POST['search'])) {
$query = "SELECT id, title FROM cars ORDER BY id LIMIT ? OFFSET ?";
}
if(isset($_POST['search']) && $_POST['categories'] != "all") {
$query = "SELECT id, title FROM cars WHERE title LIKE CONCAT(?, '%') ESCAPE '+'  AND category = ? ORDER BY id LIMIT ? OFFSET ?";
}
if(isset($_POST['search']) && $_POST['categories'] == "all") {
$query = "SELECT id, title FROM cars WHERE title LIKE CONCAT(?, '%') ESCAPE '+' ORDER BY id LIMIT ? OFFSET ?";
}
try { 
    $stmt = $db->prepare($query); 
    if(!isset($_POST['search'])) {
        $stmt->bindValue(1, (int) $limit, PDO::PARAM_INT);
        $stmt->bindValue(2, (int) $offset, PDO::PARAM_INT);
    }
    if(isset($_POST['search']) && $_POST['categories'] != "all") {
        $search= str_replace(array('+', '%', '_'), array('++', '+%', '+_'), $_POST['search']);
        $stmt->bindValue(1, $search, PDO::PARAM_STR);
        $stmt->bindValue(2, (int) $_POST['categories'], PDO::PARAM_INT);
        $stmt->bindValue(3, (int) $limit, PDO::PARAM_INT);
        $stmt->bindValue(4, (int) $offset, PDO::PARAM_INT);
    }
    if(isset($_POST['search']) && $_POST['categories'] == "all") {
        $search= str_replace(array('+', '%', '_'), array('++', '+%', '+_'), $_POST['search']);
        $stmt->bindValue(1, $search, PDO::PARAM_STR);
        $stmt->bindValue(2, (int) $limit, PDO::PARAM_INT);
        $stmt->bindValue(3, (int) $offset, PDO::PARAM_INT);
    }
    $stmt->execute(); 
} 
catch(PDOException $ex) { 
    die("Failed to run query: " . $ex->getMessage()); 
} 
$cars = $stmt->fetchAll(); 

我的搜索表单如下所示:

<input name="search" type="text" size="20" maxlength="20" />
<select name="categories">
    <option value="all">All Categories</option>
    <option value="1">Free</option>
    <option value="2">In use</option>
    <option value="3">Damaged</option>
</select>

在汽车表中,每个标题如下所示:2009 Porsche 911(年份制造车型) 搜索的时候不填搜索框就可以了,搜索2009也可以,但是搜索保时捷就没有结果。这是为什么?我的代码有什么问题?

【问题讨论】:

  • 注意,limit ? offset ? 的简写是limit ?,?。我更喜欢它,但个人喜好:)
  • 我会查看 str_replace 代码。也许你可以 var_dump 它的结果并得到一个线索。

标签: php mysql search pdo


【解决方案1】:

CONCAT(?, '%') 表示您搜索以 search-word 开头的单词。

所以 2009 是第一个词,这就是它返回的原因。如果您想获得第二个单词,请尝试使用此

    CONCAT('%',?, '%')

或者就这样

    CONCAT("'",?, "'")

【讨论】:

  • 使用 CONCAT('%',?, '%') 有效,谢谢。另一个问题是我的代码现在的安全性如何?
  • 直到完成,我更喜欢使用catch
猜你喜欢
  • 1970-01-01
  • 2017-04-12
  • 1970-01-01
  • 2014-12-25
  • 2020-10-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-10-20
相关资源
最近更新 更多