2016-04-01 13 views
-3

DBからデータを取り出し、execコマンドでXMLを作成するPHPスクリプトがあります(Linux OSの場合)。linuxコマンド:不正な置き換え

私はそれを作成するための良い方法ではありません知っている、私は後でこれを更新します:)

をとにかく、私の問題は、それがエラー「悪い置換」を提供することです。

:、私は手動でいくつかの特殊文字をエスケープ:ここ

は、あなたが「有効なXML」(うまくフォーマットされたIE)を作成するためにあることに気づくことができ ...あなたのエラーを表示することができ、簡単なPHPコードであります

<?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解釈"を避ける方法はありますか? つまり、そのままそのまま使用してください。

注:このコードはほんの一例であるため、$は有効な回答ではありません。私は一般的な解決策(もしあれば)を探しています...

ありがとう。

+0

?このエラーはどこで正確に得られますか?それが本当に 'exec()'にある場合、その時の '$ cmd'の正確な内容は何ですか? –

+0

さて、あなたは '$ data'をphpでファイルに書き出し、phpから呼び出す別のbashスクリプトでファイルを読むことができます。少なくともそれはすべての文字列の連結とPHPで渡す引数を避けるでしょう。 – jDo

+0

私はexecを実行すると、bashは$を "コマンド"として解釈するという問題があると思います。例:$ field = "my text with backquote"; "&#96"で "' "を置き換えなかった場合にもエラーが発生します... – Bast

答えて

0

私は解決策があったと思った... escapeshellcmd

でもない...これが挿入されますので、例えば、{しかし、問題は、エコーであるように思わ代わりに{

の二重引用符( ")。 PHPと同じで、単一引用符でそのまま文字列を保つエコー...(エコーが好きではありません『私の$ VAR』)

私は単一引用符でエコーを使用する場合(」 )、それは仕事です大丈夫です。

ように、コードのようなものです:まさにあなたの変数の状態があなたの期待と一致していませんどの時点で

<?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); 
関連する問題