MYSQL,JOIN,AS,LIKE

时间:2014-04-27 01:06:02

标签: php mysql sql

我对SQL或DB的知识非常有限,所以请提前道歉。

我试图在网页中创建一个类似于结构的表,一个用于餐饮名称的列和一个用于成分的列 - 它也可以通过按钮进行搜索。

编辑:

感谢所有回复,他们最有帮助。 错误不再发生,但是现在我没有得到数据库的结果,但没有错误。

include("inc/dbConn.php"); /////$db_conx

if(isset($_POST["search"])){   
    $searchq = $_POST["search"];
    $sql ="
           SELECT main_meal.name, ingred.name
           FROM main_meal
           JOIN meal_ingred on meal_ingred.meal_id = main_meal.id
           JOIN ingred ON ingred.id = meal_ingred.ingred_id
           WHERE ingred.name LIKE '%$searchq%'";
    $results = $db_conx->query($sql);   
    var_dump($results);
    if($results->num_rows){

        while ($row =$results->fetch_object()){
            echo "{$row->name} ({$row->name})<br>";

        }     
    }    
}

为了澄清这里是我的结构:

(对不起外部链接,我没有足够的声誉来发布图片。)

http://i30.photobucket.com/albums/c340/Tyrage/Untitled-2_zpsc48126b3.png

$ results转储:

object(mysqli_result)#2(5){[“current_field”] =&gt; int(0)[“field_count”] =&gt; int(2)[“lengths”] =&gt; NULL [“num_rows”] =&gt; int(0)[“type”] =&gt; int(0)}

很明显,我不知道自己在做什么,所以感谢任何帮助。

感谢。

4 个答案:

答案 0 :(得分:2)

这里缺少关系表,它会存储膳食和食材之间的联系。

您的查询中也有错误,因为首先您尝试正确使用/ b命名,命名列,然后使用它来命名表。

恕我直言,你应该这样做(添加关系表):

if(isset($_POST["search"])){   
    $searchq = $_POST["search"];
    $sql ="
           SELECT main_meal.name AS a, ingred.name as b
           FROM main_meal 
           JOIN rel_meal_ingred on rel_meal_ingred.meal_id = main_meal.id
           JOIN ingred ON ingred.id =  rel_meal_ingred.ingred_id
           where ingred.name LIKE '%$searchq%'";

    $results = $db_conx->query($sql);   

       if($results->num_rows){ //////line 15
       while ($row =$results->fetch_object()){
       echo "{$row->a} ({$row->b})<br>";

       }       
       }    
}

答案 1 :(得分:1)

行号会有所帮助,看看第15行是否为$ results的赋值,或者第15行是$ results-&gt; num_rows

我还假设您在代码中的某处有一个$ db_conx-&gt; connect命令,以便在运行查询之前打开数据库连接?

答案 2 :(得分:1)

您的SQL查询无效:WHERE子句中没有ingred.name这样的列,因为您已将该表重命名为b

没有理由在此查询中重命名表(使用AS ...)。将该条款保留。然后添加一个连接条件(例如,... JOIN ingred ON (...) - 省略此操作将使查询从main_meal返回每一行。

此外,您的代码中可能存在SQL注入漏洞,因为您正在将(可能未经过滤的)$searchq变量的内容插入到查询中。使用查询占位符作为LIKE的参数。

答案 3 :(得分:1)

你可以尝试一下吗?

SELECT * 
FROM main_meal
JOIN meal_ingred ON meal_ingred.meal_id = main_meal.id
JOIN ingred ON meal_ingred.meal_id = main_meal.id
WHERE ingred.ingredName LIKE  '%bread%'
LIMIT 0 , 30

使用php如下:

<?php
if(isset($_POST["search"])){
    $searchq = $_POST["search"];
    $sql ="
        SELECT * 
FROM main_meal
JOIN meal_ingred ON meal_ingred.meal_id = main_meal.id
JOIN ingred ON meal_ingred.meal_id = main_meal.id
WHERE ingred.ingredName LIKE  '%$searchq%'
LIMIT 0 , 30
          ";
    //$results = $db_conx->query($sql);
    if (!$results = $db_conx->query($sql)) {
        printf("Error: %s\n", $db_conx->error);
    }
    $count = $results->num_rows;

    if($count > 0){
        while($row=$results->fetch_assoc()){
            echo $row['ingredName'];
            echo $row['name'] . "<br />";
            $output="ff";
        }
    }
}

?>