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();
我找不到此代码中的错误。有人可以帮忙吗?
$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();