PHP GET или POST данные в переменную, включая - PullRequest
0 голосов
/ 11 февраля 2020

Хотите преобразовать динамические c переменные GET в две внутренние переменные, чтобы я мог использовать эти значения в запросе SQL.

Я передаю строку переменной в URL-адрес, подобный этому

http://localhost/api-data?serial=1923473
http://localhost/api-data?manufacturer=jaguar
http://localhost/api-data?location=london
http://localhost/api-data?country=uk

Я хочу преобразовать данные GET в две разные переменные, например, serial становится $ data1, а 1923473 становится $ data2. GET данные всегда в указанном выше формате, я просто хочу преобразовать в две разные переменные.

print_r($_GET);

Я вижу, что переменная передается как массив. Мой вопрос, если данные передаются в следующем формате AAAAA = BBBBB как переменная get, как мне преобразовать AAAAA в переменную $ data1 и BBBBBB в £ data2. Имейте в виду, что данные GET всегда будут уникальными.

Как только я получу эти данные в 2 уникальных переменных, я хочу выполнить запрос SQL.

select blah1, blah2, blah4, blah5 from datastore where $data1 = "$data2";

Заранее спасибо.

Ответы [ 4 ]

2 голосов
/ 11 февраля 2020

Ваш подход не самый лучший, и его нужно будет переработать, если у вас более одной переменной GET, но в целом:

$allowed = ['serial', 'manufacturer']; //etc...
$col = key($_GET);

if(in_array($col, $allowed)) {
    $val = $_GET[$col];

    //Then prepare and execute using whatever DB library you are using
    $st = $db->prepare("SELECT blah1, blah2, blah4, blah5 FROM datastore WHERE $col = ?");
    $st->execute([$val]);
}
1 голос
/ 11 февраля 2020

$_GET - массив всех переданных параметров. Таким образом, URL-адрес ?abc=def&foo=bar приведет к $_GET из

array(2) { 
    ["abc"]=> string(3) "def" 
    ["foo"]=> string(3) "bar" 
}

. Используя это, вы можете l oop просмотреть каждый элемент и добавить его к запросу:

foreach($_GET as $key => $val) {
    $query .= " AND $key = '$val'";
}

Однако убедитесь, что вы учитываете SQL инъекции. Лучшим вариантом для противодействия этому в этом сценарии является проверка каждого ключа списком допустимых ключей.

0 голосов
/ 11 февраля 2020

Это один из способов сделать это простым и декларативным образом .

Я бы настоятельно рекомендовал проверить PDO и PDOStatement для построения запроса. Я не добавил этот пример, потому что это был не вопрос.

<?php

// given 
$_GET = ['serial' => 342, 'something-else' => 'not used'];
$allowedVariables = ['serial', 'manufacturer', 'location', 'country'];

// filter values from the query for only allowed keys
$data = array_filter($_GET, function ($value, $key) use ($allowedVariables) {
    return in_array($key, $allowedVariables);
}, ARRAY_FILTER_USE_BOTH);

// create an array of strings like "$data1 = $data2"
$query = array_map(function ($key, $value) {
    return "$key = $value";
}, array_keys($data), array_values($data));

// build the query while combining values with the "AND" keyword
$query = "select * from datastore where " . implode(' and ', $query);

var_dump($query);
// string(42) "select * from datastore where serial = 342"

0 голосов
/ 11 февраля 2020

Для этого вы можете использовать extract($inputArray) (подробнее о php. net)

Ключами во входном массиве станут имена переменных и их значения Эти новые переменные будут назначены.

Кроме того, если вы хотите отфильтровать ключи, чтобы кто-то не просто вставил нежелательную переменную в вашу текущую область, то перед вызовом функции extract() выполните следующее. .

<?php
// Pick only the data keys that are expected. Their names must be compatible with the PHP variable naming conventions.
$filteredData = array_intersect_key($_GET /* or $_POST*/, array_flip(['serial', 'manufacturer', 'location', 'country']));

// Extract the names into variables in the current scope.
extract($filteredData);
?>
...