Изменить разделитель аргументов URL

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

Здесь моя проблема. У меня есть датчик, который отправляет данные в базу данных MySQL в следующем виде:

http://192.168.1.2/add.php?i=mit=0106,22:5113/07/2016,liv=175cm,livp=000%,b=12.0V,t=36;

Теперь я могу отобразить это в моей таблице MySQL:

"mit=0106,22:5113/07/2016,liv=175cm,livp=000%,b=12.0V,t=36;"

но я бы хотел отобразить каждый аргумент отдельно.

Вы знаете, как изменить разделитель с «&»до», «?

Идеальным решением было бы изменить команду url на эту форму:

http://192.168.1.2/add.php?i=mit=0106&22:5113/07/2016&liv=175cm&livp=000%&b=12.0V&t=36;

но, к сожалению, я могу перепрограммировать датчик, поэтому мне нужно изменить разделитель с «&»к», «.

-1

Решение

arg_separator.input директива конфигурации, которую вы ищете:

строка arg_separator.input
Список разделителей, используемых PHP для разбора входных URL-адресов на переменные.

Замечания:
Каждый символ в этой директиве считается разделителем!

Помните, что режимом установки является PHP_INI_PERDIR, что означает, что он «может быть установлен в php.ini, .htaccess, httpd.conf или .user.ini (начиная с PHP 5.3)» (http://php.net/manual/en/configuration.changes.modes.php)


Если вы не можете изменить этот параметр, вы можете посмотреть строку запроса целиком (см. Переменную $ _SERVER) и разбить ее на запятую самостоятельно, используя explode или что-то в этом роде.

2

Другие решения

Если я правильно понял, вы должны хранить все name=value пары из этой строки в отдельные столбцы в таблице базы данных.

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

Предполагая, что вы уже создали столбцы с именем mit, liv, livp, b а также t с требуемым типом данных, и ваша строка проверяется дважды, прежде чем она попадает в базу данных, чтобы избежать SQL-инъекций, вы можете сделать что-то вроде этого:

# your input string
$input = "mit=0106,22:5113/07/2016,liv=175cm,livp=000%,b=12.0V,t=36;";

# loop through it and determine all name=value pairs
while (strlen($input)>2) {
preg_match ('/([a-z]+)\=(.*?)(?:,[a-z]+=|;)/', $input, $m);
# store names here
$d1[] = "'{$m[1]}'";
# and values here
$d2[] = "'{$m[2]}'";
$input = substr($input, strlen($m[1]) + strlen($m[2]) + 2);
}

# join arrays into string
$d1 = join(",", $d1);
$d2 = join(",", $d2);

# and put them into query
$sql = "INSERT INTO mytable ($d1) VALUES ($d2);";

echo $sql;

Это распечатает запрос как это

INSERT INTO mytable ('mit','liv','livp','b','t')
VALUES ('0106,22:5113/07/2016','175cm','000%','12.0V','36');

Как это while петля работает?

Оно использует $input в качестве аргумента и искать name=value сопровождаемый другим name= (для внутренних пар) или ; (для последней пары), чтобы определить его конец. Чем это извлекает название в отдельный массив d1 а также значение в другой массив под названием d2, Удаляет первое совпадение с начала строки и повторяет цикл до тех пор, пока $input строка пуста Конечно, элементы в этих двух массивах хранятся в одинарных кавычках для последующего использования в запросе.

В конце я объединил оба массива (отдельно) запятыми между элементами и поместил их в строку запроса $sql,

Пожалуйста, обратите внимание (снова) что отправлять данные таким способом непосредственно из параметра GET URI в базу данных опасно, без предварительной проверки данных.

1

Не уверен, что именно вы имеете в виду, но вы можете использовать str_replace() чтобы помочь вам или, возможно, вы можете преобразовать это в массив с помощью explode() затем сделайте то, что вам нужно сделать с данными, и поместите их обратно в строку, используя implode().

редактировать: спасибо, исправил путаницу.

0

echo "http://192.168.1.2/add.php?i=" . str_replace(",","&","mit=0106,22:5113/07/2016,liv=175cm,livp=000%,b=12.0V,t=36;");
-3
По вопросам рекламы [email protected]