如何使用函数从数据库中提取多行?
我的功能是:
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语句中再次调用该函数来让它搜索另一个短语。有更简单的方法吗?
编辑:当前设置会在无限循环中拉出第一个项目。
答案 0 :(得分:2)
这里应该解决许多问题:
首先,如果您尝试在字段中搜索特定的部分匹配,则可能需要使用SQL LIKE
构造。
SELECT field FROM table WHERE field LIKE '%search phrase%'
执行此操作将消除您迭代遍历每行尝试对搜索短语进行字符串比较的需要,因为您只返回与搜索短语匹配的行,而不再返回。
其次,使用global
为您的函数提供数据是非常糟糕的做法。您确实应该将函数所需的任何数据作为参数传递给函数。这将包括您的搜索字符串,可能还包括您的数据库连接/对象。
function search($field, $table, $search, $db) {
...
}
第三,你现在什么都不做,以防止SQL注入。您需要转义输入数据,或者更好地使用预准备语句。
第四,你真的不应该使用mysql_*
函数。它们已被弃用。尝试使用mysqli
或PDO
(我强烈建议您继续学习如何使用其中任何一个准备好的语句。)您可以从mysqli
开始,它提供类似的程序功能到mysql_*
所以学习曲线可能不那么陡峭(尽管真正最有经验的开发人员更喜欢面向对象的用法)。
第五,对你原来的问题。如果您想搜索多个短语,可以采取几种方法。您可以像这样一次传递所有短语:
SELECT field FROM table WHERE field LIKE '%search phrase%' OR field LIKE '%another search phrase%'
或者,您可以进行迭代函数调用以获得所需的结果。这实际上取决于你是否只想搜索第二个短语,如果第一个不成功(使用迭代方法)或者你是否只想在一个查询中使用所有可能的匹配(使用LIKE-OR-LIKE方法)。