在MySQL连接中传递自定义变量

时间:2016-12-01 10:39:17

标签: mysql pdo optional-parameters

我在REST API中建立了一个MySQL连接(在我的例子中是PDO,但它并不重要)。

REST API使用内部身份验证(用户名/密码)。有多个用户组访问REST API,例如客户,IT,后端,客户服务。它们最终都使用相同的MySQL连接,因为它们大多数时候也使用相同的端点。

在MySQL数据库中,我想保存负责更改数据集的用户。

我想通过触发器在MySQL层上实现它。因此,我必须以某种方式将REST API中的用户信息传递给此触发器。有一些MySQL调用,如CURRENT_USER()status,可以查询元信息。我的想法是以某种方式将连接字符串中的其他信息传递给MySQL,这样我就不必使用不同的数据库用户,但我仍然可以从触发器中检索这些信息。

我已经做过一些研究,并且不认为这是可能的,但是因为它会很好地促进我的任务,所以我仍然想询问是否有人确实知道我的问题的解决方案。

1 个答案:

答案 0 :(得分:3)

我会在connect上设置一个会话变量。

感谢@ÁlvaroGonzález的评论,提醒我在PDO init上运行命令。

无需将数据添加到临时表的建议。设置一个或多个会话变量同样好,假设您只需要一些标量。

$pdo = new PDO($dsn, $user, $password, [
    PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION,
    PDO::MYSQL_ATTR_INIT_COMMAND => "SET @myvar = 'myvalue', @myothervar = 'othervalue'"
]);

通过调用$pdo->exec(),也可以在连接后的任何时间设置会话变量。

$pdo->exec("SET @thirdvar = 1234");

您可以在SQL查询中读取会话变量:

$stmt = $pdo->query("SELECT @myvar, @myothervar");
foreach ($stmt->fetchAll(PDO::FETCH_ASSOC) as $row) {
    print_r($row);
}

您还可以在触发器中读取会话变量:

CREATE TRIGGER mytrig BEFORE INSERT ON mytable
FOR EACH ROW
    SET NEW.somecolumn = @myvar;