【问题标题】:stored procedure php pdo with mariadb - doing something wrong带有mariadb的存储过程php pdo - 做错了什么
【发布时间】:2019-10-25 23:25:48
【问题描述】:

完全免责声明我以前从未搞过存储过程,但对常规查询非常有能力。我没有从我创建的这个存储过程测试中得到任何结果,并且我知道有结果,因为我可以从“正常”查询中获得它们。我做错了什么?

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:

$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] => 
        )

)

另外,是否需要为存储过程中的字符串定义 VARCHAR(xxx)?在我的正常查询中,由于这个字符串是由 php 提供的,所以没有定义长度,我想保持不变。

【问题讨论】:

    标签: php mysql stored-procedures


    【解决方案1】:

    @one 用于 mysql 会话变量。有它的用途。

    你需要做的是

    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 ;
    

    【讨论】:

    • 成功了,它正在工作,但是当我在此之后执行查询时,我得到“致命错误:未捕获的 PDOException:SQLSTATE [HY000]:一般错误:2014 无法执行查询,而其他无缓冲查询处于活动状态。现在。
    • 如果在下一次调用 PDO::query() 之前未获取结果集中的所有数据,则调用可能会失败。调用 PDOStatement::closeCursor() 以释放与 PDOStatement 对象关联的数据库资源,然后再发出对 PDO::query() 的下一次调用。所以使用 $stmt->closeCursor();在下一个 pdo 语句之前
    猜你喜欢
    • 2010-10-23
    • 2013-12-10
    • 2017-09-17
    • 2013-11-10
    • 2011-08-20
    • 2021-10-31
    • 1970-01-01
    • 2013-05-29
    • 1970-01-01
    相关资源
    最近更新 更多