我无法在后续的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
答案 0 :(得分:0)
假设您的函数定义良好(因为您测试过它),2014错误是由于在获取早期查询的结果之前尝试运行查询而引起的。在定义函数之后,你必须调用PDO的fetch方法来获取MySQL的响应。
TL; DR:只需添加
$query->fetchAll();
在你第一次查询之后,应该这样做。