为了调用IBMI上的一个程序,我需要使用QCMDEXC来调用这个程序。
$query = "CALL QCMDEXC('CALL PGM(IBMIPGM) PARM(?,?)')";
这些参数是来自程序的输入和输出变量。如何使用以下命令绑定pdo参数:
$result->bindParam(1, $invalue, PDO::PARAM_STR|PDO::PARAM_INPUT_OUTPUT, 11);
$result->bindParam(2, $outvalue, PDO::PARAM_STR|PDO::PARAM_INPUT_OUTPUT, 11);
我意识到语句中的单引号造成了严重的破坏,但是为了使语句正常工作,它需要这样的结构,除非有我不知道的解决方法。
1条答案
按热度按时间x8diyxa71#
好了,这里要介绍的内容就这么多。首先,QSYS2.QCMDEXC过程只接受一个参数,该参数是要运行的命令的字符串,最长为32 k。其次,它不返回任何内容,甚至不返回状态(但如果失败,则会抛出sql错误)。但有一个QSYS2.QCMDEXC标量函数,它将返回一个整数1表示成功或-1表示失败。使用哪一个由你决定。那么,如何使用CL CALL PGM调用程序并发送数据到和从程序发送数据呢?
**Option 1)**如果你只需要输入数据,你可以在字符串中传递数据,你仍然不能得到任何东西。你可以为整个命令绑定变量:
这将把文本'INPARM'传递给程序。您将遇到的下一个问题是参数分隔符和转义字符。IBM参数是用空格分隔的,因此您可以传递两个或更多个参数,参数之间有空格:
如果字符串中有空格,则必须用单引号分隔:
到目前为止,字符串使用的是php双引号。如果我们使用php单引号,那么我们就必须用反斜杠来转义它们。为了增加复杂性,如果您不使用单引号来分隔IBM参数,那么字符串将被转换为大写。2如果你的字符串包含一个单引号,那么它必须被转义。3在sql和CL中的IBM转义字符就是一个单引号。以下是设置数据区的示例:
你必须考虑嵌套字符串和转义,如果你没有使用绑定变量,你就必须进行双转义:
举个例子,如果你要使用php单引号:
你应该有一个函数来净化任何来自用户(甚至你自己)的数据,以防止注入攻击,因为绑定变量只是绑定命令字符串,他们可以注入到命令字符串,所以净化和转义是非常重要的!
**选项2)**使用PHP XMLSERVICE Toolkit。您将能够添加输入和输出参数,您可以使用PGMCall方法直接调用程序,或者使用CLCommand方法运行CL,这也会返回数据。我知道它可以与ibm_db2和odbc连接器一起工作,但不确定您使用的是PDO连接器。它还具有一个实验性的http传输类型。
**选项3)**创建外部绑定过程。如果您要调用的 *PGM是RPG、ILE、C、JAVA等(查看下面的链接),则可以为它创建一个外部绑定过程。在sql:
然后,您可以将php变量绑定到它并直接调用:
资源:应用程序服务:https://www.ibm.com/docs/en/i/7.5?topic=services-qcmdexc-procedure
XMLSERVICE工具包:第一个字符
外部程序:https://www.ibm.com/docs/en/i/7.5?topic=statements-create-procedure-external
优秀的IBMi博客:https://www.rpgpgm.com/p/list-of-all-posts.html#3