-3

次の文字列の場合にphpのeval()関数を使用する正しい方法は何ですか、またはeval()の正しい代替手段は何ですか?fgetcsv内で、CSV列をmysqlテーブル列に割り当てる動的CSVパーサーを構築しようとしていますループ。ドキュメントには使用すべきではないと書かれていますが、他の代替手段は見つかりませんでした。

public function importCSV($params, $csv_file, $table) {

    if (!ini_get('safe_mode')) {
        @set_time_limit(0);
    }

    $into .='';
    $value .= '';
    foreach ($params as $param) {
        $values = explode('|', $param[value]);
        if ($param['name'] == 'Category') {
            $value .= 'get_' . $values[1] . '($data[' . $values[0] . ']),';
        } else {
            $value .= '$data[' . $values[0] . '],';
        }

        $into .= $values[1] . ',';
    }
    $value = substr($value, 0, -1);
    $into = substr($into, 0, -1);

    if (($file = fopen(JPATH_COMPONENT_ADMINISTRATOR . '/files/' . $file, "r")) !== FALSE) {
        $row = 0;

        $rows = count(file(JPATH_COMPONENT_ADMINISTRATOR . '/files/tieraerzte.csv'));
        while (($data = fgetcsv($file, 1000, ",")) !== FALSE) {
            //var_dump($data[0].''.$data[1]);
            $number_columns = count($data);
            $row = $row++;
            //here data should be inserted to mysql
            //var_dump(eval('return $'.$value .','));
            eval("$value");
        }
    }

    fclose($file);
}



'$data[0],get_plz($data[1]),get_ort($data[2]),$data[3],$data[4],$data[5],$data[6],$data[7],get_bundesland($data[8])'
4

3 に答える 3

1
$code = '$data[0],get_plz()...';

// the following line will evaluate the code and create a new indexed array
eval('$result = array(' . $code . ');');

// use the results...
echo $result[0];
echo $result[1]; //etc.
于 2013-04-19T13:17:55.227 に答える
1

申し訳ありませんが、eval() を使用する正しい方法はありません。まったく使用しないでください。

ただし、 call_user_func()を使用して、投稿した文字列で定義された関数を実行できます。指定された変数の内容を評価するには、変数変数を使用できます

それにもかかわらず、あなたが指摘したことはすべて、全体的な構造に非常に問題があるという仮定につながります.

于 2013-04-19T13:18:02.120 に答える
0
$elementsarr = explode(",",$string);
for ($i=0;$i<count($elementsarr);$i++) {
    eval($elementsarr[$i]);
}

いくつかの検証を追加したい場合がありますが、これは機能するはずです。

上記のように eval() は悪いですが。

于 2013-04-19T13:17:50.767 に答える