2012-01-30 37 views
22

Tôi đang cố gắng xem tệp có chứa chuỗi được gửi đến trang hay không. Tôi không chắc chắn những gì là sai với mã này:PHP kiểm tra xem tệp có chứa chuỗi

?php 
    $valid = FALSE; 
    $id = $_GET['id']; 
    $file = './uuids.txt'; 

    $handle = fopen($file, "r"); 

if ($handle) { 
    // Read file line-by-line 
    while (($buffer = fgets($handle)) !== false) { 
     if (strpos($buffer, $id) === false) 
      $valid = TRUE; 
    } 
} 
fclose($handle); 

    if($valid) { 
do stufff 
} 
+0

gì nếu bạn 'var_dump ($ đệm, $ id);' thay vì so sánh chúng bởi 'if'? – zerkms

+2

Nếu bạn gặp lỗi, vui lòng đề cập đến nó. – Starx

Trả lời

62

đơn giản hơn nhiều:

<?php 
    if(strpos(file_get_contents("./uuids.txt"),$_GET['id']) !== false) { 
     // do stuff 
    } 
?> 

Đáp lại ý kiến ​​về việc sử dụng bộ nhớ:

<?php 
    if(exec('grep '.escapeshellarg($_GET['id']).' ./uuids.txt')) { 
     // do stuff 
    } 
?> 
+4

Đơn giản hơn nhiều nhưng tốn nhiều bộ nhớ hơn – zerkms

+1

Không phải tải toàn bộ văn bản vào bộ nhớ. – xdazz

+1

@zerkms Còn bây giờ thì sao? –

16

được code đang hiệu quả hơn trong khi tìm kiếm các tệp lớn hơn.

$handle = fopen('path_to_your_file', 'r'); 
$valid = false; // init as false 
while (($buffer = fgets($handle)) !== false) { 
    if (strpos($buffer, $id) !== false) { 
     $valid = TRUE; 
     break; // Once you find the string, you should break out the loop. 
    }  
} 
fclose($handle); 
+0

ps, ​​bởi 'hiệu quả hơn', anh ta có nghĩa là' có thể chậm hơn (trừ khi file_get_contents sử dụng quá nhiều ram mà bạn bắt đầu hoán đổi, trong trường hợp này có thể nhanh hơn), nhưng nên sử dụng ram ít hơn đáng kể, cũng cảnh báo, thuật toán này sẽ KHÔNG làm việc để tìm chuỗi chứa dòng mới, ngoại trừ nếu dòng mới duy nhất nằm ở cuối chuỗi, hãy ghi nhớ điều đó :) – hanshenrik

+0

anh ấy đã nói "tệp lớn hơn" và tốt nếu tệp đó thực sự lớn (như tệp có thực sự nhiều băm mật khẩu được phát hành gần đây) có thể dễ dàng đạt tới giới hạn bộ nhớ – My1

3
function getDirContents($dir, &$results = array()) 
{ 

    if ($_POST['search'] == null) 
     exit; 

    ini_set('max_execution_time', $_POST['maxtime']); 

    $_SESSION['searchString'] = $_POST['search']; 

    echo "<script>var elm = document.getElementById('search');elm.value='$_POST[search]';</script>"; 

    if (!isset($_POST['case'])) 
     $string = strtolower($_POST['search']); 
    else 
     $string = $_POST['search']; 
    $files = scandir($dir); 

    foreach ($files as $key => $value) { 
     $path = realpath($dir . DIRECTORY_SEPARATOR . $value); 
     if (!is_dir($path)) { 
      $content = file_get_contents($path); 
      if (!isset($_POST['case'])) 
       $content = strtolower(file_get_contents($path)); 
      if (strpos($content, $string) !== false) { 
       echo $path . "<br>"; 
      } 
      $results[] = $path; 
     } else if ($value != "." && $value != "..") { 
      getDirContents($path, $results); 
      $results[] = $path; 
     } 
    } 
    return $results; 
} 

gốc dự án: https://github.com/skfaisal93/AnyWhereInFiles

Các vấn đề liên quan