problema query

  • Creatore Discussione Creatore Discussione symon83
  • Data di inizio Data di inizio

symon83

Nuovo Utente
29 Set 2009
5
0
0
Ciao a tutti, ho fatto un piccolo form da dove posso inviare delle mail agli iscritti alla newsletter.
Gli iscritti posso iscriversi alla newsletter con differenti categorie, ad esempio uno si può ricevere newletter come utente, piuttosto che solo di ristoranti ecc.

Al momento dell'invio ho messo dei check box ognuno corrispondente ad una categoria in modo che possso scegliere a chi è indirizzata la mia mail.
Il problem si presenta quando voglio mandarla a più di una categoria. ho impostato la query così:

PHP:
$cat1='';if (isset($_POST['utente'])){$cat1=$_POST['utente'];}
$cat2='';if (isset($_POST['azienda'])){$cat2=$_POST['azienda'];}
$cat3='';if (isset($_POST['enoteca'])){$cat3=$_POST['enoteca'];}
$cat4='';if (isset($_POST['ristorante'])){$cat4=$_POST['ristorante'];}
$cat5='';if (isset($_POST['winebar'])){$cat5=$_POST['winebar'];}
$cat6='';if (isset($_POST['prova'])){$cat6=$_POST['prova'];}

$sql='SELECT ute_id,ute_email FROM utente AS utente INNER JOIN categoria AS categoria WHERE utente.ute_cate_id=categoria.cate_id AND (categoria.cate_nome="'.$cat1.'" ';
if ($cat1!=''){$sql=$sql.')';}
if ($cat2!=''){$sql=$sql.' OR categoria.cate_nome="'.$cat2.'")';}
if ($cat3!=''){$sql=$sql.' OR categoria.cate_nome="'.$cat3.'")';}
if ($cat4!=''){$sql=$sql.' OR categoria.cate_nome="'.$cat4.'")';}
if ($cat5!=''){$sql=$sql.' OR categoria.cate_nome="'.$cat5.'")';}
if ($cat6!=''){$sql=$sql.' OR categoria.cate_nome="'.$cat6.'")';}
$dati=mysql_query($sql,$miaconn) or die ($sql); 


in questo modo però se seleziono tutti la query verrà così:

SELECT ute_id,ute_email FROM utente AS utente INNER JOIN categoria AS categoria WHERE utente.ute_cate_id=categoria.cate_id AND (categoria.cate_nome="utente" ) OR categoria.cate_nome="azienda") OR categoria.cate_nome="enoteca") OR categoria.cate_nome="ristorante") OR categoria.cate_nome="winebar") OR categoria.cate_nome="prova")



e ovviamente non funziona...come posso impostarla? qualche consiglio? grazie ciao simone
Modifica/elimina messaggio
 
ciao, prova così

PHP:
if ($cat1!=''){$wh=$wh.'';}
if ($cat2!=''){$wh.=$wh.' OR categoria.cate_nome="'.$cat2.'" ';}
if ($cat3!=''){$wh.=$wh.' OR categoria.cate_nome="'.$cat3.'" ';}
if ($cat4!=''){$wh.=$wh.' OR categoria.cate_nome="'.$cat4.'" ';}
if ($cat5!=''){$wh.=$wh.' OR categoria.cate_nome="'.$cat5.'" ';}
if ($cat6!=''){$wh.=$wh.=' OR categoria.cate_nome="'.$cat6.'" ';}
$wh.=$wh.' )';

$sql=$sql.$wh;
/*
se cat tutte  vuote
risulta
SELECT ute_id,ute_email FROM utente AS utente INNER JOIN categoria AS categoria WHERE utente.ute_cate_id=categoria.cate_id AND (categoria.cate_nome="utente" )
con una o più non vuote
SELECT ute_id,ute_email FROM utente AS utente INNER JOIN categoria AS categoria WHERE utente.ute_cate_id=categoria.cate_id AND (categoria.cate_nome="utente" OR ...)
*/
 
Io ti ocnsiglio di rimettere mano al codice e farlo leggermente più ordinato, poi ovviamente ognuno scrive come meglio gli pare!

In ogni caso se hai messo i checkboxes, non avrai solo valori uguali ad 1 e 0 (true o false)?

Prova ad usare questo codice:
PHP:
$cat1 = (!empty($_POST['utente'])) 	 ? $_POST['utente'] : '';
$cat2 = (!empty($_POST['azienda']))     ? $_POST['azienda'] : '';
$cat3 = (!empty($_POST['enoteca'])) 	? $_POST['enoteca'] : '';
$cat4 = (!empty($_POST['ristorante']))  ? $_POST['ristorante'] : '';
$cat5 = (!empty($_POST['winebar'])) 	? $_POST['winebar'] : '';
$cat6 = (!empty($_POST['prova'])) 	  ? $_POST['prova'] : '';

$sql = "SELECT ute_id, ute_email 
	FROM utente AS utente 
	INNER JOIN categoria AS categoria 
	WHERE utente.ute_cate_id=categoria.cate_id 
		AND categoria.cate_nome = '" . $cat1 . "'";

$sql .= (!empty($cat2)) ? " OR categoria.cate_nome = '" . $cat2 . "'" : '';
$sql .= (!empty($cat3)) ? " OR categoria.cate_nome = '" . $cat3 . "'" : '';
$sql .= (!empty($cat4)) ? " OR categoria.cate_nome = '" . $cat4 . "'" : '';
$sql .= (!empty($cat5)) ? " OR categoria.cate_nome = '" . $cat5 . "'" : '';
$sql .= (!empty($cat6)) ? " OR categoria.cate_nome = '" . $cat6 . "'" : '';

if(!($dati = mysql_query($sql,$miaconn)))
{
	die('Errore nella query: ' . mysql_error() . '<br /><br />' . $sql);
}

Ti consiglio di postare il form html e di utilizzare gli array in modo da risparmiare molte righe di codice e fare tutto con un semplice foreach() o for().
 
Ultima modifica:
Grazie per le dritte ragazzi. ora la query sembra farla correttamente.
Dopodichè per recuperare le mail ho usato questo cod:

PHP:
for($i=0;$i<$num;$i++) {
$mail = mysql_result($dati, $i, 'ute_email');
echo $mail;
}
//istanziamo la classe
$messaggio = new PHPmailer();
$messaggio->IsHTML(true);
//definiamo le intestazioni e il corpo del messaggio
$messaggio->From='info@miosito.it';
$messaggio->AddAddress($mail);
$messaggio->AddReplyTo('info@miosito.it'); 
$messaggio->Subject=$oggetto;
$messaggio->Body=stripslashes($mess);

il problema ora è che le mail le salva tipo: prova@hotmail.itprovadue@hotmail.it ecc. quindi quando gli passo la variabile $mail alla classe di phpmailer non mi dà errore, mi conferma il messaggio di mail inviata, però non arriva la mail, mentre se nel addAddres scrivo proprio l'indirizzo mail, la manda correttamente. Come faccio a separare i vari indirizzi con un punto e virgola?
 
Ultima modifica:
Grazie per le dritte ragazzi. ora la query sembra farla correttamente.
Dopodichè per recuperare le mail ho usato questo cod:

PHP:
for($i=0;$i<$num;$i++) {
$mail = mysql_result($dati, $i, 'ute_email');
echo $mail;
}
//istanziamo la classe
$messaggio = new PHPmailer();
$messaggio->IsHTML(true);
//definiamo le intestazioni e il corpo del messaggio
$messaggio->From='info@miosito.it';
$messaggio->AddAddress($mail);
$messaggio->AddReplyTo('info@miosito.it'); 
$messaggio->Subject=$oggetto;
$messaggio->Body=stripslashes($mess);

il problema ora è che le mail le salva tipo: prova@hotmail.itprovadue@hotmail.it ecc. quindi quando gli passo la variabile $mail alla classe di phpmailer non mi dà errore, mi conferma il messaggio di mail inviata, però non arriva la mail, mentre se nel addAddres scrivo proprio l'indirizzo mail, la manda correttamente. Come faccio a separare i vari indirizzi con un punto e virgola?

Mi correggo ho detto una sciocchezza...non posso passargli più indirizzi contemporaneamente, devo passargli un indirizzo per volta, dovrei quindi usare un foreach come mi hai consigliato tu?
 
Ultima modifica:
No un foreach() per forza, in ogni caso un ciclo in modo che tutto sia ricorsivo.

Fai un ciclo e dopo ogni invio della mail, mettici la funzione sleep() per evitare di caricare troppo il server oppure fai un controllo con la % (percentuale) e ogni TOT di email inviate ci metti sleep().
 
Ok, ho usato il ciclo for ora funziona tutto correttamente, grazie ragazzi buona giornata! :)
 

Discussioni simili