我无法访问先前设置的mysql变量。
在单控制器方法中,我这样做:
public function indexAction()
{
$em = $this->getDoctrine()->getManager();
/* @var $connection Connection */
$connection = $em->getConnection();
$connection->executeQuery('SET @user_id = 1;');
return [];
}
但是,我想获得另一个值:
public function listAction(Request $r)
{
$em = $this->getDoctrine()->getManager();
/* @var $connection Connection */
$connection = $em->getConnection();
var_dump($connection->executeQuery('SELECT @user_id;')->fetchColumn());exit;
}
在创建后立即以相同的方式和相同的变量进行转储时,此值存在。我需要此变量,因为我有一个触发器可以在其中获取此变量。
我在做什么错了?
答案 0 :(得分:3)
由于mysql用户定义变量的工作原理,您几乎无法实现。
用户定义的变量是特定于会话的。一个客户端定义的用户变量无法被其他客户端看到或使用...给定客户端会话的所有变量在该客户端退出时会自动释放
来自https://dev.mysql.com/doc/refman/8.0/en/user-variables.html
这个例子是:
(例外:有权访问性能模式user_variables_by_thread表的用户可以查看所有会话的所有用户变量。)
来自https://dev.mysql.com/doc/refman/8.0/en/user-variables.html
您在示例中介绍的两个操作是两个不同的php进程,它们通常不共享mysql会话,因此它们不会共享mysql用户定义的变量。我不知道您的主要目标是什么,但是即使共享变量,如果您有多个用户,脚本也无法正常工作,因为在某些情况下,并发用户会覆盖变量,例如:
标识为1的用户访问indexAction并将变量@user_id设置为“ 1”,标识为2的用户访问indexAction并将变量设置为“ 2”。 ID为1的用户访问listAction,变量将为“ 2”而不是“ 1”。
我认为您应该重新考虑实施。如果您给我更多有关您的目标的信息,那么也许我可以为您提供一些建议。在不了解更多细节的情况下,实际上是使用用户会话在操作之间传递变量。像这样
public function indexAction()
{
$this->get('session')->set('user_id', $id);
return [];
}
public function listAction(Request $r)
{
$this->get('session')->get('user_id');
}
希望这会有所帮助,
Alexandru Cosoi