【问题标题】:How do I create a stored procedure in mysql with a query that includes binding parameters?如何使用包含绑定参数的查询在 mysql 中创建存储过程?
【发布时间】:2019-04-26 22:15:20
【问题描述】:

我有一个搜索栏,并在我的代码中创建了一个查询,但我现在想为它创建一个存储过程,这样我就可以在需要时调用它,而不是在我的代码中使用查询。

但是,我似乎无法在 mysql 中创建存储过程,因为我使用了绑定参数。 LIKE CONCAT('%',:title,'%')

public function search($searchTerm) {
    $db = Db::getInstance();
    $req = $db->prepare("SELECT p.postID, p.title, p.tagID, p.content, p.date, p.postImage, u.username "
            . " FROM user as u inner JOIN user_post as UP on u.userID=up.userID inner JOIN post as p "
            . "on up.postID=p.postID WHERE p.title LIKE CONCAT('%',:title,'%')");
    $req ->execute(array('title' => $searchTerm));
    $posts = [];
    foreach ($req->fetchAll() as $blogPost) { 
        array_push($posts, new Post($blogPost['postID'], $blogPost['title'], $blogPost['tagID'], $blogPost['content'], $blogPost['date'], $blogPost['postImage'], $blogPost['username']));
    }

    if (empty($posts)) {
        return null;

    } else {
        return $posts;
    }

}

有谁知道我的存储过程应该是什么样子以及如何调用它?

【问题讨论】:

    标签: php mysql stored-procedures parameters binding


    【解决方案1】:

    过程看起来像这样:

    CREATE PROCEDURE MyProc(IN in_title TEXT)
    BEGIN
      SELECT p.postID, p.title, p.tagID, p.content, p.date, p.postImage, u.username 
      FROM user as u inner JOIN user_post as UP on u.userID=up.userID inner 
      JOIN post as p ON up.postID=p.postID 
      WHERE p.title LIKE CONCAT('%', in_title, '%');
    END
    

    注意将 proc 的输入参数命名为与表的任何列不同的名称,否则您可能会得到意想不到的结果。

    您确实需要在此过程中使用准备好的语句。只需在 SQL 语句的表达式中使用过程参数即可。

    您不需要在 proc 中编写任何游标来处理结果。 MySQL proc 对 SELECT 语句所做的默认操作是返回其结果。

    你可以这样从 PHP 中调用它:

    $req = $db->prepare("CALL MyProc(:title)");
    

    您的 PHP 代码的所有其余部分都是相同的。

    坦率地说,我不会为这个程序而烦恼。它并不能真正帮助您减少代码。但确实如此:

    • 让你学习一门新的程序代码语言
    • 使您的应用程序部署复杂化
    • 有将更多处理负载推到数据库服务器上的风险

    我几乎从不使用任何 MySQL 存储过程。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-10-10
      • 1970-01-01
      • 2017-09-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多