У меня есть строка поиска, и я создал запрос в своем коде, но теперь я хочу создать для него хранимую процедуру, чтобы я мог просто вызывать ее всякий раз, когда мне это нужно, вместо того, чтобы запрос был в моем коде.
Тем не менее, похоже, что я не могу создать хранимую процедуру в 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;
}
}
Кто-нибудь знает, как должна выглядеть моя хранимая процедура и как я ее назову?
Процесс будет выглядеть так:
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.
Вам не нужно писать курсор в процедуре для обработки результата. По умолчанию процедура MySQL с оператором SELECT возвращает свой результат.
Вы бы назвали это из PHP следующим образом:
$req = $db->prepare("CALL MyProc(:title)");
Весь остальной ваш PHP-код будет идентичен.
Честно говоря, я не стал бы беспокоиться об этой процедуре. Это не очень помогает уменьшить ваш код. Но это делает:
Я почти никогда не использую хранимые процедуры MySQL.