MySQL搜索多个列中的多个关键字

时间:2015-08-19 05:26:31

标签: php mysql

我尝试使用MySQL和&amp ;;在同一个表中的多个列中搜索多个关键字PHP。

我得到的当前错误是: 警告:mysql_fetch_assoc()期望参数1是资源,布局在第66行的......中给出

我在下面的第66行标注了评论。

我已经阅读了大约15个帖子,到目前为止我无法找到解决方案。任何帮助将不胜感激!

数据库表:

**Table Name:** coffee
    **Field:  Type:**
    name    varchar(255)    
    digs    int(10)         
    roaster     varchar(255)    
    roastlevel  varchar(255)    
    flavor  varchar(255)    
    price   varchar(255)    
    description     text 

HTML:

<form class="navbar-form searchbox" action="search.php" role="search">
      <div class="input-group">
            <input type="text" class="form-control" placeholder="Enter Coffee Name" name="term" id="srch-term">
            <div class="input-group-btn">
                <button class="btn btn-default" type="submit" value="search">
                    <span class="glyphicon glyphicon-search"></span>
                </button>

PHP(来自search.php)

<?php

if (empty($_GET['term']) === false){
    $search_results = search_posts($_GET['term']);

    if (empty($search_results)){
        echo 'Your search returned no results.';
        }

        foreach ($search_results as $result){
            $string = preg_replace('/\s+/', '', $result['title']);
            echo "<a href='{$string}-profile.php'> 
            <h4>{$result['title']}  </h4></a>";
            }
    }


function search_posts($term){
    $keywords = preg_split('#\s+#', mysql_real_escape_string($term));   
    $name_where = "'name' LIKE '%" . implode("%' OR 'name' LIKE '%", $keywords) . "%'";
    $roaster_where = "'roaster' LIKE '%" . implode("%' OR 'roaster' LIKE '%", $keywords) . "%'";  
    $roastlevel_where = "'roastlevel' LIKE '%" . implode("%' OR 'roastlevel' LIKE '%", $keywords) . "%'";     
    $flavor_where = "'flavor' LIKE '%" . implode("%' OR 'flavor' LIKE '%", $keywords) . "%'"; 
    $description_where = "'description' LIKE '%" . implode("%' OR 'description' LIKE '%", $keywords) . "%'";     


    $sql = "SELECT
            'name',
            'roaster',
            'roastlevel',
            'flavor',
            LEFT('description'), 100)                
        FROM 'coffee'
        WHERE {$name_where}
        OR {$roaster_where} 
        OR {$roastlevel_where}                
        OR {$flavor_where}
        OR {$description_where}";   

    $result = mysql_query($sql);
    $results = array();

    while (($row = mysql_fetch_Assoc($result)) !== false){ /*Line 66*/
        $results[] = $row;  
    }

    return $results;

}

?>

2 个答案:

答案 0 :(得分:2)

根据 b0s3 的建议,请勿在列名称周围添加撇号。 试试这个来解决当前的问题:

$sql = "SELECT
        name,
        roaster,
        roastlevel,
        flavor,
        LEFT(description), 100)                
    FROM coffee
    WHERE {$name_where}
    OR {$roaster_where} 
    OR {$roastlevel_where}                
    OR {$flavor_where}
    OR {$description_where}";   

即使在你的where变量中,也要避免使用带有列名的撇号。

此外,您使用的是LEFT('description'), 100),它的作用是尝试从单词description中提取前100个字符。如果您想从列中提取,请不要在那里使用任何撇号。

是的,我会支持关于使用PDO的其他意见。请参阅评论中 Tim Ogilvy 分享的内容。

答案 1 :(得分:0)

如果连接到数据库,您没有连接到数据库使用pdo或mysqli: mysql_query中的错误($ sql, - &gt; $ connection&lt; - ); mysql_fetch_Assoc($结果, - &GT; $连接);

查找: 使用搜索谷歌

 <div id="searchbar" class="left">
                    <form method="get" action="http://www.google.com/search" target="_blank" >
                    <input type="hidden" name="sitesearch" value="your site" />
                        <input type="hidden" name="domains" value="your site" />
                        <input type="hidden" value="fa" name="hl" />
                        <input name="ie" value="UTF-8" type="hidden" />
            <input name="oe" value="UTF-8" type="hidden" />
                        <input type="text" class="s-field right" name="q" />

                    </form>