Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/267.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/PDO/SQLite3中自然连接的问题_Php_Sqlite - Fatal编程技术网

PHP/PDO/SQLite3中自然连接的问题

PHP/PDO/SQLite3中自然连接的问题,php,sqlite,Php,Sqlite,“自然连接”语法似乎在我的PHP5.3环境中工作得不太好。 我使用PDO访问SQLite3引擎 请参见下面的示例,我想在其中存储用户的各种访问权限: CREATE TABLE user ( id_u integer PRIMARY KEY, name text); CREATE TABLE access ( id_a integer PRIMARY KEY, id_u integer, area text, granted

“自然连接”语法似乎在我的PHP5.3环境中工作得不太好。 我使用PDO访问SQLite3引擎

请参见下面的示例,我想在其中存储用户的各种访问权限:

CREATE TABLE user (
    id_u  integer PRIMARY KEY,
    name  text);

CREATE TABLE access (
    id_a    integer PRIMARY KEY,
    id_u    integer,
    area    text,
    granted text,
    FOREIGN KEY(id_u) REFERENCES user(id_u));
经过一些说明后,表中包含以下内容:

id_u  name
---- ------
1    Igor
2    Rebecca  

id_a id_u area    granted
---- ---- ------- -------
1    1    kitchen full
2    2    kitchen restricted
3    1    lab     forbidden
现在,如果我执行此查询:

SELECT granted FROM user U 
    INNER JOIN access A USING (id_u) 
    WHERE U.name='Igor' and A.area='kitchen';
我得到了预期的结果(
full

但是,此查询:

SELECT granted FROM user U 
    NATURAL INNER JOIN access A
    WHERE U.name='Igor' and A.area='kitchen';
没有结果

第二个查询是否有问题,或者PDO和/或SQLite3在这里的行为是否有趣

编辑:根据要求,我添加了一个示例来演示问题

它在SQLite的两个变体下工作,但在我自己的环境中却失败了。具体的PDO接口、SQLite版本或我发送请求的方式是否有问题,我不知道。这是一个需要帮助的地方。

在MySql上尝试过这一点(因为它是一个关键字,所以必须使用RRRight):

这相当于标准SQL中的第二个查询:

select rright
from user u, access a
where u.id_u=a.id_u and u.name='Igor' and a.area='kitchen';
结果是:

+--------+
| rright |
+--------+
| full   |
+--------+
1 row in set (0.00 sec)

如果您尝试:从用户U中选择right,自然加入访问A,其中U.name='Igor'和A.area='kitchen';access表的area属性在DDL中指定为integer,但在querySorry中用作字符串,在我的实际应用程序中它是一个整数,为了更清楚一点,我在示例中将它更改为字符串。我编辑了这个问题,以删除这个打字错误。至于使用“自然连接”而不是“自然内部连接”,这没有什么区别。你的答案是:我在提问之前看到了这个问题,但我不确定这是同一个问题。在我的例子中,只有一个连接,所以运算符优先级不起作用。这种语法很好用,但据我所知,内部连接和自然连接也是标准的SQL,对吗?我不确定它是否是标准的,但它应该是一样的。我通常应用自然连接作为对笛卡尔积(DB术语)的限制。没有意识到你的问题集中在让自然连接到workWell上,根据各种第二来源(因为实际的文档必须在日内瓦购买),自然可以追溯到ISO SQL-92。我在使用另一个语法变体时几乎没有问题,但我很惊讶地看到没有提到这个明显不正确的关键字(可能仅在PHP/PDO上下文中)同时,SQLite自己的教程声称它很有魅力。这让我想起有人要惩罚一个学生,因为他没有在MySql DDL代码中加入域检查约束,只是为了听他说:但是MySql先生没有强制执行检查约束,那么为什么还要费心去做呢?在学生添加了检查之后:“祝贺你,年轻人,你的代码不起作用,但根据它应该遵循的规则”:。现在,严肃地说,各位。。。
+--------+
| rright |
+--------+
| full   |
+--------+
1 row in set (0.00 sec)