Как я могу создать хранимую процедуру в MySQL с запросом, который включает параметры привязки?

0

У меня есть строка поиска, и я создал запрос в своем коде, но теперь я хочу создать для него хранимую процедуру, чтобы я мог просто вызывать ее всякий раз, когда мне это нужно, вместо того, чтобы запрос был в моем коде.

Тем не менее, похоже, что я не могу создать хранимую процедуру в 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;
    }

}

Кто-нибудь знает, как должна выглядеть моя хранимая процедура и как я ее назову?

Теги:
stored-procedures
binding
parameters

1 ответ

0

Процесс будет выглядеть так:

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.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню