Доступ к базе данных VBA, отправка XML на сервер php изменений & amp; на [& quot; amp_

У меня проблема с чтением XML в php, отправляемом из базы данных доступа, когда тело содержит &, Когда, когда я получаю контент, который содержит & в теле кажется, что & преобразуется в [«amp; где-то в процессе, и в результате весь xml искажается. Это пример того, что я отправляю и получаю:

xml = "<?xml version='1.0' encoding='utf-8'?><query><author>John Steinbeck</author></query>"
Dim objHTTP As New ServerXMLHTTP60
objHTTP.Open "POST", "http://localhost/sandpit/testxml.php", False
objHTTP.setRequestHeader "User-Agent", "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.0)"objHTTP.setRequestHeader "Content-Type", "application/x-www-form-urlencoded"objHTTP.send "request=" & xml

Файл php — это простой эхо-запрос для тестирования:

<?php echo "<xmp>posted: ";var_dump($_REQUEST);echo "</xmp>"; ?>

Когда тело автора не содержит амперсанд, результат в PHP:

["request"]=>
string(84) "<?xml version='1.0' encoding='utf-8'?><query><author>John
Steinbeck</author></query>"}

Однако, если я изменю строку xml на:

xml = "<?xml version='1.0' encoding='utf-8'?><query><author>John &amp; Steinbeck</author></query>"

результат, который я получаю:

posted: array(2) {
["request"]=>
string(41) "<?xml version='1.0'?><query><author>John "["amp;_Steinbeck</author></query>"]=>
string(0) ""}

Вы можете увидеть выше, что & преобразуется в [‘amp ….

Также попытался использовать CDATA со следующим результатом:

posted: array(2) {
["request"]=>
string(68) "<?xml version='1.0' encoding='utf-8'?><query><author><!
[CDATA[ John "["Steinbeck]]></author></query>"]=>
string(0) ""

}

Кажется все после того, как амперсанд до конца строки xml заключен в [«…»], что портит xml.

Также попытался изменить тип содержимого на text / xml и application / xml, в этом случае я получаю пустую строку.

Я проверил отправку того же XML с CURL в php и отлично работает, используя тип содержимого text / xml и даже text / html.

Кто-нибудь знает, в чем может быть проблема?

0

Решение

Вы отправляете свои данные как application/x-www-form-urlencoded без URL кодирования вашего контента.

В URL-кодированных данных, & разделяет два аргумента, поэтому PHP правильно интерпретирует ваши данные с указанной кодировкой, вы просто неправильно их кодируете. Это не проблема XML, это проблема кодирования URL.

В кодировке URL, амперсанд может быть экранирован с помощью %26 вместо амперсанда.

VBA не поставляется с кодировщиком URL. Либо используйте другую схему кодирования, напишите свою собственную, либо используйте одну из этот ответ

1

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

Я нашел обходной путь и разумное объяснение в этой статье:

PHP "PHP: // ввод" против $ _POST

Я подозревал, что тип содержимого в заголовках может быть проблемой, которая привела к этой статье, поэтому вместо использования $ _POST или $ _REQUEST для получения ввода вам нужно получить необработанный ввод, например, $ xml = file_get_contents (‘php: // вход ‘);

Я использую запрос Symfony, поэтому необработанный контент можно получить с помощью $ request-> getContent ().

Когда вы используете тип содержимого text / xml, он должен работать так же, как и в php, но кажется, что PHP superglobals отфильтровывает это, поэтому я получил пустую строку, но необработанный ввод все еще можно прочитать, используя php: // input ,

0

По вопросам рекламы [email protected]