phpMyAdmin:FROM 后忽略默认数据库

标签 php mysql database mysqli phpmyadmin

这是一个非常烦人的异常现象,只发生在 phpMyAdmin 中,而不是通过 php 的 mysqli 或 mysql 命令行发生。

我有两个数据库,foobar
foo.bananaTable.monkeyIdbar.monkey.id

的外键

因此,无论您在哪里执行它,下面的 SQL 都可以按原样正常工作:

SELECT bananaTable.ripeness as 'ripeness'
FROM bar.monkey as monkey
JOIN foo.bananaTable as bananaTable ON bananaTable.monkeyId = monkey.id

现在,如果您导航到 phpMyAdmin 中的 foo 数据库,如果您没有在 SQL 中明确命名,它会有效地使用 foo 作为您的默认数据库。因此,下面的 SQL(在 JOIN 中省略 foo db 范围)应该工作....

SELECT bananaTable.ripeness as 'ripeness'
FROM bar.monkey as monkey
JOIN bananaTable as bananaTable ON bananaTable.monkeyId = monkey.id

它在 php mysqli 和 mysql 命令行中确实有效。但它在 phpMyAdmin 中不起作用 您收到一条错误消息,提示 #1146 Table "bar.bananaTable"doesn't exist

这告诉我 FROM 完全劫持了我在 phpMyAdmin 中的默认数据库。事实上,如果您编辑它并再次运行它,您会注意到它实际上已将您移至 bar 数据库......WTF?

好的,所以我又尝试了一件事情:

USE foo;
SELECT bananaTable.ripeness as 'ripeness'
FROM bar.monkey as monkey
JOIN bananaTable as bananaTable ON bananaTable.monkeyId = monkey.id

...尝试强制它。仍然没有工作!

有人看过吗?这只是 phpMyAdmin 试图变得太聪明的产物吗?有没有以这个为中心的配置?或者这是我需要注意的 MySql 中的一些奇怪之处?我完全支持显式数据库命名,但出于安全原因,我们从一开始就指定默认值。

最佳答案

未指定 phpMyAdmin 版本,但似乎与版本无关。以下测试显示了最新版本的 phpMyAdmin 中的相同行为。在我看来像是一个错误。

-- http://demo.phpmyadmin.net/master-config
-- phpMyAdmin Demo Server: Currently running Git revision RELEASE_4_3_0RC2-1597-g6111104

-- Create table in test database

CREATE TABLE IF NOT EXISTS bar (
  id int(11) NOT NULL,
  `name` varchar(20) NOT NULL,
  fooID int(11) NOT NULL
) ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=latin1;

INSERT INTO bar (id, name, fooID) VALUES
(1, 'first', 1),
(2, 'second', 2);

ALTER TABLE bar
  ADD PRIMARY KEY (id);

-- Create table in world database

CREATE TABLE IF NOT EXISTS `foo` (
  `id` int(11) NOT NULL,
  `val1` int(11) NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=latin1;

INSERT INTO `foo` (`id`, `val1`) VALUES
(1, 10),
(2, 15);

ALTER TABLE `foo`
  ADD PRIMARY KEY (`id`);

-- from world database, where table foo resides

-- this query shows world as the default/selected database, as expected.

SELECT DATABASE();

-- this query should work from world, but fails with #1146 - Table 'test.foo' doesn't exist 

SELECT b.*, f.val1 
FROM test.bar AS b 
LEFT JOIN foo AS f ON f.id = b.fooID
WHERE 1;

-- this query succeeds with an explicit world.foo, but it shouldn't be required

SELECT b.*, f.val1 
FROM test.bar AS b 
LEFT JOIN world.foo AS f ON f.id = b.fooID
WHERE 1;

关于phpMyAdmin:FROM 后忽略默认数据库,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28376409/

相关文章:

javascript - 使用 onerror 为不支持的浏览器提供 .webp 图像是否安全?

sql - 使 MS SQL Server 中的表仅可用于插入?

php - 如何使用 mysql 更新查询 (php) 增加一个值

database - 批评我的身份验证系统数据库架构?

php - 如何在 phpBB 论坛上创建与已保存的用户名和密码相同的用户名和密码

php - 百胜升级到 PHP 5.4?

PHP:河豚算法给出 *0 作为输出

php - yii框架中数据库迁移错误

mysql - 仅将匹配的数据从 CSV 导入到 MySQL

mysql 查询两个表