2016-01-12 20 views
1

我無法在我的後續sql查詢中訪問我的用戶定義函數strip_punctuation()。我正在使用PHP和PDO。Mysql錯誤2014或1305試圖在sql查詢中調用用戶定義函數

我不斷收到兩個錯誤之一不管我怎麼嘗試這樣的:

MySQL error 2014 Cannot execute queries while other unbuffered queries are active

OR

MySQL error 1305 Function does not exists.

我已經準備使用()試過了,exec()和各種其他的組合,但無論我做什麼,我都會得到空的結果或上面兩個錯誤之一。

這裏是我的功能

(注意函數:$ this-> PROJECT_DB->連接 - >相當於PDO->連接 - >)

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('[email protected]') 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; 
} 

當我運行兩個查詢(定義函數和簡單的select語句)在Sequel Pro(一個sql編輯器程序)中,我沒有問題。 我試過在一個查詢中運行這兩個語句,並且沒有返回任何結果。

我運行PHP 29年3月5日與PDO_MYSQL 5.5.40-36.1

回答

0

假設你的功能是明確界定(因爲你沒有測試它),2014年的錯誤是由試圖獲取前,運行一個查詢造成的先前查詢的結果。你必須在定義函數之後調用PDO的獲取方法來獲取MySQL的響應。

TL; DR:只需添加

$query->fetchAll(); 

您第一次查詢後,認爲應該做的伎倆。

+0

是的,我嘗試過,但我仍然得到2014錯誤:無法執行查詢,而其他未緩衝的查詢處於活動狀態。考慮使用PDOStatement :: fetchAll()。我也嘗試了一個非常簡化的用戶定義函數。非常奇怪,因爲它實際上在工作之前,沒有fetchAll,沒有設置MYSQL_ATTR_USE_BUFFERED_QUERY。我開始認爲這是關於PDO安裝的問題。 –

相關問題