Здравствуйте, я хотел бы создать систему поиска в своем блоге, только вот она не работает! Я сделал этот код, у меня ошибка такого типа:
SQLSTATE[HY093]: Invalid parameter number: parameter was not defined
Если у вас есть решение для меня, это будет хорошо, спасибо вам большое! мой код:
/**
* @Route("/recherche")
* @param Request $request
* @return Response
*/
public function search(Request $request): Response
{
$info = $this->getDoctrine()->getRepository(InfoMore::class)->findByInfo(2);
$form = $this->createForm(SearchType::class);
$form->handleRequest($request);
if ($form->isSubmitted() && $form->isValid()) {
$contentOfUsers = $form->getData();
$contentOfUsers['name'];
$search = $this->getDoctrine()->getRepository(Articles::class)->findBysearch($contentOfUsers);
return $this->render('backOffice/search/resultat.html.twig', [
'resultatOfSearch' => $search,
'info' => $info
]);
}
return $this->render('backOffice/search/search.html.twig', [
'form' => $form->createView()
]);
}
мой formType:
public function buildForm(FormBuilderInterface $builder, array $options)
{
$builder
->add('name', TextType::class, [
'attr' => [
'maxlength' => '30',
'minlength' => '3',
'label' => 'nom'
],
'constraints' => [ new Assert\Length([
'min' => '2',
'minMessage' => 'Votre nom doit contenir au minimum {{ limit }} caractères.',
'max' => '30',
'minMessage' => 'Votre nom ne doit pas dépasser {{ limit }} caractères.'
])]
])
;
}
Мой репозиторий:
/**
* @param $contentOfUsers
* @return array
* @throws \Exception
*/
public function findBysearch(array $contentOfUsers) {
$query = $this->createQueryBuilder('r')
->select('r')
->where('r.nameArticle LIKE :chaine')
->setParameter(':chaine', $contentOfUsers)
->getQuery();
return $query->getResult();
}
мои взгляды:
{{ form_start(form) }}
{{ form_label(form) }}
{{ form_widget(form) }}
<button class = "btn btn-outline-success my-2 my-sm-0" type = "submit">Search</button>
{{ form_end(form) }}
и результат:
{% for search in resultatOfSearch %}
{{ search.resultatOfSearch }}
{% endfor %}






В вашем репозитории вам не нужно указывать : в методе setParameter.
Замените строку этой:
->setParameter('chaine', $contentOfUsers)
Вы можете проверить официальная доктринальная документация на привязку параметров.
Спасибо за ответ, но это все еще не работает! Это возвращает мне ту же ошибку
Попробуйте этот синтаксис в findBysearch
$queryBuilder = $this->createQueryBuilder('r');
$queryBuilder->select('r')
->where($queryBuilder->expr()->like('r.nameArticle', ':chaine'))
->setParameter('chaine', '%' . $contentOfUsers . '%');
$query = $queryBuilder->getQuery();
return $query->getResult();
Я пропустил; в конце. Это было?
Нет-нет-нет, первый аргумент setParameter не нужен: вам нужно использовать: only в операторе where.
Я исправил параметр, как указал rev. Изменилась ли ошибка при использовании приведенного выше кода?
Я первый убрал где. Я забыл это там. Также попробуйте добавить подстановочный знак% до и после текста поиска. Я внес изменения в приведенный выше код
Вы пытаетесь запросить весь массив вместо одного значения в
public function findBysearch(array $contentOfUsers) {
Попробуйте изменить его так, чтобы ваш аргумент был единственным значением. Вы можете установить параметр в вашем контроллере, например, $value = $contentOfUsers['name'];, а затем
public function findBysearch($value) {
$query = $this->createQueryBuilder('r')
->select('r')
->where('r.nameArticle LIKE :value')
->setParameter('value', $value)
->getQuery();
return $query->getResult();
}
Спасибо за вашу помощь, работает, но у меня нет результата в моих взглядах, которые у меня есть в результате
@CrownBackend, извините, но я не понимаю, что вы имеете в виду.
Спасибо за ответ, но ваше решение у меня не работает, результата нет! У меня нет ошибки, но нет результата, который отображается в моем представлении
В вашем контроллере вы должны установить переменную для $contentOfUsers['name'] (например, $value = $contentOfUsers['name'];), а затем вызвать эту переменную в своем запросе следующим образом: ->findBysearch($value). Все это в вашем контроллере.
Спасибо за ответ. У меня в контроллере такие же вещи, но нет результата.
Если вы ищете не точное имя, а его часть, вы можете поместить это в свое репо: ->setParameter('value', '%'.$value.'%')
У меня ошибка этого типа = Неверный параметр: значение токена не определено в запросе
Я предполагаю, что это связано с тем, что для начала в форму не было введено никакой информации. Итак, над вашим «если форма действительна» и т. д. Поместите $value = null.
Здесь ? : $ form = $ this-> createForm (SearchType :: class); $ form-> handleRequest ($ запрос); $ значение = ноль; if ($ form-> isSubmitted () && $ form-> isValid ()) {
Да где угодно до формы.
Когда я удаляю "return $ query-> getResult ();" в репозитории Это работает, но это не дает мне результата
ContentOfUsers должен быть массивом названий статей? В вашем контроллере есть строка $ contentOfUsers ['name']; -> Что это за фиг? Не должно быть $ contentOfUsers = $ contentOfUsers ['name'], а затем вы передаете это имя в rep и ищете статью с тем же именем, используя = not like?