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

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

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

1 голос
/ 27 апреля 2019

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

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

Будьте осторожны, чтобы назвать входной параметр вашего процесса чем-то отличным от любого из столбцов вашей таблицы, иначе вы можете получить неожиданные результаты.

Вы НЕ должны использовать подготовленный оператор в этой процедуре.Просто используйте параметр вашей процедуры в выражении в вашем операторе SQL.

Вам не нужно писать курсор в proc для обработки результата.По умолчанию, который MySQL делает с оператором SELECT, он возвращает свой результат.

Вы бы назвали его из PHP следующим образом:

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

Весь остальной код PHP будетидентичны.

Честно говоря, я не стал бы беспокоиться об этой процедуре.Это не очень помогает уменьшить ваш код.Но это так:

  • Заставляет вас изучать новый язык для кода процедуры
  • Сложное развертывание приложения
  • Риск, увеличивающий нагрузку обработки на сервер базы данных

Я почти никогда не использую хранимые процедуры MySQL.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...