我一直在为我的搜索功能开发过滤系统。总共有4种事物按(组,名字,姓氏,公司)进行排序,因此可能的变体数量使得不可能仅对每个可能的过滤器版本进行硬编码查询。
因此,我基本上做了一堆小查询,最后将它们融合在一起以给出最终查询。但是由于某种原因,我的查询中有引号,这使它失败。
因此,假设我搜索“ vic”一词,则会得到2个被称为victor的结果。其中一个在公司工作,另一个不在。因此,我将另一个Victors公司的“ LexCorp”(我将Batman Villains用于伪数据)输入到公司过滤器中。现在,我应该查询:
SELECT Titel, Vorname, Nachname, Unternehmen, Gruppe, Geschlecht FROM mitglieder WHERE Unternehmen LIKE '%LexCorp%' AND Titel LIKE '%vic%' OR Unternehmen LIKE '%LexCorp%' AND Vorname LIKE '%vic%' OR Unternehmen LIKE '%LexCorp%' AND Nachname LIKE '%vic%'
但是无论出于什么原因,我都会得到:
SELECT Titel, Vorname, Nachname, Unternehmen, Gruppe, Geschlecht FROM mitglieder WHERE'' Unternehmen LIKE '%LexCorp%'' AND Titel LIKE '%vic%''' OR ' Unternehmen LIKE '%LexCorp%'' AND Vorname LIKE '%vic%''' OR ' Unternehmen LIKE '%LexCorp%'' AND Nachname LIKE '%vic%''''
我完全无法标记我在代码中犯的任何错误。有人可以发现我错过的东西吗?
这里有我的PHP:
if(isset($_POST['search'])){
$searchq = $_POST['searchq'];
$gruppenfilter = $_POST['typfilter'];
$vorname = $_POST['vorname'];
$nachname = $_POST['nachname'];
$unternehmen = $_POST['unternehmen'];
$filcounter = 0;
$TitelQuery = NULL;
$VornameQuery = NULL;
$NachnameQuery = NULL;
$UnternehmenQuery = NULL;
$searchquery = "SELECT Titel, Vorname, Nachname, Unternehmen, Gruppe, Geschlecht FROM mitglieder WHERE";
$FilterArray = filterQuery($gruppenfilter, $vorname, $nachname, $unternehmen);
$NoFilter = $FilterArray['NoFilter'];
$FilterQuery = $FilterArray['FilterQuery'];
$nachnameused = $FilterArray['nachnameused'];
$vornameused = $FilterArray['vornameused'];
$unternehmenused = $FilterArray['unternehmenused'];
if($NoFilter == false){
$TitelQuery = "'$FilterQuery' AND Titel LIKE '%$searchq%'";
if($vornameused == false){
$VornameQuery = " OR '$FilterQuery' AND Vorname LIKE '%$searchq%'";
}
if($nachnameused == false){
$NachnameQuery = " OR '$FilterQuery' AND Nachname LIKE '%$searchq%'";
}
if($unternehmenused == false){
$UnternehmenQuery = " OR '$FilterQuery' AND Unternehmen LIKE '%$searchq%'";
}
$searchquery .= "'$TitelQuery''$VornameQuery''$NachnameQuery''$UnternehmenQuery'";
}
else{
$searchquery .= " Titel LIKE '%$searchq%' OR Vorname LIKE '%$searchq%' OR Nachname LIKE '%$searchq%' OR Unternehmen LIKE '%$searchq%'";
}
echo $searchquery;
}
else{
$searchquery = "SELECT Titel, Vorname, Nachname, Unternehmen, Gruppe, Geschlecht FROM mitglieder";
$searchresult = filterTable($searchquery);
}
这里是代码中使用的函数的代码:
function filterQuery ($gruppenfilter, $vorname, $nachname, $unternehmen)
{
$used = false;
$vornameused = false;
$nachnameused = false;
$unternehmenused = false;
$NoFilter = true;
$FilterQuery = "";
if(! empty($gruppenfilter)){
$FilterQuery .= " Gruppe LIKE '%$gruppenfilter%'";
$NoFilter = false;
$used = true;
}
if(! empty($vorname)){
if ($used == true){
$FilterQuery .= " AND Vorname LIKE '%$vorname%'";
}
else{
$FilterQuery .= " Vorname LIKE '%$vorname%'";
$used = true;
$NoFilter = false;
}
$vornameused = true;
}
if(! empty($nachname)){
if ($used == true){
$FilterQuery .= " AND Nachname LIKE '%$nachname%'";
}
else{
$FilterQuery .= " Nachname LIKE '%$nachname%'";
$used = true;
$NoFilter = false;
}
$nachnameused = true;
}
if(! empty($unternehmen)){
if ($used == true){
$FilterQuery .= " AND Unternehmen LIKE '%$unternehmen%'";
}
else{
$FilterQuery .= " Unternehmen LIKE '%$unternehmen%'";
$NoFilter = false;
}
$unternehmenused = true;
}
$FilterArray['NoFilter'] = $NoFilter;
$FilterArray['FilterQuery'] = $FilterQuery;
$FilterArray['nachnameused'] = $nachnameused;
$FilterArray['vornameused'] = $vornameused;
$FilterArray['unternehmenused'] = $unternehmenused;
return $FilterArray;
}
答案 0 :(得分:1)
在您的php查询中,您执行类似操作,从而导致了问题。
$searchquery .= "'$TitelQuery''$VornameQuery''$NachnameQuery''$UnternehmenQuery'";
您可以如下连接php字符串。
$searchquery .= "$TitelQuery $VornameQuery $NachnameQuery $UnternehmenQuery";
这将删除所有多余的引号。
答案 1 :(得分:1)
我同意以下意见:应该使用准备好的语句,但是对于您遇到的问题,在本部分中:
if($NoFilter == false){
$TitelQuery = "'$FilterQuery' AND Titel LIKE '%$searchq%'";
if($vornameused == false){
$VornameQuery = " OR '$FilterQuery' AND Vorname LIKE '%$searchq%'";
}
if($nachnameused == false){
$NachnameQuery = " OR '$FilterQuery' AND Nachname LIKE '%$searchq%'";
}
if($unternehmenused == false){
$UnternehmenQuery = " OR '$FilterQuery' AND Unternehmen LIKE '%$searchq%'";
}
您要删除$ FilterQuery周围的引号
之所以在sql查询的其他部分中用单引号引起来,是为了使SQL正常工作,因为这些变量代表字符串,所以需要使用引号。对于$ FilterQuery,它实际上代表了SQL查询的一部分,而不是其中的字符串。
-编辑-
Lahiru Madusanka提供的答案也是正确的-出于同样的原因,这是一个问题-您在SQL查询中加上引号,而不是字符串