Как предотвратить php fwrite () от перезаписи строки текста в файле? - PullRequest
2 голосов
/ 13 февраля 2012

Я извлек следующие строки кода из моего сценария.

    $i=0;
    $j=0;
    $fp=fopen('C:\xampp\htdocs\Lib_auto_project\Deleted_Records\delete_log.sql','a+');// File where the string is to be written
    foreach($_POST as $temp)//repeat for all the values passed from the form
    {
        if($j==0)
          {     
               $result_set=$mysqli->query("select * from {$_SESSION['table_name_1']} where Copyid=$temp");
               $result_set=$result_set->fetch_array(MYSQL_BOTH);    
               ++$j;

           }
        if($temp!='Drop')// Drop is simply the value of submit buttom
         {
            $date=mysql_query("select now() as current_date_time") or die(mysql_error());
            $date=mysql_fetch_array($date,MYSQL_BOTH);
            $result="\n"."INSERT INTO delete_book_log  // this is the string begining with line break and followed by sql insert statement
                          VALUES(
                                 '{$result_set["Bid"]}',
                                 '$temp',
                                 '{$result_set["Name"]}',
                                 '{$result_set["Publication"]}',
                                 '{$result_set["ISBN"]}',
                                 '{$result_set["Author"]}',
                                 '{$result_set["Edition"]}',
                                 'in',
                                 '{$result_set["Book_Baseid"]}',
                                 '{$date['current_date_time']}'
                                 );";
              fflush($fp);
              fwrite($fp,$result);
              $mysqli->query("Delete from {$_SESSION['table_name_1']} where copyid=$temp");
              $i++;
          }

      }
      fclose($fp);

! [Снимок экрана]: http://i.stack.imgur.com/dOzSj.jpg

Как видно из снимка экрана, когда одинили больше записей выбрано и нажата кнопка удаления, я хочу, чтобы записи были удалены из базы данных, но хочу, чтобы соответствующие операторы вставки SQL были записаны в file(C:\xampp\htdocs\Lib_auto_project\Deleted_Records\delete_log.sql). Чтобы это произошло, я написал вышеупомянутую частькода.Теперь проблема в том, что когда я выбираю записи и удаляю их, все идет как надо.Когда я делаю то же самое в любой другой момент, я хочу, чтобы подобные строки вставки SQL сохранялись, как показано выше, в $ result, добавляя в конец file(C:\xampp\htdocs\Lib_auto_project\Deleted_Records\delete_log.sql).Это не совсем так.Скорее ранее написанные строки перезаписываются новой.Я пробовал это снова и снова, но только последние строки перезаписывают старые.

Ответы [ 2 ]

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

Хорошо, что php говорит в руководстве , что a+ (достаточно использовать a):

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

но попробуйте запустить этот код (называемый test.php):

<?php    
$fp = fopen( 'test.php', 'a+') or die( 'Cannot open!');
echo 'Pos: ' . ftell($fp) ."\n";
echo fgets($fp);
echo 'Pos: ' . ftell($fp) ."\n";
fclose( $fp);

сгенерирует этот вывод:

Pos: 0
<?php
Pos: 6

Вы можете использовать fseek():

fseek( $fp, 0, SEEK_END);

Или используйте file_put_contents() с правильными параметрами:

file_put_contents( $file, $string, FILE_APPEND);

И не забудьте проверить права доступа к файлу и открыть ли файл успешно с помощью кода, подобного следующему:

if( !$fp){ 
    die( 'File cannot be opened!');
}
0 голосов
/ 13 февраля 2012

Попробуйте использовать file_get_contents и file_put_contents вместо fwrite и добавить свои запросы в массив или строку:

$fp=file_get_contents('C:\xampp\htdocs\Lib_auto_project\Deleted_Records\delete_log.sql');// File where the string is to be written
foreach($_POST as $temp)//repeat for all the values passed from the form
{
    if($j==0)
      {     
           $result_set=$mysqli->query("select * from {$_SESSION['table_name_1']} where Copyid=$temp");
           $result_set=$result_set->fetch_array(MYSQL_BOTH);    
           ++$j;

       }
    if($temp!='Drop')// Drop is simply the value of submit buttom
     {
        $date=mysql_query("select now() as current_date_time") or die(mysql_error());
        $date=mysql_fetch_array($date,MYSQL_BOTH);
        $result="\n"."INSERT INTO delete_book_log  // this is the string begining with line break and followed by sql insert statement
                      VALUES(
                             '{$result_set["Bid"]}',
                             '$temp',
                             '{$result_set["Name"]}',
                             '{$result_set["Publication"]}',
                             '{$result_set["ISBN"]}',
                             '{$result_set["Author"]}',
                             '{$result_set["Edition"]}',
                             'in',
                             '{$result_set["Book_Baseid"]}',
                             '{$date['current_date_time']}'
                             );";
          $fp .= $result . "\r\n";
          $mysqli->query("Delete from {$_SESSION['table_name_1']} where copyid=$temp");
          $i++;
      }

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