2012-01-30 8 views
22

Estoy tratando de ver si un archivo contiene una cadena que se envía a la página. No estoy seguro de lo que está mal con este código:Comprobación de PHP si el archivo contiene una cadena

?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

Qué pasa si usted 'var_dump (tampón $, $ id);' en lugar de compararlos con 'if'? – zerkms

+2

Si tiene un error, por favor mencionelo. – Starx

Respuesta

62

mucho más sencillo:

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

En respuesta a los comentarios sobre el uso de memoria:

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

Mucho más simple pero consume más memoria – zerkms

+1

No es necesario cargar texto completo en la memoria. – xdazz

+1

@zerkms ¿Qué tal ahora? –

16

El código se es más eficiente mientras busca archivos más grandes.

$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, ​​por 'más eficiente', quiere decir' probablemente más lento (a menos que file_get_contents use tanto RAM que comiences a intercambiar, en cuyo caso esto podría ser más rápido), pero debería usar significativamente menos RAM', también advertencia, este algoritmo NO trabaje para encontrar cadenas que contengan líneas nuevas, excepto si la única nueva línea está al final de la cadena, téngalo en cuenta :) – hanshenrik

+0

dijo "archivos más grandes" y si el archivo se vuelve realmente grande (como el archivo con el muchos hash de contraseñas que se lanzaron recientemente) uno podría alcanzar fácilmente el límite de memoria – 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; 
} 

proyecto original: https://github.com/skfaisal93/AnyWhereInFiles

Cuestiones relacionadas