Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/229.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 通过链接来自另一个表的外键查询来访问Mysql数据库中的行_Php_Mysql_Database - Fatal编程技术网

Php 通过链接来自另一个表的外键查询来访问Mysql数据库中的行

Php 通过链接来自另一个表的外键查询来访问Mysql数据库中的行,php,mysql,database,Php,Mysql,Database,我很难找到从表格中获得结果的最佳方法。我希望一个使用主键从表中获取目标行,另一个使用外键 表的设置与此类似(减去许多其他空间属性): 逻辑流程是:用户Id由会话变量提供。查询数据库表“user”以查找该用户。转到用户类型以确定用户是个人还是场地。假设用户是场馆,转到DB表“场馆”并使用用户表中唯一/索引场馆Id中的外键查询表进行评级 这个查询看起来像 SELECT rating FROM `venue` WHERE `user_Id` = '$user_Id' AND `type` = 'ven

我很难找到从表格中获得结果的最佳方法。我希望一个使用主键从表中获取目标行,另一个使用外键

表的设置与此类似(减去许多其他空间属性):

逻辑流程是:用户Id由会话变量提供。查询数据库表“user”以查找该用户。转到用户类型以确定用户是个人还是场地。假设用户是场馆,转到DB表“场馆”并使用用户表中唯一/索引场馆Id中的外键查询表进行评级

这个查询看起来像

SELECT rating FROM `venue` WHERE `user_Id` = '$user_Id' AND `type` = 'venue'

这可能吗?如果可能,正确的方法是什么?

您有几种方法来检索此信息

使用联接:

SELECT v.rating 
FROM venue v INNER JOIN user u
ON v.venue_id= u.venue_id 
AND u.`user_Id` = '$user_Id' AND u.`type` = 'venue'
在子查询中使用

SELECT rating 
FROM venue 
WHERE venue_id IN (SELECT venue_id FROM user
   WHERE `user_Id` = '$user_Id' AND `type` = 'venue')

BTW,你应该考虑保护你的代码从

你有几种方法来检索这个信息。 使用联接:

SELECT v.rating 
FROM venue v INNER JOIN user u
ON v.venue_id= u.venue_id 
AND u.`user_Id` = '$user_Id' AND u.`type` = 'venue'
子查询中使用

SELECT rating 
FROM venue 
WHERE venue_id IN (SELECT venue_id FROM user
   WHERE `user_Id` = '$user_Id' AND `type` = 'venue')

BTW,你应该考虑保护你的代码,从

它有点不清楚你是怎么解释的。 从我得到的,有2个表用户和地点。 在用户表中,您有:用户id、场馆id、名称、类型。 在场馆表中,您有:场馆id、等级

当您使用存储在user表中的user\u id和type中的WHERE子句时,您希望获得评级(vention表)

您的查询: 从用户标识为“$user\U Id”且类型为“场馆”的场馆中选择分级

不可能像上面那样完成,因为您是从场馆表中选择的,而用户id和类型不是从场馆表中选择的。所以即使你把FK锁上了,也会让它无法辨认。因为FK将只显示并对父子表进行一些约束

查询应该是这样的:

在v.venture\u id=u.venture\u id上从vention v JOIN user u选择评级,其中u.user\u id='$user\u id'和u.type='venture'


如果我错了,请纠正我。

你那样解释有点不清楚。 从我得到的,有2个表用户和地点。 在用户表中,您有:用户id、场馆id、名称、类型。 在场馆表中,您有:场馆id、等级

当您使用存储在user表中的user\u id和type中的WHERE子句时,您希望获得评级(vention表)

您的查询: 从用户标识为“$user\U Id”且类型为“场馆”的场馆中选择分级

不可能像上面那样完成,因为您是从场馆表中选择的,而用户id和类型不是从场馆表中选择的。所以即使你把FK锁上了,也会让它无法辨认。因为FK将只显示并对父子表进行一些约束

查询应该是这样的:

在v.venture\u id=u.venture\u id上从vention v JOIN user u选择评级,其中u.user\u id='$user\u id'和u.type='venture'


如果我错了,请纠正我。

根据具有相等值的列的表组合两个表中的行被称为相等联接操作,这是我们通常用于“遵循”外键关系的模式

例如:

$sql = "SELECT v.rating
          FROM `venue` v
          JOIN `user` s
            ON s.venue_Id = v.venue_Id
           AND s.type` = 'venue'
         WHERE s.user_Id` = '" . mysqli_real_escape_string($con, $user_Id) ."'" 
这不是唯一的模式,还有其他几个查询表单将返回等效的结果

作为使用EXISTS谓词的示例:

$sql = "SELECT v.rating
          FROM `venue` v
         WHERE EXISTS 
               ( SELECT 1 
                   FROM `user` s
                  WHERE s.venue_Id = v.venue_Id
                    AND s.type` = 'venue'
                    AND s.user_Id` = '" 
                         . mysqli_real_escape_string($con, $user_Id) 
                         ."'"
               )";

原始查询似乎易受SQL注入攻击;示例查询演示了如何使用
mysqli\u real\u escape\u string
函数“转义”不安全的值,并使它们安全地包含在SQL文本中。(仅当您使用mysqli接口时,该函数才适用。使用带绑定占位符的准备语句是另一种方法。

基于具有相等值列的表组合两个表中的行被称为相等连接操作,这是我们通常使用的“遵循”模式外键关系

例如:

$sql = "SELECT v.rating
          FROM `venue` v
          JOIN `user` s
            ON s.venue_Id = v.venue_Id
           AND s.type` = 'venue'
         WHERE s.user_Id` = '" . mysqli_real_escape_string($con, $user_Id) ."'" 
这不是唯一的模式,还有其他几个查询表单将返回等效的结果

作为使用EXISTS谓词的示例:

$sql = "SELECT v.rating
          FROM `venue` v
         WHERE EXISTS 
               ( SELECT 1 
                   FROM `user` s
                  WHERE s.venue_Id = v.venue_Id
                    AND s.type` = 'venue'
                    AND s.user_Id` = '" 
                         . mysqli_real_escape_string($con, $user_Id) 
                         ."'"
               )";

原始查询似乎容易受到SQL注入的攻击;示例查询演示了如何使用
mysqli\u real\u escape\u string
函数“转义”不安全的值,并使它们安全地包含在SQL文本中。(只有在使用mysqli界面时,该函数才适用。使用带绑定占位符的准备语句是另一种方法。

@spencer7593尝试加入用户表和地点table@spencer7593尝试加入用户表和场馆表+1。(我的首选是所有符合条件的列引用,包括选择列表中的列,即
select v.rating
。这对查询没有任何直接影响;但有一些好处:1)阅读SQL的人会知道(无需查看表定义)哪个表是列的源。2)稍后,当名为
rating
的列添加到
user
表中时,此查询将继续工作,而不是抛出“不明确的列”错误。+1。(我的首选是所有符合条件的列引用,包括选择列表中的列,即
select v.rating
。这对查询没有任何直接影响;但有一些好处:1)阅读SQL的人会知道(无需查看表定义)哪个表是列的源。2)稍后,当名为
rating
的列添加到
user
表中时,此查询将继续工作,而不是抛出“不明确的列”错误。