Сначала я должен сказать, что я новичок, у меня буквально 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;
но, к сожалению, я могу перепрограммировать датчик, поэтому мне нужно изменить разделитель с «&»к», «.
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 или что-то в этом роде.
Если я правильно понял, вы должны хранить все 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 в базу данных опасно, без предварительной проверки данных.
Не уверен, что именно вы имеете в виду, но вы можете использовать str_replace()
чтобы помочь вам или, возможно, вы можете преобразовать это в массив с помощью explode()
затем сделайте то, что вам нужно сделать с данными, и поместите их обратно в строку, используя implode()
.
редактировать: спасибо, исправил путаницу.
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;");