2017-09-21 25 views
0

所以這裏是我的代碼不斷打我的錯誤信息,有權限擺弄,但沒有運氣,任何想法?PHP文件寫入 - 錯誤信息每次

<?php 
//create variables 
$first_name = (int) $_POST['first_name']; 
$last_name = (int) $_POST['last_name']; 
$document_root = $_SERVER['/var/www']; 
$date = date('H:i, jS F Y'); 
?> 
<DOCTYPE html> 
<html> 
<head> 
    <title>We get the message...</title> 
</head> 
<body> 
    <h1>We get the message . . .</h1> 
    <?php 
     $output_string = $date."\t".$first_name.$last_name." \t".$message."\n"; 
     @$fp = fopen("$document_root-messages.txt", 'w+'); 
     if (!$fp) { 
      echo "<p>apologies</p>"; 
      exit; 
     } 
     flock($fp, LOCK_EX); 
     fwrite($fp, $output_string, strlen($output_string)); 
     flock($fp, LOCK_UN); 
     fflush($fp); 
     fclose($fp); 

     echo "<p>message written.</p>"; 
    ?> 
</body> 
</html> 

我剛開始學習PHP因此它可能是很簡單的東西,但我一直在抓我的頭了大約一個小時,仍然沒有拿出一個解決方案。

+0

您確定您對文件夾具有所需的權限嗎? – PekosoG

+0

看起來您正在寫入名爲'/ var/www-messages.txt'的文件。我假設你的意思是'/ var/www/messages.txt'? '$ fp = fopen(「$ document_root/messages.txt」,'w +');'並注意我刪除了@ @錯誤抑制。 –

+0

如果這實際上是你的意圖,那麼允許Web服務器直接寫入'/ var'是非常危險的。即使在'/ var/www'內部寫入也是相當危險的,因爲所有其他文件都明確需要被Web服務器用戶設置爲不可寫。 –

回答

0
@$fp = fopen("$document_root-messages.txt", 'w+'); 

你沒有真正發揮路徑,有沒有這樣的文件:

/var/www-messages.txt 

現在,這是一個真正的路徑:

@$fp = fopen("$document_root/messages.txt", 'w+'); 

,是我假設你的意思假設/ var/www中的文件是message.txt。

有關使/ var/www可寫的錯誤做法的評論也是正確的,在學習最佳做法時最好,因爲如果你從壞的開始,那麼你只需要忘掉它們,這就是更多的工作。

避免這個問題的辦法是隻習慣於更加清晰,像這樣:

$file_path = $document_root . '/messages.txt'; 
echo $file_path . '<br>'; 
@$fp = fopen($file_path, 'w+'); 

然後你擺脫它的工作後的回聲,回聲也很好的建議。如果你習慣於填充某些內部的所有動作,那麼很難調試,如果你在fopen之外構造你的字符串,那麼你可以通過回調它來調試路徑,並且你不會感到困惑。注意這是多麼清楚,並且調試有多容易?

+0

只需添加一個調試提示:下次嘗試添加回顯以查看您的路徑的實際值,然後再詢問SO。 –

+0

也很好的建議,我更新,包括一個更好的方式來編碼,因此它可以與回聲調試等。 – Lizardx