带mariadb的存储过程php pdo-出错
完整免责声明我以前从未弄乱过存储过程,但我对常规查询很在行。我没有从我创建的这个存储过程测试中得到任何结果,我知道有一些结果,因为我可以从“正常”查询中得到它们。我做错了什么带mariadb的存储过程php pdo-出错,php,mysql,stored-procedures,Php,Mysql,Stored Procedures,完整免责声明我以前从未弄乱过存储过程,但我对常规查询很在行。我没有从我创建的这个存储过程测试中得到任何结果,我知道有一些结果,因为我可以从“正常”查询中得到它们。我做错了什么 CREATE PROCEDURE get_snet( IN one VARCHAR(255), IN two VARCHAR(255) ) BEGIN SELECT IFNULL( (SELECT cats FROM results081219 WHERE url = @one L
CREATE PROCEDURE get_snet(
IN one VARCHAR(255),
IN two VARCHAR(255)
)
BEGIN
SELECT
IFNULL( (SELECT cats FROM results081219 WHERE url = @one LIMIT 1), '') AS cats1,
IFNULL( (SELECT cats FROM results081219 WHERE url = @two LIMIT 1), '') AS cats2;
END
$$
DELIMITER ;
php:
另外,是否需要为存储过程中的字符串定义VARCHAR(xxx)?在我的普通查询中,由于该字符串是由php提供的,因此没有定义长度,我希望保持不变。
@one
用于mysql会话变量。它有它的用途
你需要做的是
这确实起到了作用,但当我在此之后执行查询时,我得到“致命错误:未捕获的PDOException:SQLSTATE[HY000]:一般错误:2014无法在其他未缓冲查询处于活动状态时执行查询。”现在。如果在发出下一次PDO::query()调用之前未获取结果集中的所有数据,你的电话可能会失败。调用PDOStatement::closeCursor()以释放与PDOStatement对象关联的数据库资源,然后再发出对PDO::query()的下一次调用。所以使用$stmt->closeCursor();在下一个pdo语句之前
$parsed1 = 'google.com';
$parsed2 = 'gmail.com';
//stored procedure way
$stmt = $dbnet->prepare("
CALL get_snet(:parsed1, :parsed2);
");
$binding = array(
'parsed1' => $parsed1,
'parsed2' => $parsed2
);
$stmt->execute($binding);
$results = $stmt->fetchAll(PDO::FETCH_ASSOC);
echo "<pre>";
print_r($results);
echo "</pre>";
Array
(
[0] => Array
(
[cats1] =>
[cats2] =>
)
)
CREATE PROCEDURE get_snet(
IN one VARCHAR(255),
IN two VARCHAR(255)
)
BEGIN
SELECT
IFNULL( (SELECT cats FROM results081219 WHERE url = one LIMIT 1), '') AS cats1,
IFNULL( (SELECT cats FROM results081219 WHERE url = two LIMIT 1), '') AS cats2;
END
$$
DELIMITER ;