db2 如何在PHP PDO for QCMDEXC中绑定单引号内的参数

hvvq6cgz  于 2022-11-07  发布在  DB2
关注(0)|答案(1)|浏览(108)

为了调用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);

我意识到语句中的单引号造成了严重的破坏,但是为了使语句正常工作,它需要这样的结构,除非有我不知道的解决方法。

x8diyxa7

x8diyxa71#

好了,这里要介绍的内容就这么多。首先,QSYS2.QCMDEXC过程只接受一个参数,该参数是要运行的命令的字符串,最长为32 k。其次,它不返回任何内容,甚至不返回状态(但如果失败,则会抛出sql错误)。但有一个QSYS2.QCMDEXC标量函数,它将返回一个整数1表示成功或-1表示失败。使用哪一个由你决定。那么,如何使用CL CALL PGM调用程序并发送数据到和从程序发送数据呢?

**Option 1)**如果你只需要输入数据,你可以在字符串中传递数据,你仍然不能得到任何东西。你可以为整个命令绑定变量:

$query = "CALL QCMDEXC(?)";
$result->bindParam(1, $cmd, PDO::PARAM_STR|PDO::PARAM_INPUT);
$cmd = "CALL PGM(IBMIPGM) PARM(INPARM)";

这将把文本'INPARM'传递给程序。您将遇到的下一个问题是参数分隔符和转义字符。IBM参数是用空格分隔的,因此您可以传递两个或更多个参数,参数之间有空格:

$cmd = 'CALL PGM(IBMIPGM) PARM(INPARM1 INPARM2)';

如果字符串中有空格,则必须用单引号分隔:

$cmd = "CALL PGM(IBMIPGM) PARM('INPARM1PART1 INPARM1PART2' INPARM2)";

到目前为止,字符串使用的是php双引号。如果我们使用php单引号,那么我们就必须用反斜杠来转义它们。为了增加复杂性,如果您不使用单引号来分隔IBM参数,那么字符串将被转换为大写。2如果你的字符串包含一个单引号,那么它必须被转义。3在sql和CL中的IBM转义字符就是一个单引号。以下是设置数据区的示例:

$query = "CALL QCMDEXC(?)";
$result->bindParam(1, $cmd, PDO::PARAM_STR|PDO::PARAM_INPUT);
$val = "Don''t forget to escape single quotes";
$cmd = "CHGDTAARA DTAARA(MYLIB/TESTDTA *ALL) VALUE('$val')";

你必须考虑嵌套字符串和转义,如果你没有使用绑定变量,你就必须进行双转义:

$cmd = "CALL QCMDEXC('CHGDTAARA DTAARA(MYLIB/TESTDTA *ALL) VALUE(''Don''''t forget to escape single quotes'')')";

举个例子,如果你要使用php单引号:

$cmd = 'CALL QCMDEXC(\'CHGDTAARA DTAARA(MYLIB/TESTDTA *ALL) VALUE(\'\'Don\'\'\'\'t forget to escape single quotes\'\')\')';

你应该有一个函数来净化任何来自用户(甚至你自己)的数据,以防止注入攻击,因为绑定变量只是绑定命令字符串,他们可以注入到命令字符串,所以净化和转义是非常重要的!

**选项2)**使用PHP XMLSERVICE Toolkit。您将能够添加输入和输出参数,您可以使用PGMCall方法直接调用程序,或者使用CLCommand方法运行CL,这也会返回数据。我知道它可以与ibm_db2和odbc连接器一起工作,但不确定您使用的是PDO连接器。它还具有一个实验性的http传输类型。
**选项3)**创建外部绑定过程。如果您要调用的 *PGM是RPG、ILE、C、JAVA等(查看下面的链接),则可以为它创建一个外部绑定过程。在sql:

CREATE PROCEDURE PGM_PROC ( IN INVALUE CHAR(10), OUT OUTVALUE CHAR(10), INOUT INOUTVAL CHAR(20) ) 
LANGUAGE C
EXTERNAL NAME IBMIPGM
PARAMETER STYLE GENERAL;

然后,您可以将php变量绑定到它并直接调用:

$query = "CALL PGM_PROC(?,?,?)";

$result->bindParam(1, $invalue, PDO::PARAM_STR|PDO::PARAM_INPUT, 10);
$result->bindParam(2, $outvalue, PDO::PARAM_STR|PDO::PARAM_OUTPUT, 10);
$result->bindParam(3, $inoutvalue, PDO::PARAM_STR|PDO::PARAM_INPUT_OUTPUT, 20);

资源:应用程序服务: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

相关问题