2012-01-10 120 views
2

我試圖比較存儲在一個平面文件中的幾個數組值(我知道,mysql更好,但它的分配,所以請忍受過時的方法)與一些形式發送從$ _POST變量的用戶憑據,儘管僅存在是一個數據行的文件中我不斷收到以下錯誤:PHP字符串比較結果未定義偏移3錯誤

注意:未定義抵消:3 ./login.php線70

我已經在下面列出了一些有問題的代碼行,其中包括一些序言和從瀏覽器打印出來的結果(在進行故障排除的基本嘗試中,我運行了一個print_r命令,並清楚地得到了2個返回的數組,但無法計算出結果在外面HY ...?)。

如果我可以添加任何有助於解決問題的其他信息,請讓我知道 - 我只願意承擔義務。

用戶註冊數據在這個代碼片段從register.php文件

<?php 
$filename = '../../private_data/filewriting.php'; 

if (isset($_POST['register']) && count($errors)==0) { 

    // Submission was OK, so display thank-you message 
    $output .= '<p><strong>Thanks for registering with us! Please click <a href="index.php">here</a> to login to the site using your Username and Password</strong></p>'; 

    $handle = fopen($filename, 'a'); 

    fwrite($handle, "\n".$clean['fullname']."|".$clean['address']."|".$clean['postcode']."|".$clean['username']."|".$clean['password']); 

    fclose($handle); 
} 
?> 

然後用戶輸入登錄詳細信息檢查在該片段發生從login.php中文件中捕獲

<?php 
$output = ''; 
$filename = '../../private_data/filewriting.php'; 

if (isset($_POST['submit']) && count($errors)==0) { 

    $lines = file($filename); 

    foreach ($lines as $line) { 
     $arr = explode('|', $line); 
     print_r($arr); 
     echo '<br />'; 

     // The next line is the problematic line 70    
     if ($arr[3]==$clean['username'] && $arr[4]==$clean['password']) { 
      $_SESSION['username'] = $clean['username']; 
      $_SESSION['password'] = $clean['password']; 
      $output .= '<p><strong>Password and Username match - Thank you for logging in. Please continue to browse the site using the links above.</strong></p>'; 
     } 
    } 
} 
?> 

從該文件提交登錄詳細信息後的輸出如下所示:

陣列([0] =>)

注意:未定義偏移量:3 ./login.php線70上

陣列([0] =>測試用戶[1] => 123蔥街,大洋蔥[2] => BN21 0LK [3] => testuser的[4] =>密碼)

用戶名和密碼匹配 - 感謝您記錄

回答

1

如果你參考這個PHP參考:

http://php.net/manual/en/function.file.php

你。請參閱示例顯示ak ey值參考如下:

$lines = file($filename); 

foreach ($lines as $line_num => $line) { 
    $arr = explode('|', $line); 
    print_r($arr); 
    echo '<br />'; 

    if ($arr[3]==$clean['username'] && $arr[4]==$clean['password']) { 
     $_SESSION['username'] = $clean['username']; 
     $_SESSION['password'] = $clean['password']; 
     $output .= '<p><strong>Password and Username match - Thank you for logging in. Please  continue to browse the site using the links above.</strong></p>'; 
    } 
} 

看看是否有幫助。

另外,我誤讀了嗎?它看起來像你故意添加一個新行:

fwrite($handle, "\n".$clean['fullname']."|".$clean['address']."|".$clean['postcode']."|".$clean['username']."|".$clean['password']); 

爲什麼不能擺脫\ n

+0

沒有改變我害怕 - 仍然得到同樣的錯誤。我不明白爲什麼如果該文件只包含一行數據,我會從print_r中獲取2個輸出,儘管這是非常不完整的第一行。 – 2012-01-10 00:28:21

+1

我更新了我的答案。它看起來像在分隔字符串之前添加一個新行。 「\ n」我認爲這是爲了防止有多條線路將它們添加到自己的線路中。你可以在字符串末尾拋出它,然後忽略爆炸沒有返回大於1的數組的情況,或者在關閉之前補償尾部的\ n ...像一個基本的substr的任何數量的更好的方法文件...等多種方式來做到這一點。 – 2012-01-10 00:34:37

+0

畢竟在http://php.net/manual/en/function.file.php頁面上找到了答案。 它出現是因爲我使用'\ n'方法輸入每一個新的數據行,我還需要添加以下內容到我的文件命令來忽略任何空行,這將解釋print_r輸出中的空數組。 $ lines = file($ filename,FILE_IGNORE_NEW_LINES | FILE_SKIP_EMPTY_LINES); 感謝您在正確的方向推動。 – 2012-01-10 00:39:26