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: 11810 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: 11810 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 |
|
 |
|