我正在(OpensourcePOS)中编写代码的应用程序使用CodeIgniter框架(3.1.11),我注意到它使用CI QueryBuilder给了我错误的查询结果,因此我完全绕过CI编写了查询,但是即使如此,结果不正确。
此MySQL查询从phpMyAdmin运行,并且CLI返回'category'(VARCHAR(255))的正确结果
SELECT * FROM ospos_items items
LEFT JOIN ospos_suppliers suppliers
ON suppliers.person_id = items.supplier_id
JOIN ospos_item_quantities qty
ON qty.item_id = items.item_id
WHERE items.deleted = 0
ORDER BY items.name ASC
LIMIT 1 OFFSET 0
字段“ category”被报告为“ Books”,就像应该的那样。问题是,在我的应用程序上下文中,我没有看到期望的“类别”数据,因此我运行了以下调试代码:
public function get_all($stock_location_id = -1, $rows = 0, $limit_from = 0)
{
$this->db->from('items');
$this->db->join('suppliers', 'suppliers.person_id = items.supplier_id', 'left');
if($stock_location_id > -1)
{
$this->db->join('item_quantities', 'item_quantities.item_id = items.item_id');
$this->db->where('location_id', $stock_location_id);
}
$this->db->where('items.deleted', 0);
$this->db->order_by('items.name', 'asc');
if($rows > 0)
{
$this->db->limit($rows, $limit_from);
}
$result_items = $this->db->get();
//DEBUG CODE
ob_start();
var_dump($result_items->result_array());
$res = ob_get_clean();
log_message('Error',"get_all results: $res");
//END DEBUG CODE
return $result_items;
}
给我以下结果。您会看到“类别”的值为0。如果没有vendor_id(INT(11)),则“类别”显示为空。
ERROR - 2020-04-10 16:21:34 --> get_all results: <pre class='xdebug-var-dump' dir='ltr'>
<small>/usr/local/www/public_html/pos_clcdesq/application/models/Item.php:278:</small>
<b>array</b> <i>(size=1)</i>
0 <font color='#888a85'>=></font>
<b>array</b> <i>(size=26)</i>
...
'category' <font color='#888a85'>=></font> <small>string</small> <font color='#cc0000'>'0'</font> <i>(length=1)</i>
'supplier_id' <font color='#888a85'>=></font> <small>string</small> <font color='#cc0000'>'362'</font> <i>(length=3)</i>
...
</pre>
如果我注释掉$this->db->join('suppliers', 'suppliers.person_id = items.supplier_id', 'left');
,则结果是正确的,但是当然会缺少在供应商数据库中由左联接引入的数据(这是必需的)。因此,自然而然地,我认为这是一个CI Querybuilder错误,因此我在第二个查询中添加了一个基本选项,使我可以对项目表中与我的ID匹配的所有内容进行基本选择。
$query = $this->db->get_where('items',array('item_id'=>12203)); ob_start(); var_dump($query->result_array()); $res2 = ob_get_clean(); log_message('Error',"Custom query results: $res2");
并且该结果是正确的,但没有给我所需的联接。
ERROR - 2020-04-10 16:21:34 --> Custom query results: <pre class='xdebug-var-dump' dir='ltr'> <small>/usr/local/www/public_html/pos_clcdesq/application/models/Item.php:284:</small> <b>array</b> <i>(size=1)</i> 0 <font color='#888a85'>=></font> <b>array</b> <i>(size=21)</i> ... 'category' <font color='#888a85'>=></font> <small>string</small> <font color='#cc0000'>'Books'</font> <i>(length=5)</i> 'supplier_id' <font color='#888a85'>=></font> <small>string</small> <font color='#cc0000'>'362'</font> <i>(length=3)</i> ... </pre>
从那里我跳过CI QueryBuilder并写出查询,但是仍然使用CI框架来处理连接。
$query2 = $this->db->query("SELECT * FROM `ospos_items` items LEFT JOIN `ospos_suppliers` suppliers ON suppliers.person_id = items.supplier_id JOIN ospos_item_quantities qty ON qty.item_id = items.item_id WHERE items.deleted = 0 ORDER BY items.name ASC LIMIT 1 OFFSET 0"); ob_start(); var_dump($query2->result_array()); $res3 = ob_get_clean(); log_message('Error',"HANDWRITTEN query results: $res3");
...而且我得到了相同的'类别'不正确的数据
ERROR - 2020-04-10 16:21:34 --> HANDWRITTEN query results: <pre class='xdebug-var-dump' dir='ltr'> <small>/usr/local/www/public_html/pos_clcdesq/application/models/Item.php:290:</small> <b>array</b> <i>(size=1)</i> 0 <font color='#888a85'>=></font> <b>array</b> <i>(size=28)</i> ... 'category' <font color='#888a85'>=></font> <small>string</small> <font color='#cc0000'>'0'</font> <i>(length=1)</i> 'supplier_id' <font color='#888a85'>=></font> <small>string</small> <font color='#cc0000'>'362'</font> <i>(length=3)</i> ... </pre>
所以我想,这肯定是CI错误!我完全绕开了CI框架,并手动编写了查询,使用PHP处理了所有内容
$username = "[REDACTED]"; $password = "[REDACTED]"; $database = "[REDACTED]"; $mysqli = new mysqli("localhost", $username, $password, $database); $query3="SELECT * FROM `ospos_items` items LEFT JOIN `ospos_suppliers` suppliers ON suppliers.person_id = items.supplier_id JOIN ospos_item_quantities qty ON qty.item_id = items.item_id WHERE items.deleted = 0 ORDER BY items.name ASC LIMIT 1 OFFSET 0"; $result3 = $mysqli->query("$query3"); $mysqli->close(); ob_start(); var_dump($result3->fetch_assoc()); $res4 = ob_get_clean(); log_message('Error',"noCI query results: $res4");
annnndd ...相同的错误“类别”数据:
ERROR - 2020-04-10 16:21:34 --> noCI query results: <pre class='xdebug-var-dump' dir='ltr'> <small>/usr/local/www/public_html/pos_clcdesq/application/models/Item.php:302:</small> <b>array</b> <i>(size=28)</i> ... 'category' <font color='#888a85'>=></font> <small>string</small> <font color='#cc0000'>'0'</font> <i>(length=1)</i> 'supplier_id' <font color='#888a85'>=></font> <small>string</small> <font color='#cc0000'>'362'</font> <i>(length=3)</i> ... </pre>
没有人知道为什么phpMyAdmin和CLI中的查询有效,但在供应商上没有左连接的查询可以从我的代码中使用,但是添加左连接在直接的PHP或CI中不起作用?
FreeBSD 11.2-RELEASE Apache 2.4.43 PHP 7.4.4 MySQL 5.7.29我正在(OpensourcePOS)中编写代码的应用程序使用CodeIgniter框架(3.1.11),我注意到它给了我错误的查询...
您有此查询: