form con input select con valori diversi tra loro

  • Creatore Discussione Creatore Discussione asevenx
  • Data di inizio Data di inizio

asevenx

Utente Attivo
7 Nov 2009
312
0
16
Salve, chiedo ancora il vostro aiuto. Ho costruito un form con 4 input select (a tendina) che visualizzano valori provenienti da un database. Ad esempio questi valori sono nomi di città, e sono tutti diversi. Vorrei che quando vado ad inviare i dati un controllo mi avvisasse se all'interno dei 4 input ci sono valori ripetuti. Faccio un esempio per essere più chiaro.

Questa è la tabella di partenza:
ROMA
MILANO
TORINO
NAPOLI

Quando vado a selezionare tali valori vorrei che in ogni input ci sia una città diversa, e che quindi non si ripeta:
MILANO - NAPOLI - TORINO - NAPOLI (errore)
NAPOLI - TORINO - MILANO - ROMA (giusto)
 
Ti ho scritto un piccolo esempio:
PHP:
//array città
$citta = array('MILANO','NAPOLI','TORINO','ROMA');
//array dei select
$posted = array($_POST['select1'],$_POST['select2'],$_POST['select3'],$_POST['select4']);
//somma dei valori
foreach($posted as $nome => $valore)$subv .= $valore." ";
//ciclo for che controlla tramite il substr_count che nella stringa non ci sia ripetuta piu di una volta la stessa città
for($i=0;$i<count($citta);$i++){
if(substr_count($subv,$citta[$i])>1){
   echo "Errore..."; break; }
}

Edit: ti ho aggiunto i commenti
 
Ultima modifica:
Puoi specificare l'errore o se hai modificato il codice, l'ho testato in locale e funziona perfettamente
 
Si l'ho dovuto modificare per adattarlo a ciò che dovevo fare. Inanzi tutto l'array non è formato da città, quello era solo un esempio per cercare di lavorarci su un po da solo. Spiego quindi qual'è il mio obbiettivo. Devo creare un calendario per un evento sportivo attraverso un form, dove delle squadre (prese da un db) vengono selezionate attraverso degli input select. Le squadre si incontrano tra di loro in più giornate, ed in ogni giornata ci sono determinati incontri. Da qui la mia necessità a inserire un controllo preventivo per evitare l'inserimento multiplo di una squadra all'interno della stessa giornata. Il form è così composto:

PHP:
$cerca1 = "SELECT * FROM $tabella "; 
$risultato1 = mysql_query($cerca1,$connessione);
$numsquadre =mysql_num_rows($risultato1);
$partite = $numsquadre/2;
$giornate =  (($numsquadre * 2) - 2);

for ($j = 1; $j < 7; $j++) {
	if ($j < 4 ) { 
	$girone = "andata";
	} else {
	$girone = "ritorno";
	}
echo"<table><tr><td colspan='2'>
	<input disabled='disabled' type='text' value= \" $j.a giornata \" name= \" $j \" id=\" $j \" readonly style=\"width: 110px\"><input disabled='disabled' type='text' value= \" girone di $girone \"  name= \"girone". $girone ."\" id=\" $girone \" readonly style=\"width: 150px\"></td></tr>";
for ($i = 0; $i < $partite; $i++) {

echo"
			<tr>
				<td>
					<input type=\"text\" name= \"date".$i.$j."\" id=\"sel".$i.$j."\" readonly style=\"width: 70px\">
					<input type=\"reset\" value=\" + \" onClick=\"return showCalendar('sel".$i.$j."', '%d/%m/%Y');\">
				</td>
				<td>	
					<select id='giornata".$j."partita".$i."_c' name='giornata".$j."partita".$i."_c' style=\"width: 200px\">
					<option value='-'>seleziona ospitante</option>";
	
//visualizza tutti i record nel DB
$query = "SELECT * FROM $tabella ORDER BY nome ASC";
$result = mysql_query($query, $connessione) or die('Errore...');

//ciclo while per visualizzare i dati estratti dal database
	while($resrow = mysql_fetch_row($result))
	{
		$nome= addslashes($resrow[1]);
	
	echo "<option value='$nome'>$nome</option>"; 
	}

echo"			<td>	
					<select id='giornata".$j."partita".$i."_t' name='giornata".$j."partita".$i."_t' style=\"width: 200px\">
					<option value='-'>squadra ospite</option>";
	
//visualizza tutti i record nel DB
$query = "SELECT * FROM $tabella";
$result = mysql_query($query, $connessione) or die('Errore...');

//ciclo while per visualizzare i dati estratti dal database
	while($resrow = mysql_fetch_row($result))
	{
		$nome= addslashes($resrow[1]);
	
	echo "<option value='$nome'>$nome</option>";

	}
}			
echo"</select></td></tr></table>";
}

questa è la modifica al tuo esempio, ma appaiono due errori: Notice: Undefined variable: subv e Warning: substr_count() [function.substr-count]: Empty substring.

PHP:
//cicli for per determinare le giornate e i gironi
$cerca = "SELECT * FROM $tabella2 "; 
$risultato = mysql_query($cerca,$connessione);
$numsquadre =mysql_num_rows($risultato);
$partite = $numsquadre/2;
$giornate =  (($numsquadre * 2) - 2);

//cicli for per determinare giornata e girone
for ($j = 1; $j <= 6; $j++) { 
	if ($j < 4 ) { 
	$girone = "andata";
	} else {
	$girone = "ritorno";
	}

	for ($i = 0; $i < $partite; $i++) {

//array delle squadre, in cui si deve specificare giornata e girone
$posted = array($_POST['giornata' . $j . 'partita' . $i . '_c'],$_POST['giornata' . $j . 'partita' . $i . '_t'],$_POST['giornata' . $j . 'partita' . $i . '_c'],$_POST['giornata' . $j . 'partita' . $i . '_t']);
	}

//somma dei valori
foreach($posted as $nome => $valore)$subv .= $valore." ";

//ciclo for che controlla tramite il substr_count che nella stringa non ci sia ripetuta piu di una volta la stessa squadra
for($n=0;$n<$numsquadre;$n++){
	if(substr_count($subv,$squadre[$n])>1){
	   echo "Errore..."; 
	} else {
		
//inserisci partite	nel DB
$caricapartite = "INSERT INTO $tabella (id,data,squadracasa,squadratrasf,gol1,gol2,turno,girone) VALUES('','${'date' . $i . $j}','${'giornata' . $j . 'partita' . $i . '_c'}','${'giornata' . $j . 'partita' . $i . '_t'}','','','$j','$girone')"; 
mysql_query($caricapartite) or die("Errore...\n<br />Query: " . $caricapartite . "<br />\nDettagli: (" . mysql_errno() . ") " . mysql_error()); 

echo "Partita ${'giornata' . $j . 'partita' . $i . '_c'} - ${'giornata' . $j . 'partita' . $i . '_t'}  inserita correttamente!<br>";		
		}
	}
}
?>

ho iniziato a fare anche con substr_count e implode. In questo caso però l'array iniziale e quello mostrato da implode non corrispondono, alterandomi il risultato finale (ho fatto una prova stampando a video il risultato di implode).
PHP:
//array delle squadre
$posted = array($_POST['giornata' . $j . 'partita' . $i . '_c'],$_POST['giornata' . $j . 'partita' . $i . '_t'],$_POST['giornata' . $j . 'partita' . $i . '_c'],$_POST['giornata' . $j . 'partita' . $i . '_t']);
	}
	
//verifica che non sia stato inserita una squadra più volte
$stringa = implode(',', $posted);

if (substr_count($stringa,'xxx')>1){

//inserisci partite	nel DB
$caricapartite = "INSERT INTO $tabella (id,data,squadracasa,squadratrasf,gol1,gol2,turno,girone) VALUES('','${'date' . $i . $j}','${'giornata' . $j . 'partita' . $i . '_c'}','${'giornata' . $j . 'partita' . $i . '_t'}','','','$j','$girone')"; 
mysql_query($caricapartite) or die("Errore...\n<br />Query: " . $caricapartite . "<br />\nDettagli: (" . mysql_errno() . ") " . mysql_error()); 
echo "Partita ${'giornata' . $j . 'partita' . $i . '_c'} - ${'giornata' . $j . 'partita' . $i . '_t'}  inserita correttamente!<br>";

} else {

echo "<br>la squadra XXX, nella $j giornata è stata inserita". substr_count($stringa,'XXX') . "volte<br><br>";

	}
}
Aggiungo che in entrambi i casi, senza il controllo, i dati vengono inseriti correttamente
 
Dov'è dichiarato $squadre? Per il notice prova a settare la variabile prima del foreach $subv = '';
 
quello è uno dei problemi, non so come dichiarare l'array perché i dati vengono dal database e non vanno inseriti direttamente nella pagina
 
ho provato così, ma ho questo errore:
Warning: mysql_fetch_assoc(): 4 is not a valid MySQL result resource in /membri/torneoborgonara/torneo/caricacalendario.php on line 47

PHP:
//cicli for per determinare le giornate e i gironi
$cerca = "SELECT * FROM $tabella2 "; 
$risultato = mysql_query($cerca,$connessione);
$numsquadre =mysql_num_rows($risultato);
$partite = $numsquadre/2;
$giornate =  (($numsquadre * 2) - 2);

//cicli for per determinare giornata e girone
for ($j = 1; $j <= 6; $j++) { 
	if ($j < 4 ) { 
	$girone = "andata";
	} else {
	$girone = "ritorno";
	}

//ciclo for per selezionare la partita
	for ($i = 0; $i < $partite; $i++) {

//array delle squadre, in cui si deve specificare giornata e girone
$posted = array($_POST['giornata' . $j . 'partita' . $i . '_c'],$_POST['giornata' . $j . 'partita' . $i . '_t'],$_POST['giornata' . $j . 'partita' . $i . '_c'],$_POST['giornata' . $j . 'partita' . $i . '_t']);

//controlla che le squadre non siano ripetute
//estraggo i dati dal database
$cerca2 = "SELECT * FROM $tabella2";
$risultato = mysql_query($cerca2);

	while ($squadra = mysql_fetch_assoc($risultato)) {
	
$subv = '';

foreach($posted as $nome => $valore)$subv .= $valore." ";

//ciclo if che controlla tramite il substr_count che nella stringa non ci sia ripetuta piu di una volta la stessa squadra
	if(substr_count($subv,$squadra["nome"])>1){
	   echo "ERRORE la squadra". $squadra["nome"] ."ripetuta nella giornata $j<br>";
	   exit; 
	} else {
		

//inserisci partite	nel DB

//$caricapartite = "INSERT INTO $tabella (id,data,squadracasa,squadratrasf,gol1,gol2,turno,girone) VALUES('','${'date' . $i . //$j}','${'giornata' . $j . 'partita' . $i . '_c'}','${'giornata' . $j . 'partita' . $i . '_t'}','','','$j','$girone')"; 
//mysql_query($caricapartite) or die("Errore...\n<br />Query: " . $caricapartite . "<br />\nDettagli: (" . mysql_errno() . ") " . //mysql_error()); 

echo "Partita ${'giornata' . $j . 'partita' . $i . '_c'} - ${'giornata' . $j . 'partita' . $i . '_t'}  inserita correttamente!<br>";
			
			}
mysql_free_result($risultato);	
		
		}
	}
}
 
Ciao,
nella query invece che l' * ti conviene mettere il campo nome visto che usi solo quello

poi metti i messaggi di errore di mysql per capire il perchè le query non vanno a buon fine

PHP:
//estraggo i dati dal database
        $cerca2 = "SELECT nome FROM $tabella2";
        $risultato = mysql_query($cerca2);
        // se la query non va stampiamo i messaggi di errore e la query
        if (!$risultato) {
            echo "Errore query : <br/> $cerca2 <br/> " . mysql_error();
        }
        while ($squadra = mysql_fetch_assoc($risultato)) {
 
Hai provato a riaggiungere la connessione qui:
PHP:
//aggiungi il mysql_error()
$risultato = mysql_query($cerca2,$connessione) or die(mysql_error());
 
ciao
@asevenx
ho dato un occhio di sfuggita allo script, quindi può darsi che sbagli, ma mi sembra che tu apra alcune <select...> e il tag di chiusura </select> ne individuo uno solo
 
ho fatto le modifiche che mi avete suggerito, ma il risultato non cambia. Riposto il codice

PHP:
<?php
error_reporting(E_ALL);

//dati database
$host = "";
$username = "";
$password = "";
$database = "";
$tabella = "partite";
$tabella2 = "squadre";

//connessione e invio al DB
$connessione = mysql_connect($host,$username,$password) or die("Connessione DB fallita"); 
mysql_select_db($database,$connessione) or die("Selezione DB fallita");

//dati provenenti dal form
foreach ($_POST as $date => $arraydate) {  
       $_POST[$date] = $arraydate; 
} 
 
//cicli for per determinare le giornate e i gironi
$cerca = "SELECT * FROM $tabella2 "; 
$risultato = mysql_query($cerca,$connessione);
$numsquadre =mysql_num_rows($risultato);
$partite = $numsquadre/2;
$giornate =  (($numsquadre * 2) - 2);

//cicli for per determinare giornata e girone
for ($j = 1; $j <= 6; $j++) { 
	if ($j < 4 ) { 
	$girone = "andata";
	} else {
	$girone = "ritorno";
	}

//ciclo for per selezionare la partita
	for ($i = 0; $i < $partite; $i++) {

//array delle squadre, in cui si deve specificare giornata e girone
$posted = array($_POST['giornata' . $j . 'partita' . $i . '_c'],$_POST['giornata' . $j . 'partita' . $i . '_t'],$_POST['giornata' . $j . 'partita' . $i . '_c'],$_POST['giornata' . $j . 'partita' . $i . '_t']);

//controlla che le squadre non siano ripetute
//estraggo i dati dal database 
		$cerca2 = "SELECT nome FROM $tabella2"; 
        $risultato = mysql_query($cerca2,$connessione) or die(mysql_error()); 
		
        // se la query non va stampiamo i messaggi di errore e la query 
        if (!$risultato) { 
            echo "Errore query : <br/> $cerca2 <br/> " . mysql_error(); 
        } 
        while ($squadra = mysql_fetch_assoc($risultato)) {  
	
$subv = '';

foreach($posted as $nome => $valore)$subv .= $valore." ";

//ciclo if che controlla tramite il substr_count che nella stringa non ci sia ripetuta piu di una volta la stessa squadra
	if(substr_count($subv,$squadra["nome"])>1){
	   echo "ERRORE la squadra". $squadra["nome"] ."è ripetuta nella giornata $j<br>";
	   exit; 
	} else {
		

//inserisci partite	nel DB

$caricapartite = "INSERT INTO $tabella (id,data,squadracasa,squadratrasf,gol1,gol2,turno,girone) VALUES('','${'date' . $i . //$j}','${'giornata' . $j . 'partita' . $i . '_c'}','${'giornata' . $j . 'partita' . $i . '_t'}','','','$j','$girone')"; 
mysql_query($caricapartite) or die("Errore...\n<br />Query: " . $caricapartite . "<br />\nDettagli: (" . mysql_errno() . ") " . //mysql_error()); 

echo "Partita ${'giornata' . $j . 'partita' . $i . '_c'} - ${'giornata' . $j . 'partita' . $i . '_t'}  inserita correttamente!<br>";
			
			}

mysql_free_result($risultato);			
		}
	}
}
?>
 
Qua devi chiudere l'or die
PHP:
mysql_query($caricapartite) or die("Errore...\n<br />Query: " . $caricapartite . "<br />\nDettagli: (" . mysql_errno() . ") ");

Poi dichiara il foreach prima del while
 
Ultima modifica:

Discussioni simili