mysql选择多个表和多个或条件

时间:2014-10-21 02:18:56

标签: php mysql

我需要有关sql查询的帮助来选择具有多个"或"的多个表。条件。这是我的数据库架构。

饭店

  • id_hotel
  • id_state
  • id_city
  • HOTEL_NAME

国家

  • id_state
  • STATE_NAME

城市

  • id_city
  • CITY_NAME

这是我一直在尝试的查询,但没有结果。

$sql=mysqli_query($connection,"select * from hotel h, state s, city c where h.id_state=s.id_state and h.id_city=c.id_city and (h.hotel_name='$_GET[data]' or s.state_name='$_GET[data]' or c.city_name='$_GET[data]')");

我尝试使用该代码..但没有结果。请帮帮我们.. tq

1 个答案:

答案 0 :(得分:1)

您的代码存在很多问题,告诉您并解释您需要修复的所有内容需要一段时间,因此我将列出基本内容以及您需要执行的操作。

  1. 您根本没有使用任何错误处理程序,您应该在测试/开发时始终使用它,例如MySQL错误,代码错误等等,这会告诉您一些问题目前有。

    You can read this page for more information on How to get useful error messages in php.

  2. 继续,您在双引号内使用$_GET[data]会使其失去边界,因为您没有为它定义任何内容,如果您有任何错误处理,则会指出它。

    您可以将它连接起来" . $_GET['data'] . ",或者甚至使用花括号来定义其边界,如{$_GET['data']}

  3. 您在查询中直接注入GET元素而不对其进行清理,这是一个很大的错误,欢迎使用SQL注入。

  4. 以上所有内容都基于您向我们展示的一小部分代码,我很害怕看到剩下的代码。

    以下是在查询中使用JOIN以及参数化MySQLi的示例。

    <?php
    // yes we want to see errors
    ini_set('error_reporting', E_ALL);
    
    // Your database info
    $db_host = 'your database host address';
    $db_user = 'your database username';
    $db_pass = 'your database user password';
    $db_name = 'your database name';
    
    $con = mysqli_connect($db_host, $db_user, $db_pass, $db_name);
    if ($con->connect_error)
    {
        die('Connect Error (' . mysqli_connect_errno() . ') '. mysqli_connect_error());
    }
    
    $sql = "SELECT h.id_hotel,
                   h.hotel_name,
                   s.id_state,
                   s.state_name,
                   c.id_city,
                   c.city_name
              FROM hotel h
              JOIN state s
                ON h.id_state = s.id_state
              JOIN city c 
                ON h.id_city = c.id_city
             WHERE h.hotel_name = ? OR 
                   s.state_name = ? OR 
                   c.city_name = ?";
    if (!$result = $con->prepare($sql))
    {
        die('Query failed: (' . $con->errno . ') ' . $con->error);
    }
    
    if (!$result->bind_param('sss', $_GET['data'], $_GET['data'], $_GET['data']))
    {
        die('Binding parameters failed: (' . $result->errno . ') ' . $result->error);
    }
    
    if (!$result->execute())
    {
        die('Execute failed: (' . $result->errno . ') ' . $result->error);
    }
    
    $result->bind_result($hotel_id, $hotel_name, $state_id, $state_name, $city_id, $city_name);
    while ($result->fetch())
    {
        echo $hotel_id, " - ", $hotel_name, " - ", $state_id, " - ", $state_name, " - ", $city_id, " - ", $city_name, "\n";
    }
    $result->close();
    $con->close();
    
相关问题