如何在PHP中准备带参数的SQL存储过程调用

如何在PHP中准备带参数的SQL存储过程调用,php,sql,stored-procedures,prepared-statement,sql-injection,Php,Sql,Stored Procedures,Prepared Statement,Sql Injection,我有一个用SQL编写的存储过程。我想从PHP调用它,但是我想确定我的调用是完全安全的,因为调用包括用户输入的参数。我的存储过程如下所示: CREATE PROCEDURE `myProcedure`( userId INT ) BEGIN SELECT * FROM `users` WHERE `users`.`userId`=userId; END $stmt = mysqli_prepare($mysql_link, 'call '.$procedureName.'('.r

我有一个用SQL编写的存储过程。我想从PHP调用它,但是我想确定我的调用是完全安全的,因为调用包括用户输入的参数。我的存储过程如下所示:

CREATE PROCEDURE `myProcedure`(
    userId INT
)
BEGIN
    SELECT * FROM `users` WHERE `users`.`userId`=userId;
END
$stmt = mysqli_prepare($mysql_link, 'call '.$procedureName.'('.rtrim(str_repeat('?,',count($parameters)), ',').')');
call_user_func_array('mysqli_stmt_bind_param', array_merge(array($stmt, str_repeat('s', count($parameters))), refValues($parameters)));
mysqli_stmt_execute($stmt);
call_user_func_array('mysqli_stmt_bind_result', array_merge(array($stmt), refValues($parameters)));
$array = array();
while(mysqli_stmt_fetch($stmt)){
    $array[] = $parameters;
}
当我这样做时,它会起作用:

mysqli_query($mysqli_link, "CALL myProcedure(".$userinput.");");
我可以使用mysqli\u real\u escape\u字符串:

mysqli_query($mysqli_link, "CALL myProcedure(".mysqli_real_escape_string($mysqli_link, $userinput).");");
这够了吗?我尝试使用mysqli编写的语句,如下所示:

CREATE PROCEDURE `myProcedure`(
    userId INT
)
BEGIN
    SELECT * FROM `users` WHERE `users`.`userId`=userId;
END
$stmt = mysqli_prepare($mysql_link, 'call '.$procedureName.'('.rtrim(str_repeat('?,',count($parameters)), ',').')');
call_user_func_array('mysqli_stmt_bind_param', array_merge(array($stmt, str_repeat('s', count($parameters))), refValues($parameters)));
mysqli_stmt_execute($stmt);
call_user_func_array('mysqli_stmt_bind_result', array_merge(array($stmt), refValues($parameters)));
$array = array();
while(mysqli_stmt_fetch($stmt)){
    $array[] = $parameters;
}
注意:此代码是通用编写的,因为它用于访问具有不同参数数的多个不同存储过程。目前,由于输出了大量不同的错误和警告,因此无法正常工作。所有这些都是必要的吗?或者我可以像上面那样简单地使用mysqli\u real\u escape\u字符串吗

谢谢,

--