Foros del Web » Programando para Internet » PHP »

Script para recorrer fichero

Estas en el tema de Script para recorrer fichero en el foro de PHP en Foros del Web. Buenos dias. Me han planteado crear un pequeño script, que recorrerá un fichero ( aun no sé si un .xls, un .sql, o un .txt ...
  #1 (permalink)  
Antiguo 20/09/2010, 03:39
 
Fecha de Ingreso: septiembre-2009
Ubicación: Sevilla
Mensajes: 37
Antigüedad: 14 años, 7 meses
Puntos: 0
Script para recorrer fichero

Buenos dias.

Me han planteado crear un pequeño script, que recorrerá un fichero ( aun no sé si un .xls, un .sql, o un .txt ), que basicamente contendrá dos datos:
- Numero de telefono
- Mensaje para mandar


Código:
666777888 mensaje1
666111222 mensaje2
666999777 mensaje3
Como intuyes, se trata de un script para recorrerlo, por cada registro y mensaje, se crea una sentencia mail ( mail -s asunto ..... )
Decir que los mensajes son diferente, hay bloques de 200 numeros que tienen un sms, otros 200 numeros que tiene otro sms, etc....

De tal forma, que si mando un mail, la cuenta que lo recibe, está configurada a mandarlo a los SMS de los clientes.
Es para hacer una campaña informativa, son, unos 4000SMS.

He pensado con un foreach o algo parecido, pero..... ¿ que funcion para leer del archivo ? ( que formato de archivo veis mejor?, lo podré convertir al que mejor sea para su lectura ).

Sabiendo leer el fichero en cuestion, estaria lo mas "dificil" hecho.

Muchas gracias.
  #2 (permalink)  
Antiguo 20/09/2010, 03:58
Avatar de Vun
Vun
Colaborador
 
Fecha de Ingreso: agosto-2009
Ubicación: Benalmádena, España
Mensajes: 2.265
Antigüedad: 14 años, 8 meses
Puntos: 150
Respuesta: Script para recorrer fichero

Si aun no sabes si te pasaran un .sql o un .txt ....... no vamos a saber ayudarte, ya que de una forma sería accediendo a la base de datos y de la otra recorriendo un archivo... Ambas formas son factibles.

El problema que creo que deberías centrarte es si tu hosting te permite hacer tantos envios de emails, la mayoria de hostings compartiros te lo limitan a 500 por hora o algo similar...
  #3 (permalink)  
Antiguo 20/09/2010, 04:55
 
Fecha de Ingreso: septiembre-2009
Ubicación: Sevilla
Mensajes: 37
Antigüedad: 14 años, 7 meses
Puntos: 0
Respuesta: Script para recorrer fichero

Gracias por responder.
Tengo respuestas ya.... el formato, me da igual como me lo manden, lo convertiré a la mejor forma.
El hosting? es local........... no tengo limites.

Respecto al formato, me lo manden en el que sea, lo convertiré a .txt, supongo que es lo mas facil.

Adjunto un codigo que he reutilizado, pero.. tengo mis dudas.
nombres.php
Código:
<?
$lines = file('nombres.txt');
foreach ($lines as $line_num => $line) {       
        $datos = explode(",", $line);
     	echo ("mail -s $datos[0] direccion@dominio $datos[1]<br>	");   
        sleep(1);
	} //fin foreach
?>
nombres.txt
Código:
666000000, mensaje1,
666999000, mensaje2,
666888999, mensaje3,
Tal como está, tengo mi .txt con mis 4000 numeros y mis 4000 mensajes, pero, para no colapsar la centralita mandando mails, tengo pensado hacer algun sleep cada 20 mensajes.

De tal forma que tengo en el codigo, por cada mail que genera, estoy esperando un segundo..... no es lo conveniente ( pierdo mucho tiempo ).
Lo que quiero, es, por cada bloque de 20 mails, que duerma 1 o 2 segundos.
  #4 (permalink)  
Antiguo 20/09/2010, 05:16
Avatar de Vun
Vun
Colaborador
 
Fecha de Ingreso: agosto-2009
Ubicación: Benalmádena, España
Mensajes: 2.265
Antigüedad: 14 años, 8 meses
Puntos: 150
Respuesta: Script para recorrer fichero

Eso de la espera es fácil, con una variable de controlo lo hacemos:

Código PHP:
<?
$lines 
file('nombres.txt');
$n=0;
foreach (
$lines as $line_num => $line) {       
        
$datos explode(","$line);
         echo (
"mail -s $datos[0] direccion@dominio $datos[1]<br>    ");   
        
$n++;if ($n==20) {sleep(2);$n=0;}
    } 
//fin foreach
?>
  #5 (permalink)  
Antiguo 20/09/2010, 05:36
 
Fecha de Ingreso: septiembre-2009
Ubicación: Sevilla
Mensajes: 37
Antigüedad: 14 años, 7 meses
Puntos: 0
Respuesta: Script para recorrer fichero

Gracias por contestar.

Estoy usando un .php que usa la libreria phpmailer, funciona a la perfeccion.

Lo unico que queda para finalizar el script, es, por cada fila que recorra, mande mail, y la borre.
De esa forma, en nombres.txt solo tendria las personas a las que aun NO se les ha mandado el mail.

¿Se os ocurre alguna otra forma mejor, para, identificar quien fue el ultimo que se mando ? ( insertarlo en una BD, algun fichero de ayuda... )
Mi idea es, inmediatamente despues de mandar mail, borrar la fila leida del .txt ¿ el problema ?, nose si existe funcion para ello.

Última edición por KbzaJunior; 20/09/2010 a las 06:48 Razón: Actualizar datos
  #6 (permalink)  
Antiguo 20/09/2010, 07:20
Avatar de Vun
Vun
Colaborador
 
Fecha de Ingreso: agosto-2009
Ubicación: Benalmádena, España
Mensajes: 2.265
Antigüedad: 14 años, 8 meses
Puntos: 150
Respuesta: Script para recorrer fichero

Ya que no vas a usar BD, pues create otro txt tan solo con el número de linea último que enviaste. De modo que si quieres continuar por ahi, lea dicha cifra y dentro del bucle preguntes si:

if ($numerolineaactual<$ultimalineaenviada) {continue;} // Esto hace que salte directamente al } del bucle y no haga nada.
  #7 (permalink)  
Antiguo 20/09/2010, 10:18
 
Fecha de Ingreso: septiembre-2009
Ubicación: Sevilla
Mensajes: 37
Antigüedad: 14 años, 7 meses
Puntos: 0
Respuesta: Script para recorrer fichero

Replanteo el problema, queda de forma mas "profesional" ademas de limpia , y de cara al futuro, cuando necesite mandar SMS..... usaria la misma BD, en mi umilde opinion, queda mejor toda la info en una BD que en un fichero.

De momento, lo que tengo hecho es el script que me pasa de .txt los registros a una tabla, quedando el resultado asi:

Y el codigo usado es:
Código:
$lines = file('nombres.txt');
$c=mysql_connect("localhost","root","admin") OR DIE ("Imposible conectar");
mysql_select_db("sms",$c);
foreach ($lines as $line_num => $line) {       
        $datos = explode(",", $line);
		$sql = "INSERT INTO numeros (numero, mensaje, enviado ) VALUES ($datos[0], '$datos[1]', false)";
		mysql_query($sql, $c);
}
?>
Por lo que, usando el campo boolean que tengo ( enviado ), podré determinar mejor cual fue el ultimo envio que hize.
Mi problema está ahora, en.......
Como realizo el select?, select de *, o select de unas columnas solo?
¿Necesito 3 foreach ( uno para las 3 ultumas columna de la tabla que muestro ) ?

Mi idea es, en el foreach mas interno, llamar al phpmailer para que mande el mail.
  #8 (permalink)  
Antiguo 20/09/2010, 10:39
 
Fecha de Ingreso: septiembre-2009
Ubicación: Sevilla
Mensajes: 37
Antigüedad: 14 años, 7 meses
Puntos: 0
Respuesta: Script para recorrer fichero

Me auto contesto:

Realizando los 3 foreach, en el mas interno, doy la orden de que me mande un mail, todo perfecto por ahora.
Solo me queda, limitar los envios de 400 en 400 al dia( por ejemplo ).
La idea es no colapsar el servidor que procesa estos mais, para que no le llegen 4000 mails de sopeton.

Pego el codigo que me selecciona los registros de la BD, e inmediatamente despues le cambio el booleano 1 ( es decir, se han mandado )
Código:
$sql="SELECT id FROM numeros WHERE enviado=0";
if($resultado=mysql_query($sql,$c)){
			while($v=mysql_fetch_row($resultado)){
				foreach($v as $valor){
    					$sql1="SELECT numero FROM numeros WHERE id=$valor";
    					if($resultado1=mysql_query($sql1,$c)){
    						while($v1=mysql_fetch_row($resultado1)){
    							foreach($v1 as $valor1){
    								$sql2="SELECT mensaje FROM numeros WHERE id=$valor";
    								if($resultado2=mysql_query($sql2,$c)){
    									while($v2=mysql_fetch_row($resultado2)){
    										foreach($v2 as $valor2){
    											echo $valor." ".$valor1." ".$valor2."<br>";
    											$update="UPDATE numeros SET enviado=1 WHERE id=$valor";//establezco que ya se han mandado
    											mysql_query($update,$c);
    											
    											$subject=$valor1;
    											$html=$valor2;
    										try{
												$xmail = new PHPMailer(true);
												$xmail->SetLanguage("es","PhpMailer/language/");
												$xmail->From = $sender;
												$xmail->Subject = $subject;
												$xmail->Body = $html;
												$xmail->IsHTML (true);
												$xmail->IsSMTP();
							
												$xmail->Host = $config["host"];
												$xmail->Port = $config["port"];
												$xmail->SMTPAuth = $config["auth"];
												$xmail->Username = $config["username"];
												$xmail->Password = $config["password"];
							
													foreach($recipients as $k => $recipient){
														$xmail->AddAddress($recipient);
														$xmail->Send();
														$xmail->ClearAddresses();
													}
											} catch (phpmailerException $e) {
												echo $e->errorMessage();
											}
    										
    										}
    									}
    								}
    							}    							
    						}
    					}
    			}	
			}
  #9 (permalink)  
Antiguo 20/09/2010, 11:42
Avatar de Vun
Vun
Colaborador
 
Fecha de Ingreso: agosto-2009
Ubicación: Benalmádena, España
Mensajes: 2.265
Antigüedad: 14 años, 8 meses
Puntos: 150
Respuesta: Script para recorrer fichero

No tiene sentido usar 3 bucles eh, prueba esto y fijate como vamos recogiendo los registros y mostrando los campos:

Código PHP:
$sql="SELECT * FROM numeros WHERE enviado=0";
$resultado=mysql_query($sql,$c);
while (
$row=mysql_fetch_array($resultado)) {
    echo 
$row["id"]." - ".$row["numero"]." - ".$row["mensaje"]."<br>";

  #10 (permalink)  
Antiguo 20/09/2010, 15:43
 
Fecha de Ingreso: septiembre-2009
Ubicación: Sevilla
Mensajes: 37
Antigüedad: 14 años, 7 meses
Puntos: 0
Respuesta: Script para recorrer fichero

Vaya......, tenia costumbre de usar el fetch_row... y.... mira que bien rula el fetch_array.

Mañana lo pruebo y te digo.

Mañana miraré algun bucle para limitar los envios a xxxxx intentos, ya que este php, se programará en un cron.....

Gracias
  #11 (permalink)  
Antiguo 20/09/2010, 16:21
Avatar de Vun
Vun
Colaborador
 
Fecha de Ingreso: agosto-2009
Ubicación: Benalmádena, España
Mensajes: 2.265
Antigüedad: 14 años, 8 meses
Puntos: 150
Respuesta: Script para recorrer fichero

Con esto recoge solo los 200 primeros registros, en vez de todos:

$sql="SELECT * FROM numeros WHERE enviado=0 LIMIT 200";
  #12 (permalink)  
Antiguo 21/09/2010, 01:17
 
Fecha de Ingreso: septiembre-2009
Ubicación: Sevilla
Mensajes: 37
Antigüedad: 14 años, 7 meses
Puntos: 0
Respuesta: Script para recorrer fichero

Desde luego, que, no conocia el fetch_array y..... que comodidad!
De tener un codigo no optimizado, a tenerlo :p
!Gracias!

Respecto al limit, si, le pondré el limite en la select, antes que ponerle algun bucle iterativo.

Ya te cuento el dia que lo lanze ( estoy a la espera que me den los datos, y convertirlos a sql ), haber como se comporta.

Gracias nuevamente!

Etiquetas: fichero, recorrer
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 22:05.