PHP fopen скрипт для чтения строки - PullRequest
0 голосов
/ 15 февраля 2012

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

function job_number_script(){
    $job_data = "";
    $user_info = $_SESSION['user_info'];
    $user_id = $user_info['user']['id'];
    $job_id = "";
    //Initialize the return
    $job_number_page = ("job_setup.txt");
    $job_number = file($job_number_page);
    $work = explode(",",$job_number[0]);
    $work[0]++;
    $job_id = $work[0]++;
    $work2 = array($job_id, $user_id);
    $works = implode(",",$work2);
    $fp = fopen($job_number_page, "a+");
    fputs($fp, "$works\n");
    fclose($fp);
    $job_data = $job_id;
    return $job_data;
}

Ответы [ 3 ]

1 голос
/ 15 февраля 2012

Вы можете попробовать использовать file() для чтения каждой строки в массив:

 $lines = file($job_number_page);
 $lines[count($lines)-1]++;
 $data = implode("", $lines);
 // write data to file again
 file_put_contents($job_number_page, $data);
1 голос
/ 15 февраля 2012

Вы можете сделать это напрямую, используя несколько функций php, fseek(), ftell(), fgetc() и fgets() (первая часть скрипта просто установит указатель файла на последнюю строку):

$fp = fopen( 'file.txt', 'a+') or die('Failed to open file: file.txt');

// Way 1
fseek( $fp, SEEK_END, 0); // Go to the end of file
$max = ftell( $fp); // Get max/end position
for( $i = $max-1; $i >= 0; $i--){
    fseek( $fp, $i, SEEK_SET);
    if( fgetc( $fp) == "\n")){
        break;
    }
}

// Way 2
$length = 0;
while( ($row = fgets( $fp)) !== false){
    $length = strlen( $row);
}
fseek( $fp, -$length, SEEK_CUR);

Теперь у вас есть указатель файла в начале последней строки, теперь вам нужно прочитать последнюю строку и переместить файл назад, чтобы иметь возможность перезаписать его.

$pos = ftell( $fp);
$line = trim( fgets( $fp));
fseek( $fp, $pos, SEEK_SET);

А теперь увеличить, переписать и сохранить:

fwrite( $fp, $line+1);
fclose($fp);

Я строго рекомендую , используя flock() вот так:

$fp = fopen( 'file.txt', 'a+') or die('Failed to open file: file.txt');
if( !flock($fp, LOCK_EX)){
    fclose( $fp);
    die( 'Cannot get exclusive lock: file.txt');
}

// The code mentioned above
flock($fp, LOCK_UN);
fclose( $fp);

Примечание: приведенный выше пример (с fwrite( $fp, $line+1)) работает только в том случае, если вы пишете «строки» одинаковой или большей длины, если вам нужно написать более короткую строку, вам нужно использовать ftruncate().

1 голос
/ 15 февраля 2012

Одним из способов может быть просто заменить все вхождения $ work [0] на $ work [count ($ work) -1].

...