0

如何使用函数从数据库中提取多行?

我的功能是:

function search($subject, $table) {
    $query = "SELECT {$subject} ";
    $query .= "FROM {$table} ";
    $content = mysql_query($query);
    return $content;
}

在调用该函数的页面上,我拥有:

if (isset($_POST['search'])){
    $search = $_POST['search'];
}

$content = search($subjectName, $tableName);

while ($results = mysql_fetch_assoc($content)){
    $phrase = $results[$subjectName];
    //if phrase exists in database
    if (strpos($search,$phrase) !== false) {
        echo $phrase;
    //if phrase does not exist in database
    } else {
        echo 'fail';    
}

此设置不起作用,但是,如果我将所有内容都放入它的功能中:

function search($subject, $table, $where = 0, $is = 0) {
    global $search;
    $query = "SELECT {$subject} ";
    $query .= "FROM {$table} ";
    if ($where > 0) {
        $query .= "WHERE {$where} = '{$is}' ";
    }
    $content = mysql_query($query);
    while ($results = mysql_fetch_assoc($content)){
        $phrase = $results[$subject];
        //if phrase exists in database
        if (strpos($search,$phrase) !== false) {
            echo $phrase;
        //if phrase does not exist in database
        } else {
            echo 'fail';
        }
    }
    return $content;
}

在页面上:

search('main_subject', 'main_search');

问题是我想在 if 语句中再次调用该函数以使其搜索另一个短语。有没有更简单的方法来做到这一点?

编辑:当前设置将第一项拉入无限循环。

4

1 回答 1

2

这里有很多问题需要解决:

首先,如果您尝试在字段中搜索特定的部分匹配项,您可能希望使用 SQLLIKE构造。

SELECT field FROM table WHERE field LIKE '%search phrase%'

这样做将消除您遍历每一行尝试对搜索短语进行字符串比较的需要,因为您只会返回与搜索短语匹配的行,仅此而已。

其次,global用于使数据可用于您的功能是非常糟糕的做法。您确实应该将函数所需的任何数据作为参数传递给函数。这将包括您的搜索字符串,可能还有您的数据库连接/对象。

function search($field, $table, $search, $db) {
    ...
}

第三,您现在根本没有采取任何措施来防止 SQL 注入。您需要转义输入数据,或者最好使用准备好的语句。

第四,你真的不应该使用这些mysql_*功能。它们已被弃用。尝试使用mysqlior PDO(我强烈建议您继续学习如何将准备好的语句与其中任何一个一起使用。)您可以从mysqli开始mysql_*更喜欢面向对象的用法)。

第五,你原来的问题。如果您想搜索多个短语,可以采取几种方法。您可以像这样一次传递所有短语:

SELECT field FROM table WHERE field LIKE '%search phrase%' OR field LIKE '%another search phrase%'

或者,您可以只进行迭代函数调用以获得您想要的结果。这实际上取决于您是否只想在第一个短语不成功时搜索第二个短语(使用迭代方法),或者您是否只想在一个查询中找到所有可能的匹配项(使用 LIKE-OR-LIKE 方法)。

于 2013-01-22T18:24:39.840 回答