Как я могу добавить этот динамически созданный URL-адрес в переменную PHP?

#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));