【问题标题】:Refining PDO results from MySQL database with Text Box使用文本框从 MySQL 数据库中优化 PDO 结果
【发布时间】:2014-12-11 05:06:50
【问题描述】:

我目前正在使用 PDO 从 MySQL 数据库中检索数据。我正在使用 foreach 将数据显示到页面上,并希望用户能够在输入字段中输入搜索词,点击提交按钮,然后只返回标题包含搜索词的结果。

这是我当前的代码:

file_functions.php - SQL 查询函数所在的位置

function getbycategory($category, $limit){
    global $db;
    if (isset($category) AND $category != "all") {
        $sm = $db->prepare ("SELECT * FROM parts WHERE main_category = :category");
        $sm->bindParam(':category', $category, PDO::PARAM_INT);
    } else {
        $sm = $db->prepare ("SELECT * FROM parts");
    }
        $sm->execute();
    return $sm->fetchAll();
}

files.php - 显示结果的位置

$files = getbycategory($_GET['filter']); 

foreach($files as $file){    
echo'<div class="col-lg-" id="file-'.$file['id'].'">
        <div class="file-list-item first" id="">
            <img class="file-image" height="120px" width="180px" src="'.$file['image_url'].'" />
            <div class="file-text">
                <h3><strong>'.$file['name'].'</strong></h3>
                Submitted by: '.$file['submitter'].'<br/>
                Author: '.$file['author'].'<br />
                Category: '.ucfirst($file['subcategory']).'<br />
                Description: '.substr($file['description'],0,45).'...
            </div>
            <div class="download">
                <a target="_blank" href="'.$file['download_url'].'" class="btn-success btn btn-default">Download</a>
                <a href="'.baseurl.'/broken.php?id='.$file['id'].'" class="btn btn-default">Report as Broken</a><br /><br />';
                    if($file['is_broken']){
                        echo '<span class="broken"><i data-toggle="tooltip" data-placement="left" id="broken" title="This file has been reported as broken and is awaiting review." class="fa fa-warning fa-2x"></i></span>';
                    }


                echo '

            </div>
        </div>
    </div>';
};

?>

以下是用于优化结果的表格。目前,过滤器下拉菜单适用于过滤器,但搜索词不适用。这就是我想要实现的

<form method="get">
<select name="filter">
    <option <?php if($_GET['filter'] == "all" OR !isset($_GET['filter'])){echo 'selected';} ?> value="all">View All Files</option>
    <option <?php if($_GET['filter'] == "1") {echo 'selected';} ?> value="1">View Vehicles Only</option>
    <option <?php if($_GET['filter'] == "2") {echo 'selected';} ?> value="2">View Lighting Equiptment</option>
</select>
<input type="submit" value="Filter Results"/><br /><br />
<input type="text" name="search" placeholder="Enter a search term" />
<input type="submit" value="Search Results"/>
</form>

总而言之,我希望使用代码底部 sn-p 中的文本字段,通过将它们的标题与搜索词进行比较来优化 files.php 中显示的结果。

我希望将搜索词与 $file['name'] 进行比较。

非常感谢。

【问题讨论】:

  • 对于简单的string contains 样式匹配,使用LIKE 比较,例如AND LOWER(name) LIKE CONCAT('%', LOWER(:search), '%')。您的排序规则可能不需要LOWER() 调用(即,它可能不区分大小写)。更复杂的匹配见dev.mysql.com/doc/refman/5.0/en/fulltext-search.html
  • @Phil,是否可以在语句中包含可选部分,例如:如果未定义参数,则它将只返回所有结果,但如果定义了搜索,则“LIKE”将被添加到语句中?
  • 简单,只需有条件地构建查询。 if (!empty($search)) $query .= ' AND name LIKE...';

标签: php mysql sql pdo


【解决方案1】:

好的,让我通过一个简单的LIKE 比较来指导您...

首先,方法签名。全局变量是个坏主意,所以我们将包含 PDO 实例

function getbycategory(PDO $db, $category = null, $search = null, $limit = null)

现在,构建查询并随时收集参数。

$params = [];
$where = [];
if ($category !== null) {
    $where[] = 'main_category = :category';
    $params[':category'] = [
        'val' => (int) $category,
        'type' => PDO::PARAM_INT
    ];
}
if ($search !== null) {
    $where[] = "LOWER(`name`) LIKE CONCAT('%', LOWER(:search), '%')";
    $params[':search'] = [
        'val' => (string) $search,
        'type' => PDO::PARAM_STR
    ];
}
$query = sprintf('SELECT * FROM `parts` %s', implode(' AND ', $where));
if ($limit !== null) {
    $query .= ' LIMIT :limit';
    $params[':limit'] = [
        'val' => (int) $limit,
        'type' => PDO::PARAM_INT
    ];
}

$stmt = $db->prepare($query);
foreach ($params as $key => $param) {
    // use bindValue to avoid problems with variable references in the loop
    // see http://stackoverflow.com/questions/4174524/binding-params-for-pdo-statement-inside-a-loop
    $stmt->bindValue($key, $param['val'], $param['type']);
}

$stmt->execute();
return $stmt->fetchAll(PDO::FETCH_ASSOC);

【讨论】:

    猜你喜欢
    • 2015-03-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-07-20
    • 2010-12-12
    • 2011-07-16
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多