【问题标题】:Query builder in Codeigniter generates correct SQL statement, but executing the query leads to incorrect resultsCodeigniter 中的查询生成器生成正确的 SQL 语句,但执行查询会导致错误的结果
【发布时间】:2016-12-31 09:55:52
【问题描述】:

我正在使用 Codeigniter 查询生成器来生成我的 SQL 查询。通过$this->db->get() 运行查询时,结果由PK 列中的空值组成,这是不正确的(证据如下)。

在查看生成的 SQL 查询时,通过$this->db->get_compiled_select(),确认 SQL 查询已正确创建。此外,我以两种不同的方式测试了 SQL 查询:

  1. 通过直接在 MySQL 上执行。得到的结果是正确的,并且在任何 PK 列中都不包含空值。
  2. 通过再次运行 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


【解决方案1】:

您可以在屏幕截图中看到有两个 OutletID 列,其中之一是从第 11 个结果开始的 NULL

我的猜测是,由于 CI 中的结果是一个关联数组,所以会存储最后一次出现的 OutletID(在本例中为 NULL)。

我建议不要使用SELECT *,而是使用类似于:

SELECT Restaurant.RestaurantID AS "RestaurantID", [...],
       Outlet.OutletID AS "OutletID", [...],
       OutletTable.OutletID AS "OutletID2", [...]

【讨论】:

  • 你是天选之人!经验教训 - 错误越令人沮丧,它就越有可能是我忽略的普通问题,而不是框架中的真正错误。谢谢!
  • 不客气。请记住,即使看起来更容易,在带有JOIN 的查询中使用SELECT * 几乎从来都不是一个好习惯,而且如果您在不同表中的某些列具有相同的名称,这可能会非常引人注目。我总是尝试在每个列中添加与表名称相对应的后缀,例如 OutletID_outletOutletID_outletTable ;)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-08-03
  • 1970-01-01
  • 2019-07-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多