PHP: Búsqueda de un valor en un archivo txt

Hace días que estoy dándole vueltas pero no me salgo con la mía, y seguramente es algo sencillo.
Necesito incorporar en mi web un cuadro de formulario, donde los visitantes introduzcan un texto alfanumérico de 5 a 10 caracteres.
Al pulsar el botón de Aceptar/Enviar, debe ir a buscar "exactamente" ese texto a un archivo txt que está organizado presentando un código alfanumérico en cada línea.
El resultado ha de ser, devolver una frase "el código existe" o "el código no existe" según sea el caso.
Por favor, es importante para mi web y no acabo de conseguirlo aunque posiblemente sea una tontería lo que me falla, ¿algún experto puede darme una idea del código a utilizar para conseguirlo?

1 Respuesta

Respuesta
1
Simplemente abre el fichero con fopen y léelo con fgets lo que te dará el contenido de una línea cada vez que lo uses. Continua hasta que lo encuentres o se acabe el fichero.
Tienes ejemplos en el manual:
http://es.php.net/manual/es/function.fgets.php
Hola David,
Muchas gracias por la ayuda. Ya abro y leo el archivo, pero no sé cómo hacer que me coincida exactamente la búsqueda, ya que lo que tengo actualmente, me dice que el valor existe si encuentra que el texto introducido lo contiene un valor del txt.
Por ejemplo, si pongo 1234, me dice que existen: 1234 (que es el exacto), 2512345, 51241234, etc.
Me da como bueno, todos los valores que son iguales, o "contienen" lo que he introducido en el formulario, y sólo quiero que me devuelva ok, si encuentra "exactamente" el valor introducido en el formulario. Perdona si no me expliqué bien.
Por si te sirve de ayuda, te pongo el código que tengo:
El formulario lo tengo así: (he puesto algunos asteriscos porque no pegaba bien el código al hacer el Crtl+V):
<form action="search.php" accept-charset="UNKNOWN" enctype="application/x-www-form-urlencoded" method="post">
Search Term
</form>
Y el search.php, así:
<?php
$i=0;
if((!empty(P*O*S*T['searchterm']))|| isset(P*O*S*T['se*archt*erm'])){
$file = fopen ("texto.txt", "r");
$v=0;
while (!feof($file)) {
$linea = fgets($file,41);
$cadena[$v]=$linea;
$v++;
}
fclose ($file);
foreach($cadena as $pasar)
{
if(P*O*S*T['searc*hterm']===substr($pasar,0,10))
{
echo "<br>";
echo "Sí está:".substr($pasar,0,10);
echo "<br>";
$i=1;
}
}
}
if($i=='0')
{
echo "El codigo no fue encontrado .";
echo "<br> Intente nuevamente ";
}
?>
El formulario no se pegó bien, es así:
<form action="search.php" method="post">
Search Term <input type="text" name="searchterm"><br />
<input type="submit" value="Search">
</form>
Y el search.php así:
<?php
$i=0;
if((!empty(tiny_mce_markerPOST['searchterm']))|| isset(tiny_mce_markerPOST['searchterm'])){
$file = fopen ("texto.txt", "r");
$v=0;
while (!feof($file)) {
$linea = fgets($file,41);
$cadena[$v]=$linea;
$v++;
}
fclose ($file);
foreach($cadena as $pasar)
{
if(tiny_mce_markerPOST['searchterm']===substr($pasar,0,10))
{
echo "<br>";
echo "Sí está:".substr($pasar,0,10);
echo "<br>";
$i=1;
}
}
}
if($i=='0')
{
echo "El codigo no fue encontrado .";
echo "<br> Intente nuevamente ";
}
?>
No sé porque lees todo el fichero. ¿No sería más práctico ir comparando a medida que lo lees? Así si el número está en la primera línea, ya no necesitas leer el resto.
No entiendo porque limitas el fgets a 41 caracteres. No lo limites y te leerá una línea entera.
Supongo que realizas el substr porque el código máximo es de 10 caracteres.
A mi entender, no deberías hacer un recorrido sino una búsqueda. Es decir, si encuentras el código deberías dejar de buscar ejecutando un break para salir del foreach, o mejor usar una estructura de búsqueda como:
while (!feof(file) && $linea != $_POST["searchterm"])
$linea(fgets($file);
Por último, para comparar las cadenas, creo que deberías hacerlo con el mismo tamaño, es decir, que si searchterm tiene 4 caracteres deberías compararlo con toda la longitud del código si lo conoces. Como no sé la estructura de tu fichero, no sé cómo sabes dónde empieza y dónde termina el código.
Hola David,
El archivo txt tiene esta estructura:
GC10W5F
GC10YMG
GC110D5
GC112C
GC113XX
GC113YH
GC113YW
...
...
...
Disculpa que te haga perder el tiempo, pero te agradecería si pudieras decirme cómo sería el código para el "search.php", ya que como ves, no soy muy entendido en php.
La cosa es buscar en el txt el texto introducido en el formulario, y devolver un OK si el texto existe "exactamente" y un mensaje de error, si no lo encuentra.
Mil gracias por tu ayuda.
No acostumbreo a facilitar códigos, pero ya que has aportado el tuyo, te lo he modificado según lo que creo que debería ser. No lo he probado, pero es un código que más o menos debería funcionar:
<?php
if((!empty($_POST['searchterm']))|| isset($_POST['searchterm'])){
$file = fopen ("texto.txt", "r");
$linea = fgets($file);
while (!feof($file) && $linea!=$_POST["searchterm"]) {
$linea = fgets($file);
}
if ($linea==$_POST["searchterm"]) {
echo "<br>";
echo "Sí está:".substr($pasar,0,10);
echo "<br>";
} else
{
echo "El codigo no fue encontrado .";
echo "<br> Intente nuevamente ";
}
fclose ($file);
}
?>
Entiendo que buscas el código exactamente y que éste ocupa una linea entera en el fichero.
Hola David,
Llevo horas dándole vueltas y he modificado el código como te pongo a continuación:
<?
if((!empty(POST["searchterm"]))|| isset(POST["searchterm"])){
$file=fopen ("codigos.txt", "r");
$linea=fgets($file);
$encontrado=($linea==POST["searchterm"]);
while (!feof($file) && !$encontrado) {
$linea=fgets($file);
$encontrado=($linea==POST["searchterm"]);
} //end while
fclose ($file);
}
if (!$encontrado) {
echo '<br> NO se ha encontrado el código';
} else {
echo 'Se ha encontrado el código '.$linea;
}
?>
Digamos que no da error, pero siempre me devuelve que NO está el valor introducido en el formulario, aunque ponga uno que sí existe.
Este punto es lo único que me falla ¿alguna idea?
Te agradezco muchísimo la ayuda y el tiempo que empleas en mi consulta.
¿Quizá añadiendo un salto de linea? (\n), per dónde?
Deberías debugar tu script. Si no se encuentra el código es que alguna condición falla.
Pon algún 'chivato' para comprobar qué pasa. Pon echos que te informen de los valores que adquieren las variables y de los resultados de las comprobaciones y verás por qué no te funciona. Quizás haya algunos caracteres que no te esperas en el fichero, como espacios o finales de línea. Comprueba las longitudes de las cadenas que comparas.
Muchas gracias David, pero he estado dándole vueltas el fin de semana y no me he salido con la mía.
He cambiado de táctica e intentar hacerlo lanzando la consulta a una tabla en MySQL, con la siguiente estructura:
Tengo una lista de localizaciones, de lugares. Cada lugar tiene un código (que es único e irrepetible) y una descripción, así:
CODE /////// NAME
GC9182J ... Castillo de burriac
GCJ8JC ... Plaza del diamante
GC92311 ... Colina de la Torre
...
...
CODE y NAME serían los nombres de los campos de la tabla de MySQL, la cual podría llamarse "lugares".
Teniendo esta tabla con esos datos, poner un formulario donde el usuario pudiera consultar si existe o no un lugar en la bd.
El formulario supongo que ha de tener un campo de texto donde introducir el texto a buscar, un campo de opción, para buscar el valor introducido en el campo "CODE" o en "NAME", y el botón de "submit/enviar", para hacer la consulta.
Me gustaría que el resultado mostrara todos los resultados que contienen el texto introducido, por ejemplo:
Si el usuario introduce: "Torre", indicando en el desplegable buscar en NAME, pues devolviera como resultado todos los registros (con código y nombre) que contienen esa palabra, algo así:
Se encontraron los siguientes resultados:
GC838F Torre fossada del siglo X
GCKJ85 Vistas a la torre medieval
...
X resultados
O si introducen "GC72", indicando en el "select" "CODE" devolviera todos los que contienen esa cadena:
Se encontraron los siguientes resultados:
GC72KDD8 Lago esmeralda
GC72H67F Fortaleza de Vilassar (siglo XI)
GC72J8 Vía romana de la Roca
...
...
He hecho el formulario (form.php) y el archivo de búsqueda (search.php) pero al introducir un valor y ejecutar la consulta, no da error de conexión por lo que parece que hace bien la conexión a la BD, pero siempre me devuelve una página en blanco, ponga lo que ponga. No sé si esto será más fácil de "descifrar" que lo anterior:
Aquí pongo el código que tengo:
Formulario:
Búsqueda
<form name="search" method="post" action="search.php">
Buscar: <input type="text" name="find" /> en el campo
<Select NAME="field">
<Option VALUE="code">Codigo</option>
<Option VALUE="name">Nombre</option>
</Select>
<input type="hidden" name="searching" value="yes" />
<input type="submit" name="search" value="Search" />
</form>
El archivo search.php que procesa el formulario es:
<!--br-->//Esto solo se muestra si se introduce un valor para buscar
if ($searching =="yes")
{
echo "Resultados"
<p>;
//Si no se introduce nada a buscar da un error
if ($find == "")
{
echo "Olvidaste introducir un texto a buscar";
exit;
}
// Si no se conecta a la BD
mysql_connect("hostbd", "usuario", "password") or die(mysql_error());
mysql_select_db("nombrebd") or die(mysql_error());
// Filtros
$find = strip_tags($find);
$find = trim ($find);
//Busca por lo que ha introducido el usuarioen el campo especificado
$data = mysql_query("SELECT * FROM tabla_lugares WHERE $field LIKE'%$find%'");
//Muestra los resultados
while($result = mysql_fetch_array($data))
{
echo $result['code'];
echo " ";
echo $result['name'];
Echo "
";
echo "
";
}
//Cuenta los resultados y si no los hay muestra mensaje
$anymatches=mysql_num_rows($data);
if ($anymatches == 0)
{
echo "Lo sentimos no hay resultados coincidentes con tu busqueda";
}
//Por ultimo recordamos lo que se habia buscado
echo "Usted buscó: " .$find;
}
?>
Pensaba que así lo tendría solucionado, pero no entiendo porqué me lleva siempre a una página en blanco.
Gracias por todo!
El problema estriba en que estás usando una notación obsoleta. Actualmente los datos de un formulario se encuentran en la matriz correspondiente y no directamente como variables.
Por ejemplo, en la primera línea de search.php, debería ser
if ($_POST["searching"]=="yes") {
(por si no se ve bien en el mensaje, te lo pongo a continuación con espacios entremedio:
i f ( $ _ P O S T [ " s e a r c h i n g " ] = = " y e s " ) {
Como esta condición falla, ya no se ejecuta nada en la página y por esto te aparece en blanco.

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas