Вставить строку на лету в файл с PHP - PullRequest
2 голосов
/ 14 июня 2011

Я хочу сделать файл .php доступным для загрузки моими пользователями.

Каждый файл отличается от пользователя к другому:
в строке # 20 Я определяю переменную, равную ID пользователя.

Для этого я попробовал это: Скопировать оригинальный файл.Прочитайте его до строки 19 (fgets), затем fputs строки PHP и затем предложите файл для загрузки.

Проблема в том, что строка вставляется не после строки 19, а в конце.php файлВот код:

if (is_writable($filename)) {

    if (!$handle = fopen($filename, 'a+')) {
         echo "Cannot open file ($filename)";
         exit;
    }

    for ($i = 1; $i <= 19; $i++) {
        $offset = fgets($handle);
    }

    if (fwrite($handle, $somecontent) === FALSE) {
        exit;
    }

    fclose($handle);
}

Что бы вы сделали?

Ответы [ 4 ]

1 голос
/ 14 июня 2011

режим добавления +a в fopen () помещает указатель дескриптора в конец файла. Ваш цикл fgets () потерпит неудачу, так как в конце файла не осталось ничего для чтения. Вы в основном делаете 19 ноу-хау. Затем ваш fwrite выведет ваше новое значение в конец файла, как и ожидалось.

Чтобы выполнить вставку, вам нужно rewind() указать начало, а затем выполнить цикл fgets ().

Однако, если вы просто хотите, чтобы люди получили этот измененный файл, зачем беспокоиться о том, чтобы «открыть файл, просмотреть, записать изменения, отправить файл»? Это оставит множество дубликатов в вашей системе. Лучшим способом было бы разделить ваш файл на две части, и тогда вы могли бы сделать простое:

* * 1010

, что избавляет вас от необходимости каждый раз сохранять «новый» файл. Это также позволило бы вставки произвольной длины. Ваш метод fwrite может потенциально уничтожить более поздние части файла. например Вы сканируете со смещением «10» и записываете 4 байта, которые заменяют 4 исходных байта в этом месте исходного файла. В какой-то момент, возможно, он превращается в 5 байтов вывода, и теперь вы уничтожили байт в оригинале и, возможно, получили поврежденный файл.

1 голос
/ 14 июня 2011

Поместите нужный код в одну строковую переменную. Где вы будете иметь% s в точке, где вы хотите настроить свой код. После этого просто ответьте с типом php MIME.

например;

$phpCode = "if (foo == blah) { lala lala + 4; %s  = 5; }", $user_specific_variable;
header('Content-type: text/php');
echo $phpCode; 

Вуаля.

NB. Возможно, тип пантомимы не верный, я говорю из своей задницы здесь.

1 голос
/ 14 июня 2011

Режим a + означает:

'a +' Открыт для чтения и письма; поместите указатель файла в конец файла . Если файл не существует, попытайтесь создать его.

Вы, вероятно, хотите г +

'r +' Открыт для чтения и письма; поместите указатель файла в начало файла .

0 голосов
/ 14 июня 2011

Я думаю, что вместо того, чтобы открывать файл в режиме «+», вы должны открыть файл в режиме «r +», потому что к нему всегда добавляется «а».Но я думаю, что запись в любом случае перезапишет ваши текущие данные.Итак, идея в том, что вам нужно будет буферизовать файл с того момента, когда вы намереваетесь записать его в EOF.Затем добавьте свою строку с тем, что вы буферизировали.

Другой подход может заключаться в сохранении некоторого шаблона в вашем PHP-файле, например ######.Затем вы можете: 1. скопировать оригинальный PHP-скрипт 2. прочитать весь PHP-скрипт в одну переменную, скажем, $ fileContent, используя file_get_contents () 3. использовать функцию str_replace () для замены ###### в $ fileContent натребуемый идентификатор пользователя 4. откройте скопированный PHP-скрипт в режиме «a» и перепишите в него $ fileContent.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...