Php 用于搜索的SQL查询帮助

Php 用于搜索的SQL查询帮助,php,html,mysql,sql,search,Php,Html,Mysql,Sql,Search,我有3个表格,分别是“图片”、“图片标签”和“标签”。 有一个搜索框,用户在其中键入要搜索的图像的名称。当用户输入这个术语时,我希望它显示名称、描述和图像 例如,如果用户使用“sun”标记图像,则不会显示该图像。 我已经尝试了很多方法,但我认为我的代码中可能有某种东西阻止了这一点。当搜索“标记”时,我尝试执行的查询不会显示图像,因此我可以使用哪种查询 查询是: $sql = " SELECT pictures.idpic, pictures.name, pictures.info, pi

我有3个表格,分别是“图片”、“图片标签”和“标签”。 有一个搜索框,用户在其中键入要搜索的图像的名称。当用户输入这个术语时,我希望它显示名称、描述和图像

例如,如果用户使用“sun”标记图像,则不会显示该图像。 我已经尝试了很多方法,但我认为我的代码中可能有某种东西阻止了这一点。当搜索“标记”时,我尝试执行的查询不会显示图像,因此我可以使用哪种查询

查询是:

$sql = "
    SELECT pictures.idpic, pictures.name, pictures.info, pictag.tagpicID, pictag.pictagName, tagging.IDimage, tagging.tagpicID 
    FROM pictures, pictag, tagging 
    WHERE pictures.idpic = '$searchvalueentered ' 
    AND pictag.tagpicID= '$searchvalueentered ' 
    AND tagging.tagpicID= '$searchvalueentered '";

我不太明白你在做什么,这三个表是用来做什么的,但是你有没有试着在where子句中使用“OR”而不是“and”。我有预感问题就在那里。

试试这个

$sql = "
    SELECT pictures.idpic, pictures.name, pictures.info, pictag.tagpicID, pictag.pictagName, tagging.IDimage, tagging.tagpicID 
    FROM pictures, pictag, tagging 
    WHERE pictures.idpic = '" . $searchvalueentered . "' 
    OR pictag.tagpicID = '" . $searchvalueentered . "' 
    OR tagging.tagpicID = '" . $searchvalueentered . "'
";
顺便说一下,你应该考虑使用准备好的语句。这是非常不安全的

$sql = "
    SELECT pictures.idpic, pictures.name, pictures.info, pictag.tagpicID, pictag.pictagName, tagging.IDimage, tagging.tagpicID 
    FROM pictures, pictag, tagging
    WHERE pictures.idpic = '$searchvalueentered ' 
    OR pictag.tagpicID= '$searchvalueentered ' 
    OR tagging.tagpicID= '$searchvalueentered '";
这将起作用,但实际上您希望加入表,否则您将在结果中获得重复的记录(可能这就是您想要的)

假设pictag和标记是图片表的1:1关系,我建议您尝试以下方法:

SELECT pictures.idpic, pictures.name, pictures.info, pictag.tagpicID, pictag.pictagName, tagging.IDimage, tagging.tagpicID 
FROM pictures
LEFT JOIN pictag ON pictures.idpic = pictag.tagpicID
LEFT JOIN tagging ON pictures.idpic = tagging.tagpicID
WHERE pictures.idpic = '$searchvalueentered';

我无法为您测试查询,但我怀疑这会产生预期的结果,因为所有表都由“idpic”键关联。

正如David提到的,您应该尝试加入表以消除重复项并简化搜索,您可以尝试

SELECT 
    pictures.idpic, 
    pictures.name, 
    pictures.info, 
    pictag.tagpicID, 
    pictag.pictagName, 
    tagging.IDimage, 
    tagging.tagpicID 
FROM pictures
INNER JOIN pictag 
    ON pictures.idpic = pictag.tagpicID
INNER JOIN tagging 
    ON pictures.idpic = tagging.tagpicID
WHERE 
    CONCAT_WS(' ',pictures.idpic,pictag.tagpicID,tagging.tagpicID) LIKE %$searchvalueentered%

注意:这不是一个非常优化的解决方案。

请尝试在where条件下使用或代替和。还有一件事,根据您的查询输入,搜索词必须与数据库值匹配。我不认为这样更好。使用LIKE代替“=”…嗨。。其中是三个表之间的关系。。研究一下这个问题。可能是表之间没有关系。如果表存储来自不同来源的图像,而OP希望在其中任何一个中搜索一个名称,则不需要联接。@David,谢谢您的建议David。我一直在尝试sql代码,但是,当搜索“标记的名称”时,图像仍然没有显示在屏幕上。您是否认为这可能与“whileloop”有关,因为我已经对此进行了调整,但我得到了以下错误:警告:mysql_fetch_array()期望参数1是resource,布尔值在第45行的C:\xampp\htdocs\pictures\testingsearch.php中给出。我相信此错误是由于whileloop造成的:$result=mysql_query($sql);虽然($row=mysql\u fetch\u array($result)){}啊,我确实对PHP了解很多。我喜欢使用PEAR MDB2或Laravel,但不太经常使用原生方法。您可以检查查询或向逻辑中添加一些错误处理。例如-
$result=mysql\u query($sql)或die(mysql\u error());while($row=mysql\u fetch\u数组($result)){-etc.
.mysql\u query在出错时返回false。我的最后一条评论可能不明显,但如果
$result
是布尔false,那么
mysql\u fetch\u array
将爆炸。此外,如果您还没有尝试过,请查看mysql query Browser或mysql Workbench以调试您的查询。这是在开发过程中对您的工作流的一个很好的补充ng.感谢Hector的帮助,但是,当搜索“标记的名称”时,图像仍然没有显示在屏幕上。你认为这可能与whileloop有关吗,因为我已经对此进行了调整,但出现以下错误:警告:mysql\u fetch\u array()参数1应该是资源,布尔值在第45行的C:\xampp\htdocs\pictures\testingsearch.php中给出。我相信这个错误是由于whileloop:$result=mysql\u query($sql);while($row=mysql\u fetch\u array($result)){}