PHP PDO 程序

PHP PDO Procedure

我找不到此代码中的错误。有人可以帮忙吗?

$stmt = $DB->prepare("CALL dbo.HisIsTheProcedureName(?,?,?)");
$stmt->bindParam( 1, $_POST['Val01'], PDO::PARAM_STR,8000);
$stmt->bindParam( 2, $_POST['Val02'], PDO::PARAM_STR,8000);
$stmt->bindParam( 3, $_POST['Val03'], PDO::PARAM_STR,8000);
$stmt->execute();

使用 debugDumpParams() 后,显示以下 Dump:

SQL: [30] CALL dbo.InsertFeedback(?,?,?)
Params:  3
Key: Position #0:
paramno=0
name=[0] ""
is_param=1
param_type=2
Key: Position #1:
paramno=1
name=[0] ""
is_param=1
param_type=2
Key: Position #2:
paramno=2
name=[0] ""
is_param=1
param_type=2

我没有收到任何语法或 PHP 错误。

除非在非常特殊的情况下,否则您不需要使用 PDOStatement::bindParam()。只需将参数传递给 PDOStatement::execute() 即可。至于您的问题,您可能遗漏了一些 POST 值。确保您将有效的字符串传递给查询,并检查您的 return 值。

$val01 = $_POST["Val01"] ?? "";
$val02 = $_POST["Val02"] ?? "";
$val03 = $_POST["Val03"] ?? "";

$stmt = $DB->prepare("CALL dbo.HisIsTheProcedureName(?,?,?)");
if ($stmt) {
    $result = $stmt->execute([$val01, $val02, $val03]);
    if (!$result) {
        //look at error messages
    }
} else {
    // look at error messages
}

您可以将命名占位符 (:name) 或问号占位符 (?) 与 bindParam() 中参数的 1 索引位置一起使用。

如果您的参数只是输入,您可以尝试在 bindParam() 调用中删除长度参数。

$stmt = $DB->prepare("CALL dbo.HisIsTheProcedureName(?,?,?)");
$val01 = $_POST['Val01'];
$val02 = $_POST['Val02'];
$val03 = $_POST['Val03'];
$stmt->bindParam(1, $val01, PDO::PARAM_STR);
$stmt->bindParam(2, $val02, PDO::PARAM_STR);
$stmt->bindParam(3, $val03, PDO::PARAM_STR);
$stmt->execute();

如果你有输出参数,那么根据文档,使用这个:

$val01 = $_POST['Val01'];
$val02 = $_POST['Val02'];
$val03 = $_POST['Val03'];
$stmt = $DB->prepare("CALL dbo.HisIsTheProcedureName(?,?,?)");
$stmt->bindParam(1, $val01, PDO::PARAM_STR|PDO::PARAM_INPUT_OUTPUT, 8000);
$stmt->bindParam(2, $val02, PDO::PARAM_STR|PDO::PARAM_INPUT_OUTPUT, 8000);
$stmt->bindParam(3, $val03, PDO::PARAM_STR|PDO::PARAM_INPUT_OUTPUT, 8000);
$stmt->execute();