如何在PHP中调用带多个参数的MySQL存储过程
PHP调用带多参数MySQL存储过程的正确实现
现有MySQL存储过程定义如下:
delimiter // create procedure createInvoice (inProduct varchar(20), inCost float, inAmount integer) begin -- 存储过程业务逻辑 end// delimiter ;
你最初的字符串拼接写法存在两个问题:一是引号位置拼写错误导致SQL语法非法,二是直接拼接用户输入存在SQL注入风险,完全不推荐使用。
你后续调整代码抛出HY093: Invalid parameter number错误的核心原因如下:
- 使用
?位置占位符时,bindParam不能直接传入存储过程的参数名,需要传从1开始的位置索引,或者改用:参数名格式的命名占位符 - 存在多处变量拼写错误:定义了
$sp存储过程调用语句,实际却使用未定义的$call变量;参数数组名前后不一致,amount拼写多了一个n - 混合了两种传参逻辑:要么直接给
execute传参数数组,要么单独绑定参数,不需要同时操作两种逻辑
写法1:位置占位符写法(最简实现)
<?php if(isset($_POST['invoiceform'])) { $callSql = 'call createInvoice(?,?,?)'; $stmt = $pdo->prepare($callSql); // 参数顺序和存储过程定义的参数顺序保持一致即可 $stmt->execute([ $_POST['product'], $_POST['cost'], $_POST['amount'] ]); } ?>
写法2:命名占位符写法(可读性更高)
<?php if(isset($_POST['invoiceform'])) { // 用:开头的命名占位符和存储过程参数一一对应 $callSql = 'call createInvoice(:inProduct,:inCost,:inAmount)'; $stmt = $pdo->prepare($callSql); // 按名称绑定参数,同时指定参数类型提升安全性 $stmt->bindParam(':inProduct', $_POST['product'], PDO::PARAM_STR); $stmt->bindParam(':inCost', $_POST['cost'], PDO::PARAM_STR); $stmt->bindParam(':inAmount', $_POST['amount'], PDO::PARAM_INT); $stmt->execute(); } ?>
内容的提问来源于stack exchange,提问作者leo
相关产品推荐
相关产品推荐

