如何在mysql中使用包含绑定参数的查询创建存储过程?

时间:2019-04-26 22:15:20

标签: php mysql stored-procedures parameters binding

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

但是,由于使用绑定参数,似乎无法在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;
    }

}

有人知道我的存储过程应该是什么样子以及如何称呼它吗?

1 个答案:

答案 0 :(得分:1)

proc看起来像这样:

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存储过程。