【问题标题】:Pass PHP variable to MySQL trigger #nette将 PHP 变量传递给 MySQL 触发器#nette
【发布时间】:2018-06-21 11:14:09
【问题描述】:

我在我的数据库中创建了触发器。我需要将 PHP 变量传递给该触发器。

我尝试在 PhpMyAdmin 中执行类似的操作:

SET @myVariable = 123;
INSERT INTO table (foo) VALUES (bar);

Trigger 成功获取@myVariable - 所以我在 Nette 项目中尝试过,但没有成功。

首先,Prepared Statement 只能执行一个命令,所以我不能同时调用 SET 和 INSERT。

然后我发现变量应该对整个连接有效的信息,所以我在连接到数据库后尝试调用$database->query('SET @myVariable = 123');。然后我尝试插入。但同样,我没有成功。

有人知道如何传递 PHP 变量来触发吗?

【问题讨论】:

  • $database->query('SET @myVariable = 123'); 看起来像 Nette 框架查询函数,我将分析该查询函数以查看是否存在查询或执行限制,例如仅在字符串以 SELECT、INSERT、UPDATE 或 DELETE 开头时执行查询例如.... 通常这应该可以在原生 PHP 数据库查询函数调用中正常工作,例如 mysqli_query("SET @myVariable = 123"); 或作为准备好的语句 mysqli_prepare("SET @myVariable = 123")
  • 我认为变量设置成功,但是触发器看不到。

标签: mysql nette


【解决方案1】:

对于设置变量是合适的QUERY命令。永远不要连接字符串,总是加上带问号的参数(SQL注入漏洞)

$database->query('SET @myVariable = ?', 123);
$database->query('INSERT INTO table ?', ['foo' => bar]);

【讨论】:

    【解决方案2】:

    要将变量显式设置为特定值,请使用 SET 语句。

    同义词:

    SET @variable = 值

    例如:

    $db->query('SET @myVariable=?', '123' ); OR use mysql as mention above.
    

    设置变量的值会一直存在,直到您为其分配另一个值或会话结束。

    因此,您可以使用 select 语句在 Trigger 中获取变量。

    同义词:

    选择@变量;

    例如:

    在触发器中

    IF (condition) THEN
      SET myVariable_t = (SELECT @myVariable);
       INSERT INTO table
         SET column_name = myVariable_t,          
    END IF;
    

    【讨论】:

    • 问题出在字符串变量上。当我分配数值时,一切正常。
    • 您在使用 PDO 吗?您可以将参数用作数组并传递值。它会起作用的。我已经用 ip 地址、url 等字符串进行了测试,它可以正常工作。
    【解决方案3】:

    由于某种原因,问题出在我将变量与字符串一起使用时。当我将整数值分配给变量时,一切正常。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-08-24
      • 2020-01-24
      • 1970-01-01
      • 2018-03-08
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多