Доступ к PHP obj с переменными - PullRequest
2 голосов
/ 22 ноября 2010

Обновление этого вопроса ... Я работаю над небольшой CMS. Данные хранятся в формате XML. Я пытаюсь получить доступ к нужному полю изображения, чтобы обновить имя файла и удалить текущее изображение.

Скрипт получает переменные в зависимости от того, откуда он был вызван. В этом случае $ page = "homes", $ elem = "home" и $ field = 0. Ниже вызывается загрузка изображения.

if (!empty($_FILES)) {
    $field = $_POST['field'];
    $tempFile = $_FILES['upload']['tmp_name'];
    $targetFile = "img/sections/".$_POST['page']."/";
    $targetFile .= basename($_FILES['upload']['name']);
    if (move_uploaded_file($tempFile,$targetFile)) {
        $file = "spice.xml";
        $load = simplexml_load_file($file);
        $old_img = $load->sections->$page->$elem[$field]['img'];
        $load->sections->$page->$elem[$field]['img'] = $targetFile;
        file_put_contents($file, $xml->saveXML());
        unlink($old_img);
    }
}

Это структура XML-файла:

<spice>
    <sections>
        <homes>
            <home img="img/sections/home/img1.jpg"/>
            <home img="img/sections/home/img2.jpg"/>
            <home img="img/sections/home/img3.jpg"/>
        </homes>    
    </sections>
</spice>

Моя проблема в том, что $ old_img выдает ошибку «Невозможно использовать смещение строки в качестве массива». Если я заменю только переменные $ elem и $ field значениями, все будет работать нормально.

Ответы [ 2 ]

3 голосов
/ 22 ноября 2010

Альтернативный код с использованием XPath:

$load = simplexml_load_file($file);
$path=$load->xpath('//sections/'.$page.'/'.$elem);
$path[$field]['img']=$targetFile;
3 голосов
/ 22 ноября 2010

PHP интерпретирует смещение [$field] как часть переменной $elem, а не как целое свойство $load->sections->$page->$elem, в котором, вероятно, и заключается ваша проблема. Визуально это то, что ищет PHP:

// The character at the 0th ($field) position of 'home' ($elem) is 'h'
'h'['img']

Что вызывает ту ошибку, которую вы видите, потому что смещения строк - это строки, а не массивы.

Попробуйте вместо этого. Обратите внимание на фигурные скобки вокруг $elem.

        $old_img = $load->sections->$page->{$elem}[$field]['img'];
        $load->sections->$page->{$elem}[$field]['img'] = $targetFile;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...