无法通过PDO创建MySQL功能

时间:2014-09-24 18:38:05

标签: php mysql sql pdo

我创建了一个CLI PHP脚本,旨在允许我针对我的数据库运行更新脚本。该脚本按预期工作,运行顺序更新文件,回滚错误等。但是,我唯一能够正确执行它的是创建函数。我错过了什么?


脚本

以下是脚本如何工作的基础知识:

$sql = file_get_contents($file);
$sql = "USE `$database`;" . $sql;
$stmt = $pdo->prepare($sql);

try
{
    $stmt->execute();

    if($stmt->errorCode() !== '00000')
    {
        throw new Exception("Error: Unable to run update $file\n" . print_r($stmt->errorInfo(), true));
    }
}
catch(Exception $ex)
{
    $pdo->rollBack();
    echo "Error: Exception occured running update $file\n" . print_r($ex, true) . "\n";
    throw $ex;
}

SQL

这里是SQL代码的Function部分的一个例子:

DELIMITER ;;
CREATE DEFINER=CURRENT_USER FUNCTION `uuid_from_bin`(b BINARY(16)) RETURNS char(36) CHARSET latin1
    DETERMINISTIC
BEGIN
  DECLARE hex CHAR(32);
  SET hex = HEX(b);
  RETURN LOWER(CONCAT(LEFT(hex, 8), '-', MID(hex, 9,4), '-', MID(hex, 13,4), '-', MID(hex, 17,4), '-', RIGHT(hex, 12)));
RETURN 1;
END ;;

如果我在MySQL Workbench中运行此代码,它将按预期运行。当我使用PDO运行我的脚本时,除了函数之外的所有内容都会被创建并填充。我没有错误也没有例外。


到目前为止......

我已经尝试删除定义者,认为用户是" CURRENT_USER"可能是' user @ randomip'并且系统中的用户被定义为' user @%'。

我刚刚从SQL中删除了 definer 。仍然可以在MySQL Workbench中使用,但不能在此脚本中使用。

我还将函数拉出到自己的SQL中,结果相同。


其他信息

MySQL 5.5.37-0ubuntu0.14.04.1

PHP 5.5

当我连接PDO时,我没有设置数据库,因为脚本可能需要创建数据库。但脚本附加了 USE 语句。所有其他DDL语句都可以工作。

根据模式,用户对模式具有授予以外的所有权限,特别是 ci _%


解决方案,更新DELIMITER

更新了代码以删除 DELIMITER

#DELIMITER USED TO BE HERE
CREATE DEFINER=CURRENT_USER FUNCTION `uuid_from_bin`(b BINARY(16)) RETURNS char(36) CHARSET latin1
    DETERMINISTIC
BEGIN
  DECLARE hex CHAR(32);
  SET hex = HEX(b);
  RETURN LOWER(CONCAT(LEFT(hex, 8), '-', MID(hex, 9,4), '-', MID(hex, 13,4), '-', MID(hex, 17,4), '-', RIGHT(hex, 12)));
RETURN 1;
END;

1 个答案:

答案 0 :(得分:7)

当您通过PDO等API提交声明时,无需使用DELIMITER

实际上,一定不能使用DELIMITER,因为服务器的SQL解析器无法识别它。它只能在mysql客户端中识别。