我的查询有点像这样:
CREATE FUNCTION func ... ;
SELECT * FROM ....;
我使用的是php的PDO
,它不允许在$pdo->query()
中有超过1个语句,所以我决定将查询分为两个,所以我使用$pdo->exec()
执行CREATE FUNCTION
查询,然后在select语句上使用$pdo->query()
。
但是,我在执行select语句FUNCTION database.func does not exist
时遇到错误。我该怎么解决这个问题?当我在phpmyadmin中将其作为单个查询运行时,它工作正常
编辑:PHP代码:
class MyClass {
function connectPDO($user,$pass,$chartset="utf8"){
//simple function for making a new PDO object and mysql connection
$dbname = "my_db";
try {
//creating new pdo
$pdo = new PDO('mysql:host=localhost;dbname='.$dbname, $user,$pass);
//attributes set to throw errors and exceptions which can be caught, can be changed
$pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
//fetch associative arrays
$pdo->setAttribute(PDO::ATTR_DEFAULT_FETCH_MODE,PDO::FETCH_ASSOC);
//default chartset
$pdo->exec('SET NAMES "'.$chartset.'"');
} catch (PDOException $e) {
//on some error
$output = "Ay caramba! there's something wrong here!.<br>";
echo $output.$e->getMessage();
exit();
}
$this->db = $pdo;
}
}
$object = new MyClass();
$object->connectPDO("user","pass");
$sqlPreliminary = "
DROP FUNCTION IF EXISTS myFunc;
DELIMITER //
CREATE FUNCTION myFunc (id INT)
RETURNS DECIMAL
BEGIN
RETURN id + 1;
END //
DELIMITER ;
";
$sqlFinal = "
SELECT id, myFunc(id) AS plusOne FROM table;
";
$object->db->exec($sqlPreliminary);
var_dump($object->db->query($sqlFinal)->fetchAll(PDO::FETCH_ASSOC));
3条答案
按热度按时间jxct1oxe1#
编辑:
这是一个多重陈述。第一部分是
DROP FUNCTION MyFunc IF EXISTS
,第二部分是CREATE FUNCTION
。你没有说
$object->db
是什么:调用
connectPDO("user","pass");
,然后使用$object->db->exec($sqlPreliminary);
。$object
在函数体中应该是全局的。目前它不是,所以它是一个局部变量,在函数结束后丢失。其余代码中的$object
有些不同。qv7cva1a2#
我也遇到过同样的问题。当我删除“DELIMITER //”(也是// DELIMITER ;最后),它起作用了。我认为PHP PDO不再需要DELIMITER。
我测试了这个并工作。
wwodge7n3#
创建一个用户定义的函数使用PDO简单地通过exec工作,没有定界符是必需的。这里$db是PDO示例。