2014-10-21 6 views
-1

Мне нужна помощь по запросу sql, чтобы выбрать несколько таблиц с несколькими «или» условиями. это моя схема базы данных.mysql select on multiple table и multiple или condition

Отель

  • 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

'$ _GET [данные]' непосредственно в запросе? Какой кошмар! См. [Как я могу предотвратить SQL-инъекцию в PHP?] (Http://stackoverflow.com/questions/60174/how-can-i-prevent-sql-injection-in-php) – ForguesR

+0

Это просто пример чувак .. Я ценю ваше предложение .. но это не решает мою проблему .. я думаю, что вы вне форума –

+0

Пожалуйста, определите * nothing *: empty resulset, error или blank page? – ForguesR

ответ

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-инъекции.

Все вышеизложенное основано на небольшой части кода, которую вы нам показали, и я боюсь видеть остальную часть.

Вот пример того, как он будет выглядеть так: JOIN s в вашем запросе вместе с параметризованным 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(); 
+0

ничего себе ... это удивительный чувак ... очень круто ... Ты не только помог решить мои проблемы, но и показал мне способ стать лучшим программистом. Я действительно ценю твою помощь. и большое спасибо –