#php
Вопрос:
У меня такое чувство, что я веду себя очень глупо, но будьте со мной помягче, так как я очень новичок в PHP.
Поэтому в рамках приложения, которое я создаю, я разрешаю пользователям создавать URL-адрес, который можно использовать для доступа к некоторым их данным из-за пределов платформы. URL-адрес создается PHP-скриптом на основе параметров URL-адреса в браузере пользователей (не бойтесь, параметры позволяют передавать только целые числа, чтобы предотвратить злоупотребление).
Поэтому, чтобы создать URL-адрес, который будет общим, скрипт делает это:
https://example.com/shared.php?function=formamp;account=<?php echo $userid; ?>amp;form=<?php echo $myform; ?><?php if (isset($_GET['ref'])) { echo 'amp;ref='.$ref; } ?><?php if (isset($_GET['upload'])) { echo 'amp;upload='.$upload; } ?>amp;key=<?php echo $key; ?><?php if (isset($_GET['saving'])) { echo 'amp;saving='.$_GET['saving']; } ?><?php if (isset($_GET['expdate'])) { echo 'amp;expdate='.$expdate; } ?><?php if (isset($_GET['enc'])) { echo 'amp;enc='.$enc; } ?>
Я знаю, что мне не нужно постоянно открывать и закрывать тег PHP, но это было просто визуально проще, когда я собирал все вместе.
В любом случае, вышеизложенное хорошо справляется с выплевыванием URL-адреса, но если я хочу добавить окончательный URL-адрес в переменную, как я могу это сделать?
Очевидно, что обычно это было бы тривиально:
$whatever = 'https://example.com/shared.php?function=formamp;account='.$variable.'amp;something='.$variable2.'etc etc
Но поскольку у меня есть операторы if, которые проверяют параметры URL, я не уверен, как это сделать.
Комментарии:
1. Либо используйте тернарный оператор в этих местах для замены любых конструкций if / if-else, либо сделайте это в несколько этапов, добавив данные в вашу переменную в операторах if.
2. Пожалуйста, поделитесь
if
блоком, который предназначен для создания URL-адреса
Ответ №1:
Вы можете объединять строки с .
оператором, вам не нужно сразу создавать URL-адрес. Однако в этом случае было бы проще просто использовать встроенную функцию http_build_query (). Заполните массив при проверке параметров и передайте его функции, когда закончите.
P.S. Не доверяйте проверкам на стороне клиента. Люди могут не захотеть применять их при вводе в строке расположения браузера.
Комментарии:
1. Ладно, я понял. Поэтому стройте URL-адрес по крупицам. Повторите параметры, просто чтобы уточнить — сам скрипт убивает процесс обнаружения чего-либо, кроме целых чисел в параметре URL. Пользователи также не имеют никакого влияния на определенные переменные, которые берутся из значений сеанса (например, идентификатор пользователя), а затем предоставляемый им конечный URL-адрес включает ключ, который по сути является хэшированным значением всех параметров, пересоленным секретным ключом. Таким образом, пользователь не может ничего изменить вручную. С другой стороны, как только они совместно используют URL-адрес, та же система ключей не позволяет другому лицу изменять параметры URL-адреса.
2. Просто хотел сказать тебе спасибо. Функция запроса на сборку работает хорошо. Я обновил свой пост решением.
Ответ №2:
Большое спасибо всем, кто внес свои предложения. В конце концов я пошел со следующим:
$array = array(
'account' => $userid,
'form' => $myform,
'key' => $key,
);
if (isset($_GET['ref'])) {
$array['ref'] = $ref;
}
if (isset($_GET['upload'])) {
$array['upload'] = $upload;
}
if (isset($_GET['saving'])) {
$array['saving'] = $_GET['saving'];
}
if (isset($_GET['expdate'])) {
$array['expdate'] = $expdate;
}
if (isset($_GET['enc'])) {
$array['enc'] = $enc;
}
$finalURL = http_build_query($array);
Работает отлично.
Ответ №3:
Вы всегда можете подготовить параметры перед вводом в строку. Или есть ternary operator ?:
$ref = $_GET['ref'] ? 'amp;ref=' . $_GET['ref'] : '';
$upload = $_GET['upload'] ? 'amp;upload=' . $_GET['upload'] : '';
$saving = $_GET['saving'] ? 'amp;saving=' . $_GET['saving'] : '';
$expdate = $_GET['expdate'] ? 'amp;expdate=' . $_GET['expdate'] : '';
$enc = $_GET['enc'] ? 'amp;enc=' . $_GET['enc'] : '';
$whatever = "https://example.com/shared.php?function=formamp;account={$userid}amp;form={$myform}{$ref}{$upload}amp;key={key}{$saving}{$expdate}{$enc}";
Или сделайте его динамичным с помощью http_build_query()
:
$params = [
'function' => 'form',
'account' => $userid,
'form' => $myform,
'key' => $key,
'ref' => $_GET['ref'] ?? null,
'upload' => $_GET['upload'] ?? null,
...
];
$url = 'https://example.com/shared.php?';
// array_filter will remove any empty value
$url .= http_build_query(array_filter($params));