2016-04-01 3 views
-3

У меня есть скрипт php, который берет данные из моей БД и создает XML с командой exec (в ОС Linux).linux command: плохая замена

Я знаю, что это не лучший способ, чтобы создать его, я буду обновлять это позже :)

Во всяком случае, моя проблема заключается в том, что она дает ошибку «плохую замену».

Вот простой PHP код, который может показать вам ошибку ... Вы можете заметить, что для того, чтобы создать «действительный XML» (то есть: хорошо отформатирован), я вручную избежать некоторые специальные символы:

<?php 
$field="\${sao{}}\$"; 
$fieldParsed.= str_replace(
    array("&",  "<", ">", '"',  "'",  "\\", "`"), 
    array("&amp;", "&lt;", "&gt;", "&quot;", "&apos;", "\\\\", "&#96;"), 
    $field 
); 
$data="<doc><field name=\"myname\">".$fieldParsed."</field></doc>"; 
$cmd='echo "'.addSlashes($data).'" >> /tmp/test.txt'; 
echo "\n\n".$cmd. "\n\n"; 
exec($cmd); 

Был ли способ избежать «интерпретации bash» данных $? Иными словами, просто возьмите его так, как есть ...

ПРИМЕЧАНИЕ. Этот код является лишь примером, поэтому escape-код не будет действительным. Я ищу общее решение (если есть) ...

Спасибо.

+0

В какой момент именно это состояние ваших переменных не соответствуют вашим ожиданиям? Где именно вы получаете эту ошибку? Если это действительно в 'exec()', каково точное содержание '$ cmd' в то время? –

+0

Ну, может быть, вы могли бы написать '$ data' в файл с php и прочитать файл с помощью отдельного сценария bash, который вы вызываете из php. По крайней мере, это позволило бы избежать конкатенации строк и передачи аргументов в php. – jDo

+0

Я думаю, проблема в том, что когда я запускаю exec, bash интерпретирует $ как «команду» ... например: $ field = «мой текст с« backquote »; также обеспечит ошибку, если я не заменил «' »на« & # 96 »... – Bast

ответ

0

Я думал, что решение было ... escapeshellcmd

Но нет ... потому что это вставить, например, {вместо {

Однако проблема, как представляется, эхо с двойные кавычки ("). То же, что и в PHP, эхо сохранить строку нетронутыми с одной цитаты ... (не так, как эхо„мой $ вар“)

Если я использую эхо с одиночной кавычки (»), это работает хорошо.

Так что код что-то вроде:

<?php 
$field="\${sao{}}\$"; 
$fieldParsed.= 
    str_replace(
    array("&",  "<", ">", '"',  "'"), 
    array("&amp;", "&lt;", "&gt;", "&quot;", "&apos;"), 
    $field 
); 
$data="<doc><field name=\"myname\">".$fieldParsed."</field></doc>"; 
$cmd="echo '".$data."' >> /tmp/test.txt"; 
echo "\n\n".$cmd. "\n\n"; 
exec($cmd);