MySQL Delete Session Variable
状况:MySQL查询使用的值,从外面进行交付。这是做通过declaring和initializing a session变量,这是有效期至年底的一次: </P >
问题:这是一个好的做法来删除session变量在查询有成品(为安全原因)???????什么是最adequate通这样做吗? </P >
研究发现:在我下面的建议,但有一些doubts为它就像"uninitialise",而不是"undeclare状": </P >
- 如果应用程序正在使用连接池,则使用会话可能很危险。声明的全局变量可以保留在原位。将值作为参数传递给任何查询/过程需要它的对象不是更好吗?
- 是的,使用连接池。我认为@id是会话参数,而不是全局参数。使用名称参数比使用"?"放置参数更灵活。,因为添加/删除变量不需要在代码中更改顺序。
- 导致传递到方法键值对,并用相应的值替换所有@-键。好主意,谢谢。这有助于我在不同的文件中保持不同的语言不变。
使用会话变量传递参数是一种糟糕的实践(使用全局变量通常表示代码味道)。因此,没有足够或推荐的方法来处理您的情况(1)。
你评论说:
Using name parameters is more flexible than place parameters using"?", because adding/removing a variable needs no order changes in code.
这是一种幻觉。使用这种方法,您仍然需要记录"某处",您的过程在调用之前需要声明一些变量。这也介绍了您正试图解决的问题。
另一方面,存储过程(或准备好的语句)是自记录的,参数具有众所周知的范围和寿命。
现在,要回答具体问题:
How to delete/unset a session variable?
只有SET @id = NULL;一条路可以走。您不能"取消声明"会话变量,因为您不能"声明"会话变量(请尝试SELECT @dummy_variable_never_declared_before;)。mysql会话变量与shell环境变量非常相似。(2)
(1)…除非确保会话在完成后关闭。关闭会话肯定会清除所有会话变量。
(2)我已经了解到bash会话变量确实可以取消设置。
- 你好。谢谢你的回答。我不使用全局变量或过程。我使用会话变量-它是不同的。这不是我的发明,而是一个标准的MySQL方法。我没有发现任何争论,为什么它不应该有代码味道,或者为什么它是一个糟糕的实践。虽然问题是如何完成变量,而不是如何传递参数,但我想澄清位置。"?"-方法不适不是在声明工作中,而是在MySQL脚本中改变参数顺序后,必须在语言代码中进行更改。
- @Zon您可能希望发布一些代码,显示如何使用会话变量。我可能误解了你的用例。但是,在会话结束之前销毁会话变量这一事实是一个很强的指示,表明您可能需要使用另一种机制。
- 添加了示例-没有什么特别的,请参见第一个代码块。我不想破坏,我只是问我应该,为什么,还有其他的方法来处理它(变量)。
- 我需要看看你如何调用这个片段。据我所见,这里不需要变量。至于"取消设置"变量的方法,将其设置为null是唯一的方法(参见我的答案的第二部分)。
- 在我的问题中,通过会话变量传递值是必须的条件。否定任务的条件来解决任务不是一种好的做法。:)
- 您可能遇到xy问题。我相信,我已经回答了你最初的问题。你很可能采取了错误的方法,但我根本不在乎。
- @随机种子,有趣的帖子。因此,没有办法区分从未设置过的变量@some_variable和设置为null的变量@some_variable?
- @起搏器正确,非常像外壳环境变量。
我没有读过手册或任何东西。但是我在使用@变量时发现它们随着数据库连接而消失。我想这就是你所谓的会议。在任何情况下,重新连接到数据库似乎都会删除所有变量。如果将mysql与Web服务器一起使用,这意味着一旦传递了一个页面,所有变量就会被删除。我就是这样发现的。不能将SQL@-变量从一个HTTP调用保留到另一个HTTP调用。
- 除非使用连接池,因为连接不会被破坏;只需释放重新使用…直到线程超时并被回收,此时全局变量将被重置。