我需要有关sql查询的帮助来选择具有多个"或"的多个表。条件。这是我的数据库架构。
饭店
国家
城市
这是我一直在尝试的查询,但没有结果。
$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
答案 0 :(得分:1)
您的代码存在很多问题,告诉您并解释您需要修复的所有内容需要一段时间,因此我将列出基本内容以及您需要执行的操作。
您根本没有使用任何错误处理程序,您应该在测试/开发时始终使用它,例如MySQL错误,代码错误等等,这会告诉您一些问题目前有。
You can read this page for more information on How to get useful error messages in php
.
继续,您在双引号内使用$_GET[data]
会使其失去边界,因为您没有为它定义任何内容,如果您有任何错误处理,则会指出它。
您可以将它连接起来" . $_GET['data'] . "
,或者甚至使用花括号来定义其边界,如{$_GET['data']}
您在查询中直接注入GET元素而不对其进行清理,这是一个很大的错误,欢迎使用SQL注入。
以上所有内容都基于您向我们展示的一小部分代码,我很害怕看到剩下的代码。
以下是在查询中使用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();