【问题标题】:Mysql errors 2014 or 1305 trying to call user-defined function in sql queryMysql 错误 2014 或 1305 试图在 sql 查询中调用用户定义的函数
【发布时间】:2016-04-17 17:44:41
【问题描述】:

我无法在后续的 sql 查询中访问我的用户定义函数 strip_punctuation()。我正在使用 PHP 和 PDO。

无论我如何尝试,我都会遇到以下两个错误之一:

MySQL 错误 2014 无法在其他无缓冲查询时执行查询 活跃

MySQL 错误 1305 函数不存在。

我尝试过使用 prepare()、exec() 和其他各种组合,但无论我做什么,我都会得到空结果或上述两个错误之一。

这是我的功能

(注:$this->PROJECT_DB->connection->等价于PDO->connection->)

public function searchAutoComplete($searchString){
    $this->PROJECT_DB->connection->setAttribute(PDO::MYSQL_ATTR_USE_BUFFERED_QUERY, true);

    $sql ="DROP FUNCTION IF EXISTS strip_punctuation; 
    DELIMITER | CREATE FUNCTION strip_punctuation($input text) RETURNS text 
    BEGIN 
    DECLARE $stringValue VARCHAR(100); 
    SET $stringValue = REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE($input,'.',''),',',''),'?',''),'@',''),'#',''),'$',''),'%',''),'^',''),'*',''),'<',''),'>',''),':',''),'\n',''),')','');
    RETURN $stringValue;
    END; | DELIMITER ;";

    //$query = $this->PROJECT_DB->connection->exec($sql);
    $query = $this->PROJECT_DB->connection->query($sql);

    if($query===false){
        throw new Exception('Project.model: searchAutoComplete: Error with strip_punctiation function. Error was: ' . print_r($this->PROJECT_DB->connection->errorInfo(),true) . ';<br />SQL was: <br />' . $sql); 
    }

    $sql=" SELECT strip_punctuation('something@else.com') AS FoundWord;";

    $query = $this->PROJECT_DB->connection->query($sql);



    if($query===false){
        throw new Exception('Project.model: searchAutoComplete: Error with select query. Error was: ' . print_r($this->PROJECT_DB->connection->errorInfo(),true) . ';<br />SQL was: <br />' . $sql); 
    }
    $results = $query->fetchAll(PDO::FETCH_OBJ);

    return $results;
}

当我在 Sequel Pro(一个 sql 编辑器程序)中运行这两个查询(定义函数和简单的 select 语句)时,我没有任何问题。 我尝试在一个查询中运行这两个语句,但没有返回任何结果。

我正在使用 pdo_mysql 5.5.40-36.1 运行 PHP 5.3.29

【问题讨论】:

    标签: php mysql pdo


    【解决方案1】:

    假设您的函数定义明确(因为您确实对其进行了测试),则 2014 错误是由于在获取早期查询的结果之前尝试运行查询而导致的。您还必须在定义函数之后调用 PDO 的 fetch 方法,以获取 MySQL 的响应。

    TL;DR:只需添加

    $query->fetchAll();
    

    在您的第一个查询之后,应该可以解决问题。

    【讨论】:

    • 是的,我试过了,但我仍然收到 2014 错误:在其他无缓冲查询处于活动状态时无法执行查询。考虑使用 PDOStatement::fetchAll()。我还尝试了一个非常简化的用户定义函数。很奇怪,因为它实际上之前工作过,没有 fetchAll 也没有设置 MYSQL_ATTR_USE_BUFFERED_QUERY。我开始认为这与 PDO 安装有关。
    猜你喜欢
    • 2013-12-06
    • 2021-09-30
    • 1970-01-01
    • 2013-11-07
    • 1970-01-01
    • 2023-01-20
    • 2012-02-08
    • 1970-01-01
    • 2012-08-29
    相关资源
    最近更新 更多