Php MySQL-如果由CLI调用,则存储过程返回null,但结果为workbench

Php MySQL-如果由CLI调用,则存储过程返回null,但结果为workbench,php,mysql,stored-procedures,command-line-interface,mysql-workbench,Php,Mysql,Stored Procedures,Command Line Interface,Mysql Workbench,我正在mysql上编写一个存储过程,但我不知道为什么从工作台调用它时会给出正确的答案,但当由PHPAPI或CLI调用时会给出空值 就我而言,程序如下: use dummydb delimiter GO create procedure myproc (startdate datetime, enddate datetime) begin select @startdate as beg, @enddate as fin; end GO delimiter ; 当我从workbench调用它时,

我正在mysql上编写一个存储过程,但我不知道为什么从工作台调用它时会给出正确的答案,但当由PHPAPI或CLI调用时会给出空值

就我而言,程序如下:

use dummydb
delimiter GO
create procedure myproc (startdate datetime, enddate datetime)
begin
select @startdate as beg, @enddate as fin;
end
GO
delimiter ;
当我从workbench调用它时,调用myproc(“2018-03-01”、“2020-11-11”)返回:

beg         fin
2018-03-01  2020-11-11
但当我从CLI调用它时:

mysql> use dummydb
Database changed
mysql> call myproc('2018-03-01','2020-03-01');
+------+------+
| beg  | fin  |
+------+------+
| NULL | NULL |
+------+------+
1 row in set (0.00 sec)

Query OK, 0 rows affected (0.01 sec)
当我从php调用它时,它返回2014

// [....]
$conn = new mysqli("127.0.0.1", "theuser", "thepassword", "dummydb");

$sql = "CALL myproc('2018-03-01', '2020-11-11')";

$result = $conn->query($sql);

var_dump($result->fetch_assoc());
返回以下内容:

array(2) {
  'beg' =>
  NULL
  'fin' =>
  NULL
}

如何使其传递正确的值?

您的过程具有输入参数
startdate
enddate
。然后在您的过程中,您指的是
@startdate
@enddate
。这两件事是两回事

用户定义的变量是特定于会话的,即它们在整个会话中保持其值。调用过程时,它显示会话中的值,而不是输入参数值。在工作台会话中,这些变量有值,但在CLI中没有

要在过程中使用输入变量,请使用相同的变量(最好使用前缀,以便最终不会将它们与列名混合使用):


不要对变量使用
@
。这是两种不同类型的变量-带和不带
@
我自己无法解释的是,为什么在workbench中调用用户定义的变量的相同过程有效,但在您的工作区会话中没有定义变量。在CLI中不是。如果只运行:
选择@startdate、@enddate
,结果将是相同的。变量与过程无关。
create procedure myproc (in_startdate datetime, in_enddate datetime)
begin
select in_startdate as beg, in_enddate as fin;
end