【问题标题】:how to execute mysql command DELIMITER如何执行mysql命令DELIMITER
【发布时间】:2011-07-15 17:33:47
【问题描述】:

我有很大的问题(对我来说)

我需要从 PHP 执行 MySQL 命令 DELIMITER |,但 mysql_query() 失败并出现错误。我发现mysql_query()不支持DELIMITER的使用,因为这个命令只在MySQL控制台有效

但是当我打开 phpMyAdmin 时,有一个选项可以更改 SQL 选项卡上的 DELIMITER 并且它可以工作,但我不知道如何。

是否可以从 PHP 更改分隔符?在调用使用多个;CREATE TRIGGER 命令之前,我需要这样做。

【问题讨论】:

  • 你应该在 www.stackoverflow.com 上问这个

标签: php mysql


【解决方案1】:

您可能不需要更改分隔符。

CLI 中需要分隔符来指示 SQL 语句的结束位置,因为 CLI 将继续读取和执行更多语句,直到您告诉它停止(例如,使用 exit 或 Control-D)。但它实际读取的只是一个字符流;它需要以某种方式确定一个语句在哪里结束,下一个语句在哪里开始。这就是分隔符的作用。

在 PHP 中,每个函数调用都执行一条语句。一个函数调用中不能有多个语句,因此不需要一种方法来分隔它们。该语句是整个字符串。旧的mysql_query 以及新的mysqli_query 和PDO 都是如此。当然,如果你真的想将多个查询传递给一个函数,还有mysqli_multi_query

在存储过程/触发器/函数/等的情况下,可以有多个语句,但这是由 MySQL 本身处理的(并且始终是 ;,AFAIK)。所以就 PHP 而言,这仍然是一种说法。

您在 phpMyAdmin 中看到的分隔符设置可能用于将语句分开,并且可能是在 PHP 代码中完成的。它必须这样做,因为它接受由多个语句组成的用户输入,但每次函数调用必须只传递一个语句。 (我还没有检查 phpMyAdmin 代码来完全确定这一点)。

【讨论】:

  • 更不用说能够注入分隔符会带来灾难性的后果......
  • @Capsule:嗯,它不会在一个正确编码的应用程序中,但是是的。会使一些 SQL 注入漏洞变得更糟。
  • 由于“正确编码的应用程序”实际上并不在这里,我更愿意提及它;-)
  • OP 在创建触发器语句中使用了分隔符。这与 CLI 无关
  • @YarekT OP 询问是否要更改分隔符 before a CREATE TRIGGER,这是使用 CLI 时必需的。 OP 习惯于 CLI,这就是它与 CLI 的关系。
【解决方案2】:

这取决于。我使用 MySQLi 的 multi_query() 函数,并在创建过程时保留 ;,实际上已经完成(PHP 5.6 和 MySQL 5.6)。我认为你不需要小心分隔符,留下目标代码才可能起作用。 您可能会尝试仅查询 SQL

CREATE XXXX
BEGIN
    sth;
END

试一试。

【讨论】:

    【解决方案3】:

    您需要一个存储例程(过程、函数)来包含所有必要的查询,
    所以在 PHP 中,你可以优雅地调用存储的例程

    【讨论】:

      猜你喜欢
      • 2016-07-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-11-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-06-08
      相关资源
      最近更新 更多