【发布时间】:2016-12-31 09:55:52
【问题描述】:
我正在使用 Codeigniter 查询生成器来生成我的 SQL 查询。通过$this->db->get() 运行查询时,结果由PK 列中的空值组成,这是不正确的(证据如下)。
在查看生成的 SQL 查询时,通过$this->db->get_compiled_select(),确认 SQL 查询已正确创建。此外,我以两种不同的方式测试了 SQL 查询:
- 通过直接在 MySQL 上执行。得到的结果是正确的,并且在任何 PK 列中都不包含空值。
- 通过再次运行 Codeigniter,但这次使用
$this->db->query('SQL query string')。同样,获得的结果是正确的,并且在任何 PK 列中都不包含空值。
除此之外,我还按照this resource 中的说明打开了通用查询日志,记录了发送到 MySQL 的查询。在所有 3 种情况下(即通过查询构建器类运行查询,直接通过 MySQL 命令行运行查询,以及通过 codeigniter 运行查询,但使用 $this->db->query()),MySQL 接收到的 SQL 查询为一样的。
鉴于上述证据,我得出的结论是否正确,这是 Codeigniter 查询生成器类中的一个错误?还是我错过了其他一些错误来源?
下面是我的表格内容和源代码:
餐厅餐桌:
RestaurantID Name
1 Awesome Bar
2 Disco Deewaane
3 Decibel Disco
4 Basswaala Bar
Outlet Table(RestaurantID 列是 Restaurant Table 的 FK):
OutletID RestaurantID Name Address Phone Latitude Longitude
1 1 [->] Awesome Bar Roop Nagar 9837464231 0 0
2 1 [->] Aww Bar Prem Bhavan 8461232871 0 0
3 2 [->] Disco Deewaane Gali Number 420 8372313874 0 0
4 2 [->] Decibel Disc Excuse Me Please 9833346521 0 0
5 3 [->] Disc Dec Roop Nagar 8375643111 0 0
6 4 [->] Bass Down Low Prem Bhavan 9988843511 0 0
7 4 [->] Baby ka Bass Bar Gali Number 420 8883741234 0 0
8 4 [->] Basswaala Bar Excuse Me Please 9993741236,8843621439 0 0
OutletTable 表(OutletID 是 Outlet 表的 FK):
TableID OutletID TableNumber Capacity Smoking Available
1 1 [->] 1 6 0 1
2 1 [->] 2 6 0 1
3 1 [->] 3 8 1 1
4 2 [->] 1 4 1 1
5 2 [->] 2 4 1 1
6 2 [->] 3 6 1 1
7 3 [->] 1 6 1 1
8 3 [->] 2 6 1 1
9 3 [->] 3 4 1 1
10 3 [->] 4 5 1 1
11 1 [->] z 10 1 0
有问题的查询:
SELECT *
FROM `Restaurant`
RIGHT JOIN `Outlet` ON `Restaurant`.`RestaurantID` = `Outlet`.`RestaurantID`
LEFT JOIN `OutletTable` ON `Outlet`.`OutletID` = `OutletTable`.`OutletID`
查询的正确结果:
使用查询生成器类时实际得到的结果
注意从 index 11 开始,OutletID 没有正确报告并且获得了null(这就是它在下面的 print_r 输出中显示为空白的原因):
Array
(
[0] => stdClass Object
(
[RestaurantID] => 1
[Name] => Awesome Bar
[OutletID] => 1
[Address] => Roop Nagar
[Phone] => 9837464231
[Latitude] => 0
[Longitude] => 0
[TableID] => 1
[TableNumber] => 1
[Capacity] => 6
[Smoking] => 0
[Available] => 1
)
[1] => stdClass Object
(
[RestaurantID] => 1
[Name] => Awesome Bar
[OutletID] => 1
[Address] => Roop Nagar
[Phone] => 9837464231
[Latitude] => 0
[Longitude] => 0
[TableID] => 2
[TableNumber] => 2
[Capacity] => 6
[Smoking] => 0
[Available] => 1
)
[2] => stdClass Object
(
[RestaurantID] => 1
[Name] => Awesome Bar
[OutletID] => 1
[Address] => Roop Nagar
[Phone] => 9837464231
[Latitude] => 0
[Longitude] => 0
[TableID] => 3
[TableNumber] => 3
[Capacity] => 8
[Smoking] => 1
[Available] => 1
)
[3] => stdClass Object
(
[RestaurantID] => 1
[Name] => Awesome Bar
[OutletID] => 1
[Address] => Roop Nagar
[Phone] => 9837464231
[Latitude] => 0
[Longitude] => 0
[TableID] => 11
[TableNumber] => z
[Capacity] => 10
[Smoking] => 1
[Available] => 0
)
[4] => stdClass Object
(
[RestaurantID] => 1
[Name] => Aww Bar
[OutletID] => 2
[Address] => Prem Bhavan
[Phone] => 8461232871
[Latitude] => 0
[Longitude] => 0
[TableID] => 4
[TableNumber] => 1
[Capacity] => 4
[Smoking] => 1
[Available] => 1
)
[5] => stdClass Object
(
[RestaurantID] => 1
[Name] => Aww Bar
[OutletID] => 2
[Address] => Prem Bhavan
[Phone] => 8461232871
[Latitude] => 0
[Longitude] => 0
[TableID] => 5
[TableNumber] => 2
[Capacity] => 4
[Smoking] => 1
[Available] => 1
)
[6] => stdClass Object
(
[RestaurantID] => 1
[Name] => Aww Bar
[OutletID] => 2
[Address] => Prem Bhavan
[Phone] => 8461232871
[Latitude] => 0
[Longitude] => 0
[TableID] => 6
[TableNumber] => 3
[Capacity] => 6
[Smoking] => 1
[Available] => 1
)
[7] => stdClass Object
(
[RestaurantID] => 2
[Name] => Disco Deewaane
[OutletID] => 3
[Address] => Gali Number 420
[Phone] => 8372313874
[Latitude] => 0
[Longitude] => 0
[TableID] => 7
[TableNumber] => 1
[Capacity] => 6
[Smoking] => 1
[Available] => 1
)
[8] => stdClass Object
(
[RestaurantID] => 2
[Name] => Disco Deewaane
[OutletID] => 3
[Address] => Gali Number 420
[Phone] => 8372313874
[Latitude] => 0
[Longitude] => 0
[TableID] => 8
[TableNumber] => 2
[Capacity] => 6
[Smoking] => 1
[Available] => 1
)
[9] => stdClass Object
(
[RestaurantID] => 2
[Name] => Disco Deewaane
[OutletID] => 3
[Address] => Gali Number 420
[Phone] => 8372313874
[Latitude] => 0
[Longitude] => 0
[TableID] => 9
[TableNumber] => 3
[Capacity] => 4
[Smoking] => 1
[Available] => 1
)
[10] => stdClass Object
(
[RestaurantID] => 2
[Name] => Disco Deewaane
[OutletID] => 3
[Address] => Gali Number 420
[Phone] => 8372313874
[Latitude] => 0
[Longitude] => 0
[TableID] => 10
[TableNumber] => 4
[Capacity] => 5
[Smoking] => 1
[Available] => 1
)
[11] => stdClass Object
(
[RestaurantID] => 2
[Name] => Decibel Disc
[OutletID] =>
[Address] => Excuse Me Please
[Phone] => 9833346521
[Latitude] => 0
[Longitude] => 0
[TableID] =>
[TableNumber] =>
[Capacity] =>
[Smoking] =>
[Available] =>
)
[12] => stdClass Object
(
[RestaurantID] => 3
[Name] => Disc Dec
[OutletID] =>
[Address] => Roop Nagar
[Phone] => 8375643111
[Latitude] => 0
[Longitude] => 0
[TableID] =>
[TableNumber] =>
[Capacity] =>
[Smoking] =>
[Available] =>
)
[13] => stdClass Object
(
[RestaurantID] => 4
[Name] => Bass Down Low
[OutletID] =>
[Address] => Prem Bhavan
[Phone] => 9988843511
[Latitude] => 0
[Longitude] => 0
[TableID] =>
[TableNumber] =>
[Capacity] =>
[Smoking] =>
[Available] =>
)
[14] => stdClass Object
(
[RestaurantID] => 4
[Name] => Baby ka Bass Bar
[OutletID] =>
[Address] => Gali Number 420
[Phone] => 8883741234
[Latitude] => 0
[Longitude] => 0
[TableID] =>
[TableNumber] =>
[Capacity] =>
[Smoking] =>
[Available] =>
)
[15] => stdClass Object
(
[RestaurantID] => 4
[Name] => Basswaala Bar
[OutletID] =>
[Address] => Excuse Me Please
[Phone] => 9993741236,8843621439
[Latitude] => 0
[Longitude] => 0
[TableID] =>
[TableNumber] =>
[Capacity] =>
[Smoking] =>
[Available] =>
)
)
【问题讨论】:
-
对不起!查询正确但产生错误结果!! 不计算!植入逻辑炸弹
-
你能告诉我们你说的这个数组是如何创建的吗?这可能非常相关
-
这是否证明了黑客帝国是真实的?不过说真的,我不知道如何调试它。从 $this->db->get_compiled_select() 获得的查询,在 $this->db->query() 中使用时,生成的结果与 $this->db->get() 不同!
标签: php mysql sql codeigniter