我有一个搜索栏,我在代码中创建了一个查询,但是现在我想为其创建一个存储过程,这样我就可以在需要时随时调用它,而不必在代码中包含查询。
但是,由于使用绑定参数,似乎无法在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;
}
}
有人知道我的存储过程应该是什么样子以及如何称呼它吗?
答案 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存储过程。