Как получить динамические _get из url?

76
10

У меня есть динамический URL. Количество _gets изменится и значения будут разными. Я использую значения _gets для создания запроса mysql, но мне не удается получить их из URL-адреса.

Прямо сейчас у меня есть это:

preg_match_all('/&field_\d+/', $_SERVER['QUERY_STRING'], $matches);

Это получение матчей, я просто не уверен, куда идти отсюда, или это даже правильный путь. Мне просто нужно, чтобы он прошел через все поле_ # и возвращал их значения, чтобы я мог использовать их при построении запроса.

Может ли кто-нибудь указать мне в правильном направлении? Я пробовал какое-то время, и я, вероятно, сейчас думаю об этом.

спасибо

спросил(а) 2021-01-28T00:16:55+03:00 3 месяца, 1 неделя назад
1
Решение
62

Сначала начните с массива столбцов, которые действительно существуют в вашей таблице:

$real_columns = array("field1", "field2", "field3");

Отфильтруйте суперглобальный $ _GET, чтобы вы только подмножество с ключами, соответствующими вашим столбцам:

$inputs = array_intersect_key($_GET, array_flip($real_columns));

Создать массив field =? сроки:

$terms = array_map(
function($field) { return "'$field'=?"; },
array_keys($inputs)
);

Подготовьте инструкцию SQL:

$sql = "SELECT * FROM mytable ";
if ($terms) {
$sql .= "WHERE " . implode(" AND ", $terms);
}

$stmt = $pdo->prepare($sql);
$stmt->execute(array_values($inputs));

ответил(а) 2021-01-28T00:16:55+03:00 3 месяца, 1 неделя назад
44

Нет причин для использования такого подхода. У вас есть ряд доступных вам инструментов, которые намного лучше, чем использование некоторой методологии regex.

Прежде всего, везде, где вы строите эту строку запроса, вы, вероятно, должны использовать нотацию доступа к массиву. Итак, скажем, у вас есть форма с такими полями:

<input name="field_1" ... />
<input name="field_2" ... />
...
<input name="field_n" ... />

Вместо этого вы должны:

<input name="field[1]" ... />
<input name="field[2]" ... />
...
<input name="field[n]" ... />

Когда вы отправляете форму через GET, это сделает хороший массив доступным для вас в $_GET['field'] который имеет в качестве ключей значения внутри скобок. Как это:

var_dump($_GET['field']);

/*
Outputs something like
Array(
[1] => ...,
[2] => ...,
...
[n] => ...
)
*/

Если вам не нужно вводить порядок, вы можете использовать скобки [] для получения числового массива с 0 индексами.

Теперь у вас есть все ваши значения без регулярного анализа строки.

Второй инструмент, о котором вы должны знать, - parse_str(). Если у вас когда-либо было время для фактического анализа строки запроса, как вы пытаетесь сделать, используйте это (не используйте explode()).

$query_string = 'field[1]=foo&field[2]=bar...'; // some query string
$query_string_data = array();

parse_str($query_string, $query_string_data);
var_dump($query_string_data);

/*
Outputs something like
Array(
'field' => Array (
[1] => ...,
[2] => ...,
...
[n] => ...
)
)
*/

ответил(а) 2021-01-28T00:16:55+03:00 3 месяца, 1 неделя назад
45

Я не совсем понимаю, что вы имеете в виду, но я предполагаю, что вы хотите получать значения из строки запроса с неизвестными именами переменных? Если это так, используйте супергелбал $ _GET и проведите через него.

что-то вроде этого:

foreach($_GET as $var => $value){
//build your query or whatever
}

ответил(а) 2021-01-28T00:16:55+03:00 3 месяца, 1 неделя назад
Ваш ответ
Введите минимум 50 символов
Чтобы , пожалуйста,
Выберите тему жалобы:

Другая проблема