Php 合并查询时,合并查询中会显示引号
我一直在为我的搜索功能设计一个过滤系统。总共有4件事情需要排序(组、名、姓、公司),因此可能的差异量使得不可能只对每个可能的过滤器版本的查询进行硬编码 所以我基本上做了一系列的小查询,最后我将它们融合在一起,给出最终的查询。但由于某种原因,我的查询中有引用,这使得它失败了 假设我搜索“vic”这个词,我会得到两个结果,这两个结果都叫victor。他们中的一个在一家公司工作,另一个不在。因此,我将另一个胜利者公司“LexCorp”(我使用蝙蝠侠恶棍作为虚拟数据)输入公司过滤器。现在我应该得到查询:Php 合并查询时,合并查询中会显示引号,php,sql,Php,Sql,我一直在为我的搜索功能设计一个过滤系统。总共有4件事情需要排序(组、名、姓、公司),因此可能的差异量使得不可能只对每个可能的过滤器版本的查询进行硬编码 所以我基本上做了一系列的小查询,最后我将它们融合在一起,给出最终的查询。但由于某种原因,我的查询中有引用,这使得它失败了 假设我搜索“vic”这个词,我会得到两个结果,这两个结果都叫victor。他们中的一个在一家公司工作,另一个不在。因此,我将另一个胜利者公司“LexCorp”(我使用蝙蝠侠恶棍作为虚拟数据)输入公司过滤器。现在我应该得到查询:
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;
}
在php查询中,您这样做会导致问题
$searchquery .= "'$TitelQuery''$VornameQuery''$NachnameQuery''$UnternehmenQuery'";
您可以按如下方式连接php字符串
$searchquery .= "$TitelQuery $VornameQuery $NachnameQuery $UnternehmenQuery";
这将删除所有额外的引用。我同意你应该使用事先准备好的声明的意见,但对于你遇到的问题,在这一部分:
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查询中使用引号,而不是字符串。即使是这样也不安全!了解使用PDO的语句,并考虑使用PDO,如果您使用准备好的语句,您将永远不会再担心查询中的引号。您必须对其进行一点重新构造,并查看单引号在每个串联中的位置。这至少是我在浏览代码时立即看到的。“我假设这就是在SQL中使用变量的方式?”-这不是SQL,此时您正在用PHP处理字符串值。感谢您:)正如您提到的,另一个用户也给出了正确的答案,因为他在前面,我将他的答案标记为正确答案,但是也谢谢你的帮助!