Indice del forum Olimpo Informatico
I Forum di Zeus News
Leggi la newsletter gratuita - Attiva il Menu compatto
 
 FAQFAQ   CercaCerca   Lista utentiLista utenti   GruppiGruppi   RegistratiRegistrati 
 ProfiloProfilo   Messaggi privatiMessaggi privati   Log inLog in 

    Newsletter RSS Facebook Twitter Contatti Ricerca
Difficile notifica email utente da tabella MySQL
Nuovo argomento   Rispondi    Indice del forum -> Linguaggi per Internet
Precedente :: Successivo  
Autore Messaggio
Simona77
Mortale devoto
Mortale devoto


Registrato: 04/02/08 11:07
Messaggi: 9

MessaggioInviato: 04 Feb 2008 11:28    Oggetto: Difficile notifica email utente da tabella MySQL Rispondi citando

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
Profilo Invia messaggio privato
mdweb
Dio maturo
Dio maturo


Registrato: 18/12/07 16:59
Messaggi: 4412

MessaggioInviato: 04 Feb 2008 19:11    Oggetto: Rispondi citando

Ciao se per caso hai lo script in rete lo posso vedere?
Top
Profilo Invia messaggio privato
freemind
Supervisor sezione Programmazione
Supervisor sezione Programmazione


Registrato: 04/04/07 21:28
Messaggi: 4643
Residenza: Internet

MessaggioInviato: 04 Feb 2008 20:00    Oggetto: Rispondi citando

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
Profilo Invia messaggio privato
WGH
Comune mortale
Comune mortale


Registrato: 04/02/08 19:27
Messaggi: 1

MessaggioInviato: 04 Feb 2008 20:02    Oggetto: Rispondi citando

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
Profilo Invia messaggio privato HomePage
freemind
Supervisor sezione Programmazione
Supervisor sezione Programmazione


Registrato: 04/04/07 21:28
Messaggi: 4643
Residenza: Internet

MessaggioInviato: 04 Feb 2008 20:31    Oggetto: Rispondi citando

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
Profilo Invia messaggio privato
Simona77
Mortale devoto
Mortale devoto


Registrato: 04/02/08 11:07
Messaggi: 9

MessaggioInviato: 04 Feb 2008 23:17    Oggetto: Rispondi citando

Ragazzi fantastici!

Confermo che aggiungendo "ORDER BY offerta DESC" si ottiene perfettamente il risultato desiderato.

Grazie per la disponibilità Wink

Mi capiterà certamente di avere altri quesiti da rivolgere a voi massimi esperti, confidando nella vostra futura disponibilità vi auguro una buona serata.

Simo Wink
Top
Profilo Invia messaggio privato
SverX
Supervisor Macchinisti
Supervisor Macchinisti


Registrato: 25/03/02 12:16
Messaggi: 11810
Residenza: Tokelau

MessaggioInviato: 05 Feb 2008 15:05    Oggetto: Rispondi citando

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...

Ciao
Top
Profilo Invia messaggio privato HomePage
freemind
Supervisor sezione Programmazione
Supervisor sezione Programmazione


Registrato: 04/04/07 21:28
Messaggi: 4643
Residenza: Internet

MessaggioInviato: 05 Feb 2008 17:34    Oggetto: Rispondi citando

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
Profilo Invia messaggio privato
SverX
Supervisor Macchinisti
Supervisor Macchinisti


Registrato: 25/03/02 12:16
Messaggi: 11810
Residenza: Tokelau

MessaggioInviato: 05 Feb 2008 17:55    Oggetto: Rispondi citando

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è...

Ciao
Top
Profilo Invia messaggio privato HomePage
Simona77
Mortale devoto
Mortale devoto


Registrato: 04/02/08 11:07
Messaggi: 9

MessaggioInviato: 11 Feb 2008 14:01    Oggetto: Rispondi

Ancora grazie ragazzi. Siete i numeri UNO! Wink
Top
Profilo Invia messaggio privato
Mostra prima i messaggi di:   
Nuovo argomento   Rispondi    Indice del forum -> Linguaggi per Internet Tutti i fusi orari sono GMT + 2 ore
Pagina 1 di 1

 
Vai a:  
Non puoi inserire nuovi argomenti
Non puoi rispondere a nessun argomento
Non puoi modificare i tuoi messaggi
Non puoi cancellare i tuoi messaggi
Non puoi votare nei sondaggi