You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.02 00:09:00