php-Magento集成中PDO Firebird中的查询准备异常
作者:互联网
我正在研究直接通过php firebird pdo扩展与客户的ERP *集成的项目,以获取品牌,类别,产品,产品价格等信息.
数据库不在运行脚本的服务器上.如果这很重要,则通过VPN连接可以连接数据库.
首先,脚本要求Firebird在一个名为SYS $ACTION_DS的系统表中查询几个查询,Firebird返回以下查询:
execute block (
MARK_AS_PROCESSED DM_BOOL = :MARK_AS_PROCESSED,
EXTENAL_SYSTEM_ID DM_123 = :EXTENAL_SYSTEM_ID)
returns (
ID bigint,
BRAND_NAME$1 DM_STR30,
BRAND_NAME$2 DM_STR30,
BRAND_PARENT_REF bigint,
OP varchar(1))
as
DECLARE VARIABLE SL_ID BIGINT;
begin
FOR SELECT SL.ID, SL.OPERATION, SL.TABLE_ID_REF, N.BRAND_NAME$1, N.BRAND_NAME$2, N.BRAND_PARENT_REF
FROM SYS$EXT_LOG SL
LEFT JOIN NOM$BRANDS N ON (SL.TABLE_ID_REF = N.ID)
WHERE (SL.PROCESSED = 0) AND (SL.EXTERNAL_SYSTEM_ID = :EXTENAL_SYSTEM_ID) AND (SL.TABLE_NAME = 'NOM$BRANDS')
ORDER BY SL.ID
INTO :SL_ID, :OP, :ID, :BRAND_NAME$1, :BRAND_NAME$2, :BRAND_PARENT_REF
do begin
suspend;
if (MARK_AS_PROCESSED = 1) then
update SYS$EXT_LOG SL set SL.PROCESSED = 1, SL.PROCESSED_ON = current_timestamp where SL.ID = :SL_ID;
end
end
之后,该脚本尝试准备PDO语句,但准备抛出异常:Dynamic SQL Error SQL错误代码= -104令牌未知-第18行,第12列?
我找不到为什么会出现此错误,但是在实时服务器上一切正常,但在我的机器上却没有.我在我的机器上尝试了几种php版本(5.6、7.0、7.1),但没有任何效果,在实时服务器上php版本是5.5,但我找不到5.5和5.6之间与PDO或Firebird PDO相关的任何更改.
附加信息:
Firebird服务器版本:2.5.5.26
解决方法:
当前,PDO Firebird驱动程序通过用?替换:param来对命名参数进行简单的原始替换,因为FB不支持命名参数. PDO FB driver source中的更多信息
不幸的是,这不适用于“执行块”语句.我希望并做出一些努力以在将来解决此问题.在FB论坛,增加命名参数支持,PHP开发论坛和tracker改进驱动程序中对此进行了讨论.
目前,作为解决方法,您可以使用存储过程.
标签:magento,prepared-statement,firebird,php,pdo 来源: https://codeday.me/bug/20191110/2015033.html