【问题标题】:How to call a stored procedure with multiple parameters?如何调用具有多个参数的存储过程?
【发布时间】:2021-11-24 08:15:20
【问题描述】:

如何在 PHP 中调用带有多个参数的存储过程?

假设我在 mysql 中有一个这样的存储过程:

delimiter //
create procedure createInvoice (inProduct varchar(20), inCost float, inAmount integer)
begin 
.....
.....
.....
end//
delimiter ;

现在在 PHP 中,我想调用此过程并将 inProduct、inCost 和 inAmount 变量设置为来自表单的值。我该怎么做呢?我试过这样设置,但没有成功。

.....
.....
.....
<?php
if(isset($_POST['invoiceform']) {
 $sp = 'call createInvoice("' . $_POST['product'] . ',' . $_POST['cost'] . ',' . $_POST['amount'] . '")'; 
.....
.....
.....
}
?>

所以我只想知道如何在 PHP 中制定“调用”代码。我知道的其余部分(表格、通话后要写的内容等)。

更新: 所以我现在是这样的:

if(isset($_POST['invoiceform']) {
 $sp = 'call createInvoice(?,?,?);

$spParameter([$_POST['product], $_POST['cost'], $_POST['amount']; 

$stmt = $pdo->prepare($call);
$stmt->bindParam('inProduct', $_POST['product']);
$stmt->bindParam('inCost', $_POST['cost']);
$stmt->bindParam('inAmount', $_POST['amounnt']);
$stmt->execute();

我收到此错误: 警告:PDOStatement::execute(): SQLSTATE[HY093]: 无效参数编号:参数未在 x/x/x/x/x/invoice.php 行 x PDOStatement Object ([queryString] => CALL createInvoice( ?,?,?))

更新 2:解决了:

if(isset($_POST['invoiceform']) {
 $sp = 'call createInvoice(?,?,?);

$spParameter([$_POST['product], $_POST['cost'], $_POST['amount']; 

$stmt = $pdo->prepare($call);
$stmt->bindParam('inProduct', $_POST['product']);
$stmt->bindParam('inCost', $_POST['cost']);
$stmt->bindParam('inAmount', $_POST['amounnt']);
$stmt->execute($spParameters);

【问题讨论】:

    标签: php mysql sql pdo


    【解决方案1】:

    根据您当前的操作,您会得到这样的连接字符串:

    call createInvoice("product, cost, amount")
    

    这意味着您只传递一个参数,即第一个参数。

    但你真正想要的是单独通过所有三个:

    call createInvoice("product", "cost", "amount")
    

    因此,在进行字符串连接时,您必须相应地添加引号,如下所示:

    $sp = "call createInvoice(?, ?, ?)"; 
    $spParameter = [$_POST["product"], $_POST["cost"], $_POST["amount"]];
    

    准备$sp,然后使用$spParameter中的参数执行。

    旁注:你对SQLinjection很开放。

    【讨论】:

    • 嘿,非常感谢。我只写了我需要帮助的代码。我不知道它是否会保护我免受 sql 注入的影响,但我会将 prepare 和 bindparameters 添加到调用中。不过我正在慢慢学习,所以不确定它是否会起作用。
    • 我已经准备好得出结论,世界上大多数问题的根源是 PHP 中的字符串连接运算符。
    • 我遇到了另一个问题。我不确定我做的是否正确。我更新了帖子。
    • 我现在解决了。非常感谢您的帮助!
    猜你喜欢
    • 1970-01-01
    • 2021-05-03
    • 1970-01-01
    • 2023-03-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-01-02
    • 1970-01-01
    相关资源
    最近更新 更多