我正在开发的项目直接通过 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 error code = -104 Token unknown - line 18, column 12 ?
我找不到为什么会出现此错误,但在实时服务器上一切正常,但在我的机器上却不行。我在我的机器上尝试了几个 php 版本(5.6、7.0、7.1)但没有任何效果,在实时服务器上 php 版本是 5.5 但我找不到与 PDO 或 Firebird PDO 相关的 5.5 和 5.6 之间的任何变化。
附加信息: Firebird 服务器版本:2.5.5.26
最佳答案
目前,PDO Firebird 驱动程序通过将 :param 替换为 ? 来对命名参数进行简单的原始替换,因为 FB 不支持命名参数。更多信息在 PDO FB driver source
不幸的是,这不适用于“执行 block ”语句。我希望并努力在未来解决这个问题。这在 FB 论坛中进行了讨论,以添加命名参数支持,也在 PHP 开发论坛和 tracker 中进行了讨论。以改进驱动程序。
目前,作为变通方法,您可以使用存储过程。
关于php - PDO Firebird 中的异常准备 Magento 集成中的查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47243309/