2016-04-27 71 views
2

快速更新:我之所以需要這個解決方案是,這一個PHP文件被用於擴大約上百個用戶的平面文件(即都使用相同的PHP文件,但有自己的平面文件)如何使用PHP將新列添加到平面文件?

SOLUTION:

我這一個多一天的工作,改寫這個問題,並得到了一個真正偉大的答案。我在這裏添加它爲未來幫助他人:

$content = file_get_contents("newstest.db"); 
$content = preg_replace('/(^ID:.*\S)/im', '$1value4:::', $content); 
$content = preg_replace('/(^\d+.*\S)/im', '$1:::', $content); 
file_put_contents("newstest.db", $content); 

平面文件的原始內容進行測試時的代碼是使用:

ID:::value1:::value2:::value3::: 
1:::My:::first:::line::: 
2:::My:::second:::line::: 
3:::Your:::third:::line::: 

原題:

我有一個我想修改的PHP腳本。作爲一名PHP新手,在這裏和谷歌搜索都沒有找到解決方案,我問這裏。

我需要在平面文件中添加更多的值(列),如果之前「列」不存在,將自動自動添加。因爲這一個PHP文件與許多用戶共享(每個用戶都有自己的平面文件),所以如果列不存在,我需要一種方法在他們的平面文件中自動添加新的「列」。手動操作非常耗時,我敢打賭有一個簡單的方法。


信息:

平面文件被命名爲 「newstest.db」

平面文件有這樣的佈局:

id:::title:::short:::long:::author:::email:::value1:::value2:::value3::: 

所以分頻器:: :

我瞭解基礎知識,需要在news.db的第一行添加「value4 :::」後的實例「value4 :::」,然後將:::添加到其他現有行以更新所有行並準備新的「value4」

今天,php使用它來連接到平面文件: ($ filesource是平面文件的路徑,包括它的名稱。獨特的爲每個用戶)

$connect_to_file = connect_pb ($filesource); 

並寫信給我使用的文件:

insert_pb($filesource,"$new_id:::$title:::$short:::$long:::$author:::$email:::$value1:::::::::"); 

(正如你在這種情況下,值2和3未在這種情況下使用看,但在其他。)


問題:

是否有一個快速/現有的PHP代碼中使用添加一個新列,如果它不存在?或者我需要爲這個特定任務製作php代碼嗎?

我明白的代碼必須做的東西一起:

  1. 如果「VALUE4」並不在$ filesource在0線存在
  2. 然後添加「VALUE4 :::」在行0結束,
  3. 並且對於其他每行添加「:::」結尾。

我不知道從哪裏開始,但我已經嘗試了幾個小時。

我明白這一點:

update_pb(pathtofiletosaveto,"id","x == (ID of news)","value in first line","value to add"); 

但我不知道如何使一個if語句作爲1)上述,無論是如何在平面文件更新行0添加「VALUE4 :::」末等


我的代碼(如意圖不工作):

或者,可能是我需要只讀取文件(newstest.db)中的第1行,然後在新的行中交換該行,如果「value4」不在第1行?

一個建議,但我不知道該怎麼做:(這可能完全錯誤的,因爲我已經試圖讀取並找到實例,並結合代碼)

<?php 
// specify the file 
$file_source="newstest.db"; 

// get the content of the file 
$newscontent = file($file_source, true); 
$lines =''; 
// handle the content, add "value4:::" and ":::" to the lines 
foreach ($newscontent as $line_num => $linehere) { 
    // add "value4:::" at the end of first line only, and put it in memory 
    if($line_num[0]) {$lines .= $linehere.'value4:::';} 
     else { 
      // then add ":::" to the other lines and add them to memory 
      $lines .= $linehere.':::'; 
      } 
    // echo results just to see what is going on 
    //echo 'Line nr'.$line_num.':<br />'.$lines.'<br /><br />'; 
} 

// add 

// to show the result 
echo "Here is the result:<br /><br />".$lines."<br /><br />"; 

//Write new content to $file_source 
$f = fopen($file_source, 'w'); 
fwrite($f,$lines); 
fclose($f); 

echo "done updating database flat file"; 
?> 

這ALMOST作品... 但它不添加「VALUE4 :::」到第一線, 的結束,它不添加「:::」到下到底線的但開始...

所以有幾個問題仍然存在: 1)如何在「value4」之後的第0行中搜索,然後在行尾寫入「value4 :::」? 2)如何在每行的末尾添加「:::」,而不是在開頭?

我懇請你幫我解決這個問題。

+0

把它轉換成CSV,讓你的生活變得更輕鬆;)你可以用一些在文件中找不到的獨特的特殊字符來代替':::',並用它作爲你的分隔符,然後用這個文件作爲一個csv使用PHP所具有的所有好的csv內容,然後只需替換':::'回來。 – dan08

+1

請參閱[fgetcsv()](http://php.net/manual/en/function.fgetcsv.php)。您可以傳遞'...'作爲分隔符參數,將行的內容作爲數組處理,然後使用fputcsv()將其寫回。 –

+0

@AlexHowansky您只能使用單個字符作爲分隔符。 – dan08

回答

0

您是否完全必須使用PHP來執行此任務?看起來你只需要做一次,而且用另一種方式做起來更容易。

例如,如果您有一個帶sed的* nix shell,sed -i 's/$/:::/' <file>將爲您執行該任務。

+0

是的,因爲我的所有用戶都在使用一箇中央PHP文件。每個用戶都有自己的平面文件,並且手動修復這些問題將會很多工作。因此$ file_source會因用戶而異。 – Preben

+0

剛剛更新了這個筆記的問題。 – Preben

相關問題