我在访问之前设置的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;
}
当以相同的方式转储同一变量并在其创建后立即转储时,此值存在。我需要这个变量,因为我有一个触发器,在其中我得到这个变量。
我做错什么了?
1条答案
按热度按时间h43kikqp1#
由于mysql用户定义变量的工作方式,您试图实现的目标几乎是不可能的。
用户定义的变量是特定于会话的。一个客户端定义的用户变量不能被其他客户端看到或使用。。。给定客户机会话的所有变量在该客户机退出时自动释放
从https://dev.mysql.com/doc/refman/8.0/en/user-variables.html
例外情况是:
(例外:有权访问性能模式用户变量按线程表的用户可以查看所有会话的所有用户变量。)
从https://dev.mysql.com/doc/refman/8.0/en/user-variables.html
您在示例中介绍的两个操作是两个不同的php进程,它们通常不共享mysql会话,因此它们不会共享mysql用户定义变量。我不知道您的主要目标是什么,但即使共享了变量,如果您有多个用户,脚本也无法正常工作,因为在某些情况下,您的变量将被并发用户覆盖,例如:
id为1的用户访问索引操作并将变量@user\u id设置为“1”,id为2的用户访问索引操作并将变量设置为“2”。id为1的用户访问listaction,变量将为“2”而不是“1”。
我认为你应该重新考虑你的计划。如果你给我更多关于你目标的信息,也许我能帮你提些建议。在不知道更多细节的情况下,您实际需要的是使用用户会话在操作之间传递变量。像这样的
希望这有帮助,
亚历山德鲁科索伊