PHP MySQL Настройка запроса с помощью QueryString

Извиняюсь за вопрос новичка.

На моем сайте есть форма.

<form action='' method='get'>
<select id = "cSelector" name = "cSelector">
    <option value = ""></option>
    <option value = "">Show All Items</option>
    <option value = "Compensation">Compensation</option>
</select>
  <input type = "submit" value = "Submit">  

</form>

Моя строка запроса, созданная при отправке формы, выглядит так:

http://website.com/table_example.php?cSelector=Compensation

Мой запрос выглядит так:

$stmt = $conn->prepare("
SELECT t1.CategoryID,t1.SubCategoryName, t1.CategoryName, t1.SubCategoryID, t2.ItemText from
    (SELECT Category.CategoryID,CategoryName, SubCategoryName, SubCategoryID
    FROM Category
    JOIN SubCategory
    ON Category.CategoryID = SubCategory.CategoryID) t1
RIGHT JOIN  
    (SELECT SubCategoryID, ItemText FROM Item) t2
ON (t1.SubCategoryID = t2.SubCategoryID)
WHERE 1 ".$searchQuery." AND CategoryName = ".$search2." ORDER BY ".$columnName." ".$columnSortOrder." LIMIT :limit,:offset");

Предполагаемый результат создает таблицу, запрошенную CategoryName.

Мой вопрос. Почему это правильно выполняется?

$search2='Compensation';

А этого нет?

$search2 = "'".$_GET['cSelector']."'";

Любая помощь будет очень высоко ценится. И благодарю вас!

вы отправляете эту форму через GET, но в $search2 = "'".$_POST['cSelector']."'"; вы используете $_POST. Вместо этого попробуйте $_GET.

dazed-and-confused 22.12.2020 21:54

Кроме того, это не связано с вашим вопросом, но вы должны использовать параметры запроса. Это намного проще и безопаснее, чем вся эта кавычка-кавычки-точка-переменная-точка-кавычка-без кавычек. Сделайте себе одолжение и уменьшите количество ошибок и нагрузку на глаза! Используйте параметры запроса!

Bill Karwin 22.12.2020 21:57

Кроме того, это защитит вас от SQL-инъекций.

dazed-and-confused 22.12.2020 21:58

@ dazed-and-confused и @ Bill-Karwin также изучаю подготовленные запросы. Но, по одной штуке за раз. Очень ценный совет.

David Weisser 22.12.2020 21:59
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Symfony Station Communiqué - 7 июля 2023 г
Symfony Station Communiqué - 7 июля 2023 г
Это коммюнике первоначально появилось на Symfony Station .
Оживление вашего приложения Laravel: Понимание режима обслуживания
Оживление вашего приложения Laravel: Понимание режима обслуживания
Здравствуйте, разработчики! В сегодняшней статье мы рассмотрим важный аспект управления приложениями, который часто упускается из виду в суете...
Установка и настройка Nginx и PHP на Ubuntu-сервере
Установка и настройка Nginx и PHP на Ubuntu-сервере
В этот раз я сделаю руководство по установке и настройке nginx и php на Ubuntu OS.
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
Как установить PHP на Mac
Как установить PHP на Mac
PHP - это популярный язык программирования, который используется для разработки веб-приложений. Если вы используете Mac и хотите разрабатывать...
1
4
52
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

Вы отправляете эту форму через GET

<form action='' method='get'>

Однако ваша линия $search2 = "'".$_POST['cSelector']."'"; использует $_POST

Вместо этого должно быть $_GET:

$search2 = "'" . $_GET['cSelector'] . "'";` 

ПОСЛЕ ИЗМЕНЕНИЙ ОП

Этот

$search2='Compensation';

и

$search2 = "'".$_GET['cSelector']."'";

не то же самое. Вершина - это просто строковое значение. Внизу строковое значение, заключенное в кавычки, так что это не Compensation, а 'Compensation'.

Отредактированный вопрос. Поймал меня на итерации. Пробую все возможные варианты. И форма, и PHP являются GET, и запрос не возвращает результатов. Пустая таблица.

David Weisser 22.12.2020 21:59

Я использую фрагмент кода с именем DataTables, который представляет собой скачанный мной JS-скрипт. Я думаю, редактируя исходный запрос, я вызываю проблемы в сценарии. Ты ответ правильный. Я хотел избежать необходимости учиться программировать таблицу с поиском с нуля.... но я думаю, что мне, возможно, придется. Спасибо вам всем.

David Weisser 22.12.2020 22:06

Суть проблемы на самом деле в том, что вы не совсем уверены, что такое запрос. Если бы две отправленные строки были идентичными, они обе выполнялись бы, но это не так. Как-то.

Настоящая потребность — это видимость вашего запроса. Так что-то вроде

$strQuery = "SELECT t1.CategoryID,t1......";
echo "<pre>$strQuery</pre>";
$stmt = $conn->prepare($strQuery)

Теперь вы можете видеть, что он делает. Вы и так действуете вслепую.

Два дополнительных примечания:

  1. Вы услышите от всех, что это плохая идея помещать параметры, которые вы получаете из get или post, прямо в SQL-запрос. Они не ошибаются.
  2. Построение строк для этих вещей всегда проще, если вы немного подробней об этом. Сначала возьмите переменную, так как вы все равно захотите ее обработать, обрезать пробелы, защитить от кавычек и т. д. Затем поместите ее в строку запроса.

Другие вопросы по теме