2014-09-24 115 views
9

我已经创建了一个CLI PHP脚本,旨在允许我对我的数据库运行更新脚本。该脚本按预期工作,运行顺序更新文件,回滚错误等。但是,我无法正确执行的唯一的事情就是创建函数。我错过了什么?通过PDO创建MySQL函数时遇到问题


脚本

这里的脚本是如何工作的基本知识:

$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公司de:

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”的用户可能是“用户@ randomip”,并在系统中的用户定义作为'user @%'。

我也刚刚从SQL中删除了定义者。仍然适用于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; 
+0

存储过程的名称是什么?你通常会''调用sp_nameOfStoredProc;' – 2014-09-24 18:45:53

+0

你从工作台和你的PHP代码登录到数据库的权限是什么?不同的用户=不同的权限集。 – 2014-09-24 18:49:51

+0

@JayBlanchard这是一个带有SQL代码的文件,它定义了一个函数,而不是一个存储过程。问题中列出了其中一项功能。 – Chris 2014-09-24 18:57:38

回答

7

当您通过API(如PDO)提交语句时,不需要使用DELIMITER

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

+0

我之前曾尝试过,但没有成功,我想从问题中解脱出来,然后再次尝试一些不同的东西。用解决的代码更新了问题。谢谢。 – Chris 2014-09-24 19:16:15