Mysql错误2014或1305试图在sql查询中调用用户定义的函数

时间:2016-01-12 22:33:15

标签: php mysql pdo

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

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

  

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

OR

  

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

1 个答案:

答案 0 :(得分:0)

假设您的函数定义良好(因为您测试过它),2014错误是由于在获取早期查询的结果之前尝试运行查询而引起的。在定义函数之后,你必须调用PDO的fetch方法来获取MySQL的响应。

TL; DR:只需添加

$query->fetchAll();

在你第一次查询之后,应该这样做。