php - Zend pdo_oci 和 pdo_mysql 生成不同的查询格式
问题描述
Oracle 数据库适配器:“ pdo_oci ” MySQL 数据库适配器:“ pdo_mysql ”
用于构建 JOIN 查询的代码:
$db = Zend_Db_Table::getDefaultAdapter();
$db->setFetchMode(Zend_Db::FETCH_OBJ);
$select = $db->select()->from(array(
't1' => $this->_Table1
));
$select = $select->join(array(
't2' => $this->_Table2
), 't1.MENU_ID = t2.SUBMENU_ID',
array(
'MENU_ID',
'SET_REDIRECT_URL',
'SUBMENU_TYPE'
));
$select = $select->order(array(
'MENU_ID',
't2.DISPLAY_ORDER'
));
$select = $select->where('t1.IS_ACTIVE = ?', 'Y');
$result = $db->fetchAll($select);
Oracle 适配器 (pdo_oci) 生成的查询:
SELECT "t1".*, "t2"."MENU_ID" AS "parent_id", "t2"."SET_REDIRECT_URL", "t2"."SUBMENU_TYPE" FROM "DRP_ADMIN_MENU_MASTER" "t1" INNER JOIN "DRP_ADMIN_MENU_MAPPER" "t2" ON t1.MENU_ID = t2.SUBMENU_ID WHERE (t1.IS_ACTIVE = 'Y') ORDER BY "parent_id" ASC, "t2"."DISPLAY_ORDER" ASC
Mysql Adapter (pdo_mysql) 生成的查询:
SELECT `t1`.*, `t2`.`MENU_ID` AS `parent_id`, `t2`.`SET_REDIRECT_URL`, `t2`.`SUBMENU_TYPE` FROM `DRP_ADMIN_MENU_MASTER` AS `t1` INNER JOIN `DRP_ADMIN_MENU_MAPPER` AS `t2` ON t1.MENU_ID = t2.SUBMENU_ID WHERE (t1.IS_ACTIVE = 'Y') ORDER BY `parent_id` ASC, `t2`.`DISPLAY_ORDER` ASC
问题:Oracle DB 无法识别 [t1.MENU_ID = t2.SUBMENU_ID] 中的 t1 和 t2,除非它们使用双引号。如果我手动加上双引号,那么 mysql 会出错。
甲骨文中的错误:
一般错误:904 OCIStmtExecute:ORA-00904:“T2”。“SUBMENU_ID”:标识符无效
解决方案
解决了。使用 $db->quoteIdentifier()。它奏效了
$db = Zend_Db_Table::getDefaultAdapter();
$db->setFetchMode(Zend_Db::FETCH_OBJ);
$select = $db->select()->from(array(
't1' => $this->_Table1
));
$select = $select->join(array(
't2' => $this->_Table2
), $db->quoteIdentifier('t1.MENU_ID') . ' = ' . $db->quoteIdentifier('t2.SUBMENU_ID'),
array(
'MENU_ID',
'SET_REDIRECT_URL',
'SUBMENU_TYPE'
));
$select = $select->order(array(
'MENU_ID',
't2.DISPLAY_ORDER'
));
$select = $select->where($db->quoteIdentifier('t1.IS_ACTIVE') . ' = ?', 'Y');
$result = $db->fetchAll($select);
推荐阅读
- python - 使用python提取两个模式之间的字符
- mysql - 如何在子查询之前和子查询中使用两个 where 语句
- excel - 从 Tableau 中越来越多的 Excel 文件/CSV 中引用数据?
- c# - 在 C# 中有没有办法引用远程 .csproj 文件?
- python - 如何在熊猫的一列中选择多个值
- c++ - 如何正确链接 Boost 共享库
- node.js - (Node.js Socket.io) 服务器和客户端无法连接
- javascript - Html 表到 JSON:包括单选按钮检查值
- r - 如何在R中解压缩数据
- javafx - JavaFx - 如何使用鼠标滚轮进行放大/缩小?