| Precedente :: Successivo | 
	
	
		| Autore | Messaggio | 
	
		| Simona77 Mortale devoto
 
  
 
 Registrato: 04/02/08 11:07
 Messaggi: 9
 
 
 | 
			
				|  Inviato: 04 Feb 2008 11:28    Oggetto: Difficile notifica email utente da tabella MySQL |   |  
				| 
 |  
				| Ciao a tutti sono Simona, nuova iscritta. 
 Desidero sottoporvi una situazione ingarbugliata...almeno per me
 
 Ho una tabella MySQL in cui esistono questi campi
 
 URL_ID - ACQUIRENTE - OFFERTA - EMAIL
 
 Man mano che gli utenti offrono X per lo stesso oggetto codificato sotto la voce URL_ID, si presenta questa situazione
 
 Url_ID 1 -> ACQUIRENTE_1 -> OFFERTA_10
 Url_ID 1 -> ACQUIRENTE_2 -> OFFERTA_8
 Url_ID 1 -> ACQUIRENTE_3 -> OFFERTA_100
 Url_ID 1 -> ACQUIRENTE_4 -> OFFERTA_35
 
 Il miglior offerente è ACQUIRENTE_3 con 100.
 
 Ad un certo punto può accadere che arriva un nuovo ACQUIRENTE_5 che
 offre 200. Se accade ciò, lo script PHP che che ho preparato a quel punto dovrebbe inviare un messaggio di notifica ad ACQUIRENTE_3 che qualcuno ha offerto di più.
 
 Il problema sta nel fatto che NON viene avvisato il miglior offerente fino a quel momento (ACQUIRENTE_3) ma sempre il primo della lista cioè ACQUIRENTE_1.
 
 Ecco sotto la parte significativa del listato:
 ----------------------------------------------------------
 <?php
 
 $oggetto=$_POST["oggetto"];
 $url_id=$_POST["url_id"];
 $offer=$_POST["offerta"];
 $e_mail=$_POST["e_mail"];
 $name=$_POST["name"];
 $ip_adress=$_SERVER['REMOTE_ADDR'];
 
 $query = "INSERT INTO tblBuyerOffer Set
 url_id='$url_id',acquirente='$name',offerta='$offer',email='$e_mail',IP_adress='$ip_adress'";
 $result=mysql_query($query);
 
 ------------------------------------------------------------------------
 // notification to other buyer if someone offer more money
 $query="Select * from tblBuyerOffer Where url_id='$url_id'
 and offerta < '$offer'";
 $result=mysql_query($query);
 
 if ($row=mysql_fetch_array($result)){
 $buyer_name=$row['acquirente'];
 $buyer_email=$row['email'];
 
 $mail_message=$email_header."\r\n--------------\r\n"."Qualcuno ha fatto offerta migliore\n\r\r";
 $message_header="From: ".$title."<".$admin_email.">\r\n";
 // echo $email."  ".$mail_message;
 mail($buyer_email,"Offerta superata!!",$mail_message,$message_header);
 
 }
 ......
 -------------------------------------------------------------------------
 
 Qualcuno saprebbe gentilmente dirmi dove sbaglio?
 
 Un bacio,
 
 Simona
 |  | 
	
		| Top |  | 
	
		|  | 
	
		| mdweb Dio maturo
 
  
  
 Registrato: 18/12/07 16:59
 Messaggi: 4412
 
 
 | 
			
				|  Inviato: 04 Feb 2008 19:11    Oggetto: |   |  
				| 
 |  
				| Ciao se per caso hai lo script in rete lo posso vedere? |  | 
	
		| Top |  | 
	
		|  | 
	
		| freemind Supervisor sezione Programmazione
 
  
  
 Registrato: 04/04/07 21:28
 Messaggi: 4643
 Residenza: Internet
 
 | 
			
				|  Inviato: 04 Feb 2008 20:00    Oggetto: |   |  
				| 
 |  
				| Dopo cena ci guardo meglio ma mi sembra che l'errore sia il seguente: Prima di mandare la notifica tu inserisci la nuova offera e questo è ok ma quando fai la query:
 
  	  | Codice: |  	  | $query="Select * from tblBuyerOffer Where url_id='$url_id'
 and offerta < '$offer'";
 
 | 
 di fatto tu tiri fuori tutti i tizi che hanno fatto un'offerta più bassa e dato che non hai order by ti ritrovi un recordset con più righe ordinato per ordine di arrivo.
 Successivamente quando "fetchi" il recordset ti limiti a guardare solo la prima riga che guarda caso corrisponde proprio al primo tizio  in elenco.
 
 Secondo me dovresti sostituire la tua select con:
 
  	  | Codice: |  	  | $query="Select *,MAX(offera) AS Massimo from tblBuyerOffer Where url_id='$url_id'
 and offerta < '$offer'";
 
 | 
 
 che significa: "tira fuori il massimo (sull'offera) che sia anche minore di $offer.
 
 Ripeto: dopo cena verifico meglio e ti faccio sapere.
 
 Ciao
 |  | 
	
		| Top |  | 
	
		|  | 
	
		| WGH Comune mortale
 
  
 
 Registrato: 04/02/08 19:27
 Messaggi: 1
 
 
 | 
			
				|  Inviato: 04 Feb 2008 20:02    Oggetto: |   |  
				| 
 |  
				| Ciao Simona, quanto scrivi è idealmente corretto, ma non per dire correttamente alla macchina cosa deve fare: 
  	  | Codice: |  	  | <?php
 $query = "INSERT INTO tblBuyerOffer Set
 url_id='$url_id',acquirente='$name',offerta='$offer',email='$e_mail',IP_adress='$ip_adress'";
 $result=mysql_query($query);
 
 $query="Select * from tblBuyerOffer Where url_id='$url_id'
 and offerta < '$offer'";
 $result=mysql_query($query);
 
 if ($row=mysql_fetch_array($result)){
 $buyer_name=$row['acquirente'];
 $buyer_email=$row['email'];
 
 mail($buyer_email,"Offerta superata!!",$mail_message,$message_header);
 }
 | 
 
 Il codice da te scritto seleziona TUTTI i record che hanno un prezzo minore di, supponiamo 200 e che hanno quel determinato codice prodotto. In seguito il tuo script prende la prima riga del risultato dell'interrogazione e invia una email al suo indirizzo.
 
 Per risolvere semplicemente potresti usare questo SQL:
 
  	  | Codice: |  	  | SELECT * FROM tblBuyerOffer WHERE url_id='$url_id' AND offerta < '$offer' ORDER BY offerta DESC LIMIT 0,1
 
 | 
 Questo SQL, a differenza del tuo, seleziona tutti i record con determinato ID, offerta minore di quella presentata, in ordine per offerta discendente e successivamente limiti al primo record dei risultati.
 Il LIMIT non ti assicuro funzioni, ma l'ordinamento, per evitare di modificare il tuo codice, risolve già tutti i tuoi problemi!
 
 Simone...
 |  | 
	
		| Top |  | 
	
		|  | 
	
		| freemind Supervisor sezione Programmazione
 
  
  
 Registrato: 04/04/07 21:28
 Messaggi: 4643
 Residenza: Internet
 
 | 
			
				|  Inviato: 04 Feb 2008 20:31    Oggetto: |   |  
				| 
 |  
				| L'uso di MAX porta in realtà a qualche rogna. meglio: 
 
  	  | Codice: |  	  | $query="Select * from tblBuyerOffer Where url_id='$url_id'
 and offerta < '$offer' order by offerta desc "  ;
 
 | 
 
 che di fatto è quallo che dice WGH.
 L'uso di LIMIT è corretto ma dato che il tuo codice php non controlla l'univocità del risultato di fatto con o senza LIMIT ottieni lo stesso risultato
 
 A stomaco pieno si lavora meglio
 |  | 
	
		| Top |  | 
	
		|  | 
	
		| Simona77 Mortale devoto
 
  
 
 Registrato: 04/02/08 11:07
 Messaggi: 9
 
 
 | 
			
				|  Inviato: 04 Feb 2008 23:17    Oggetto: |   |  
				| 
 |  
				| Ragazzi fantastici! 
 Confermo che aggiungendo "ORDER BY offerta DESC" si ottiene perfettamente il risultato desiderato.
 
 Grazie per la disponibilità
   
 Mi capiterà certamente di avere altri quesiti da rivolgere a voi massimi esperti, confidando nella vostra futura disponibilità vi auguro una buona serata.
 
 Simo
  |  | 
	
		| Top |  | 
	
		|  | 
	
		| SverX Supervisor Macchinisti
 
  
  
 Registrato: 25/03/02 12:16
 Messaggi: 11861
 Residenza: Tokelau
 
 | 
			
				|  Inviato: 05 Feb 2008 15:05    Oggetto: |   |  
				| 
 |  
				|  	  | Simona77 ha scritto: |  	  | Confermo che aggiungendo "ORDER BY offerta DESC" si ottiene perfettamente il risultato desiderato. | 
 
 Aggiungi comunque ancora la LIMIT, per questioni di performance, per quando avrai tante offerte...
 
 
  |  | 
	
		| Top |  | 
	
		|  | 
	
		| freemind Supervisor sezione Programmazione
 
  
  
 Registrato: 04/04/07 21:28
 Messaggi: 4643
 Residenza: Internet
 
 | 
			
				|  Inviato: 05 Feb 2008 17:34    Oggetto: |   |  
				| 
 |  
				| Ciao SverX, non credo che cambi nulla. Se non sbaglio con la clausola LIMIT mysql fa comunque tutta l'estrazione indicata dalla query e poi ritorna solo le righe della limit.
 Per questo credo che a livello di esecuzione materiale della query non cambi nulla, sicuramente in ram alla fine hai un recordset più piccolo.
 
 Ho appena provato una select * con e senza LIMIT. L'explain fornisce lo stesso risultato (a meno della dimensione del recordset).
 |  | 
	
		| Top |  | 
	
		|  | 
	
		| SverX Supervisor Macchinisti
 
  
  
 Registrato: 25/03/02 12:16
 Messaggi: 11861
 Residenza: Tokelau
 
 | 
			
				|  Inviato: 05 Feb 2008 17:55    Oggetto: |   |  
				| 
 |  
				|  	  | freemind ha scritto: |  	  | sicuramente in ram alla fine hai un recordset più piccolo | 
 
 sì, mi riferivo alla dimensione del recordset, non tanto alla performance dell'interrogazione in sè...
 
 
  |  | 
	
		| Top |  | 
	
		|  | 
	
		| Simona77 Mortale devoto
 
  
 
 Registrato: 04/02/08 11:07
 Messaggi: 9
 
 
 | 
			
				|  Inviato: 11 Feb 2008 14:01    Oggetto: |   |  
				| 
 |  
				| Ancora grazie ragazzi. Siete i numeri UNO!  |  | 
	
		| Top |  | 
	
		|  | 
	
		|  |