modifica di più record contemporaneamente

  • Creatore Discussione Creatore Discussione IImanuII
  • Data di inizio Data di inizio

IImanuII

Utente Attivo
10 Giu 2012
390
0
16
Salve a tutti, tra i miei vari esperimenti mi sono imbattuto in un caso un pò particolare.
Vorrei modificare più di un campo di una tabella mysql contemporaneamente.

Un record alla volta, il codice funziona. Tutti assieme no. Il perchè penso sia dal ricercare nell'esigenza di utilizzare un array multidimensionale (almeno credo):confused:

Vi posto il codice e poi spiego sotto:
PHP:
if(isset($_POST['modifica'])){
	if (isset ($_POST['chek'])) {
		foreach($_POST['chek'] as $val){ 
			$query = "SELECT * FROM Films WHERE id LIKE $val"; 
			$ris_query = mysql_query($query); 
			$ris = mysql_fetch_array($ris_query);
?>
			<form action="<?php echo $_SERVER['PHP_SELF'];?>" method="post">
					<div>
							<label>
									<span>Titolo: </span><?php echo $ris['id']; ?>
									<input name="titolo" value="<?php echo $ris['titolo']; ?>" type="text" tabindex="1" required autofocus>
							</label>
					</div>
					<div>
							<label>
									<span>Genere: </span>
									<select name="genere" tabindex="2" required>
										<option value="">Seleziona
										<option <?php if ($ris['genere'] === "Non definito"){echo "selected";}?>>Non definito
										<option <?php if ($ris['genere'] === "Animazione"){echo "selected";}?>>Animazione
										<option <?php if ($ris['genere'] === "Avventura"){echo "selected";}?>>Avventura
										<option <?php if ($ris['genere'] === "Azione"){echo "selected";}?>>Azione
										<option <?php if ($ris['genere'] === "Balletto"){echo "selected";}?>>Balletto
										<option <?php if ($ris['genere'] === "Biografico"){echo "selected";}?>>Biografico
										<option <?php if ($ris['genere'] === "Commedia"){echo "selected";}?>>Commedia
										<option <?php if ($ris['genere'] === "Concerto"){echo "selected";}?>>Concerto
										<option <?php if ($ris['genere'] === "Cortometraggio"){echo "selected";}?>>Cortometraggio
										<option <?php if ($ris['genere'] === "Fiction"){echo "selected";}?>>Fiction
										<option <?php if ($ris['genere'] === "Documentario"){echo "selected";}?>>Documentario
										<option <?php if ($ris['genere'] === "Drammatico"){echo "selected";}?>>Drammatico
										<option <?php if ($ris['genere'] === "Epico"){echo "selected";}?>>Epico
										<option <?php if ($ris['genere'] === "Erotico"){echo "selected";}?>>Erotico
										<option <?php if ($ris['genere'] === "Fantascienza"){echo "selected";}?>>Fantascienza
										<option <?php if ($ris['genere'] === "Fantastico"){echo "selected";}?>>Fantastico
										<option <?php if ($ris['genere'] === "Fiabesco"){echo "selected";}?>>Fiabesco
										<option <?php if ($ris['genere'] === "Guerra"){echo "selected";}?>>Guerra
										<option <?php if ($ris['genere'] === "Horror"){echo "selected";}?>>Horror
										<option <?php if ($ris['genere'] === "Musical"){echo "selected";}?>>Musical
										<option <?php if ($ris['genere'] === "Poliziesco"){echo "selected";}?>>Poliziesco
										<option <?php if ($ris['genere'] === "Religioso"){echo "selected";}?>>Religioso
										<option <?php if ($ris['genere'] === "Romanzo"){echo "selected";}?>>Romanzo
										<option <?php if ($ris['genere'] === "Sentimentale"){echo "selected";}?>>Sentimentale
										<option <?php if ($ris['genere'] === "Sportivo"){echo "selected";}?>>Sportivo
										<option <?php if ($ris['genere'] === "Storico"){echo "selected";}?>>Storico
										<option <?php if ($ris['genere'] === "Thriller"){echo "selected";}?>>Thriller
										<option <?php if ($ris['genere'] === "Western"){echo "selected";}?>>Western
									</select>
							</label>
					</div>
					<div>
							<label>
									<span>Trama: </span>
									<textarea name="trama" tabindex="3" maxlength="1000" required><?php echo $ris['descrizione']; ?></textarea>
							</label>
					</div>
					<div>
							<label>
									<span>La locandina del film: </span>
									<input name="locandina" value="<?php echo $ris['locandina']; ?>" type="url" tabindex="4">
							</label>
					</div>
					<div>
							<label>
									<span>Link: </span>
									<input name="stream" value="<?php echo $ris['link']; ?>" type="url" tabindex="5" required>
							</label>
					</div>
						<input name="id[]" type="hidden" value="<?php echo $ris['id']; ?>">
						<hr style="background:url(../../img/hr.png) no-repeat top center; height:37px; border:none !important;" />
					<div>
<?php
		}
		echo "<button name=\"mod_film\" type=\"submit\" id=\"btn\"><img src=\"../../img/add.png\" align=\"absmiddle\" alt=\"Modifica\" /> Modifica</button>";
		echo "<button type=\"button\" id=\"btn\" onclick=\"top.location.href = 'itf.php'\" ><img src=\"../../img/del.png\" align=\"absmiddle\" alt=\"Annulla\" /> Annulla</button>";
		echo "</div></form>";
	}else{
		echo "<font color='red'>Errore</font> - non hai selezionato alcun film, pertanto non c'è nessuna modifica da fare."; 
		echo "<meta http-equiv='Refresh' content='3; URL= itf.php'>"; 
		exit;  
	}
}
if(isset($_POST['mod_film'])){
	$titolo = strip_tags(mysql_real_escape_string($_POST['titolo']));
	$genere = strip_tags(mysql_real_escape_string($_POST['genere']));
	$trama = strip_tags(mysql_real_escape_string($_POST['trama']));
	$locandina = strip_tags(mysql_real_escape_string($_POST['locandina']));
	$stream = strip_tags(mysql_real_escape_string($_POST['stream']));
	
	foreach($_POST['id'] as $val){
		$q="UPDATE Films SET titolo='$titolo', genere='$genere', descrizione='$trama', locandina='$locandina', link='$stream' WHERE id='$val'";
		$ris=mysql_query($q);
	if (!$q) {
		echo "<font color='red'>Errore</font> - non è stato possibile eseguire la query per il film $val.<br />";
		die('Query non eseguita: ' . mysql_error());
	}else{
		echo "<br /><font color='green'>Successo</font> - Il film con id $val è stato modificato correttamente.";
	}
	}
	echo "<br /><button type=\"button\" id=\"btn\" onclick=\"top.location.href = 'itf.php'\" ><img src=\"../../img/video.png\" align=\"absmiddle\" alt=\"Elenco Film\" /> Elenco Film</button>";
}
Prima di arrivare a questa pagina provengo da un form.php con all'interno una tabella e per ogni cella c'è una check box il valore di questa è l'id della riga da modificare.

Adesso, se da form.php seleziono una sola check box modifica il record della tabella correttamente, invece se seleziono più righe modifica ambedue le righe con gli stessi valori.

Faccio un esempio ho in form.php la tabella:
id nome cognome check box
1 marco rossi
2 ugo esposito

Ora se voglio modificare solo ugo esposito oppure solo marco rossi, la modifica riesce. Invece se seleziono entrambi nella pagina che ho postato su, graficamente è tutto in ordine cioè esce il campo id con l'id corretto, il campo nome con il nome precompilato corretto etc..... questo per entrambe le righe. Se in tale situazione premo modifica mi cambia entrambi i valori con l'id 1 (cioè con il primo id che si trova a modificare)

:gun: non so come aggirare l'ostacolo.
 
Ho rileggiucchiato quello che ho scritto e mi sono reso conto che è poco chiaro. Mi spiego meglio.
Ho una prima pagina: form.php

All'interno di questa vengono recuperati i campi di un db MySQL. Tali campi sono dotati di un id che si auto incrementa. La tabella è strutturata così:
Immagine.png

Come vedete alla destra c'è una check box. In particolare questa check box ha la funzione di trasmettere l'id della riga selezionata ad un'altra pagina: action.php

Adesso in action.php svolgo le varie operazioni di modifica, cancellazione o addizione dei campi.

L'ostacolo è rappresentato dal codice della modifica dei campi.

La mia idea è questa: selezionando da form.php uno o più campi questi potevano essere modificati in contemporanea.

Quindi sempre tramite l'id recupero tutte le informazioni dei campi e le inserisco in campi appositi.
Il codice che ho utilizzato è
PHP:
 <form action="<?php echo $_SERVER['PHP_SELF'];?>" method="post"> 
                    <div> 
                            <label> 
                                    <span>Titolo: </span><?php echo $ris['id']; ?> 
                                    <input name="titolo" value="<?php echo $ris['titolo']; ?>" type="text" tabindex="1" required autofocus> 
                            </label> 
                    </div> 
                    <div> 
                            <label> 
                                    <span>Genere: </span> 
                                    <select name="genere" tabindex="2" required> 
                                        <option value="">Seleziona 
                                        <option <?php if ($ris['genere'] === "Non definito"){echo "selected";}?>>Non definito 
                                        <option <?php if ($ris['genere'] === "Animazione"){echo "selected";}?>>Animazione 
                                        <option <?php if ($ris['genere'] === "Avventura"){echo "selected";}?>>Avventura 
                                        <option <?php if ($ris['genere'] === "Azione"){echo "selected";}?>>Azione 
                                        <option <?php if ($ris['genere'] === "Balletto"){echo "selected";}?>>Balletto 
                                        <option <?php if ($ris['genere'] === "Biografico"){echo "selected";}?>>Biografico 
                                        <option <?php if ($ris['genere'] === "Commedia"){echo "selected";}?>>Commedia 
                                        <option <?php if ($ris['genere'] === "Concerto"){echo "selected";}?>>Concerto 
                                        <option <?php if ($ris['genere'] === "Cortometraggio"){echo "selected";}?>>Cortometraggio 
                                        <option <?php if ($ris['genere'] === "Fiction"){echo "selected";}?>>Fiction 
                                        <option <?php if ($ris['genere'] === "Documentario"){echo "selected";}?>>Documentario 
                                        <option <?php if ($ris['genere'] === "Drammatico"){echo "selected";}?>>Drammatico 
                                        <option <?php if ($ris['genere'] === "Epico"){echo "selected";}?>>Epico 
                                        <option <?php if ($ris['genere'] === "Erotico"){echo "selected";}?>>Erotico 
                                        <option <?php if ($ris['genere'] === "Fantascienza"){echo "selected";}?>>Fantascienza 
                                        <option <?php if ($ris['genere'] === "Fantastico"){echo "selected";}?>>Fantastico 
                                        <option <?php if ($ris['genere'] === "Fiabesco"){echo "selected";}?>>Fiabesco 
                                        <option <?php if ($ris['genere'] === "Guerra"){echo "selected";}?>>Guerra 
                                        <option <?php if ($ris['genere'] === "Horror"){echo "selected";}?>>Horror 
                                        <option <?php if ($ris['genere'] === "Musical"){echo "selected";}?>>Musical 
                                        <option <?php if ($ris['genere'] === "Poliziesco"){echo "selected";}?>>Poliziesco 
                                        <option <?php if ($ris['genere'] === "Religioso"){echo "selected";}?>>Religioso 
                                        <option <?php if ($ris['genere'] === "Romanzo"){echo "selected";}?>>Romanzo 
                                        <option <?php if ($ris['genere'] === "Sentimentale"){echo "selected";}?>>Sentimentale 
                                        <option <?php if ($ris['genere'] === "Sportivo"){echo "selected";}?>>Sportivo 
                                        <option <?php if ($ris['genere'] === "Storico"){echo "selected";}?>>Storico 
                                        <option <?php if ($ris['genere'] === "Thriller"){echo "selected";}?>>Thriller 
                                        <option <?php if ($ris['genere'] === "Western"){echo "selected";}?>>Western 
                                    </select> 
                            </label> 
                    </div> 
                    <div> 
                            <label> 
                                    <span>Trama: </span> 
                                    <textarea name="trama" tabindex="3" maxlength="1000" required><?php echo $ris['descrizione']; ?></textarea> 
                            </label> 
                    </div> 
                    <div> 
                            <label> 
                                    <span>La locandina del film: </span> 
                                    <input name="locandina" value="<?php echo $ris['locandina']; ?>" type="url" tabindex="4"> 
                            </label> 
                    </div> 
                    <div> 
                            <label> 
                                    <span>Link: </span> 
                                    <input name="stream" value="<?php echo $ris['link']; ?>" type="url" tabindex="5" required> 
                            </label> 
                    </div> 
                        <input name="id[]" type="hidden" value="<?php echo $ris['id']; ?>"> 
                        <hr style="background:url(../../img/hr.png) no-repeat top center; height:37px; border:none !important;" /> 
                    <div>
Posto un'immagine per farvi capire quello che fa questa porzione di codice:
Immagine2.png

Questo che vedete nel codice appena postato
PHP:
<input name="id[]" type="hidden" value="<?php echo $ris['id']; ?>">

è il campo nascosto che invio a if(isset($_POST['mod_film'])){ per determinare l'id di ogni riga.

Adesso però mi perdo. Mi spiego: non so come modificare ogni singola riga con le informazioni corrette. Cioè come faccio a dire, una vola scritte le modifiche e premuto il tasto "mod_film": 'recupera tutti i titoli, tutte le descrizioni tutti i link etc.. e caricali all'interno dell'id corrispondente"

Ci ho provato con questa porzione di codice
PHP:
if(isset($_POST['mod_film'])){ 
    $titolo = strip_tags(mysql_real_escape_string($_POST['titolo'])); 
    $genere = strip_tags(mysql_real_escape_string($_POST['genere'])); 
    $trama = strip_tags(mysql_real_escape_string($_POST['trama'])); 
    $locandina = strip_tags(mysql_real_escape_string($_POST['locandina'])); 
    $stream = strip_tags(mysql_real_escape_string($_POST['stream'])); 
     
    foreach($_POST['id'] as $val){ 
        $q="UPDATE Films SET titolo='$titolo', genere='$genere', descrizione='$trama', locandina='$locandina', link='$stream' WHERE id='$val'"; 
        $ris=mysql_query($q); 
    if (!$q) { 
        echo "<font color='red'>Errore</font> - non è stato possibile eseguire la query per il film $val.<br />"; 
        die('Query non eseguita: ' . mysql_error()); 
    }else{ 
        echo "<br /><font color='green'>Successo</font> - Il film con id $val è stato modificato correttamente."; 
    } 
    } 
    echo "<br /><button type=\"button\" id=\"btn\" onclick=\"top.location.href = 'itf.php'\" ><img src=\"../../img/video.png\" align=\"absmiddle\" alt=\"Elenco Film\" /> Elenco Film</button>"; 
}

Funziona bene se seleziono da form.php una sola riga. Invece se voglio modificare più righe lo script inserisce la stessa informazione in tutti i campi selezionati. Ad esempio nell'immagine di prima se seleziono 2 o più campi modificherà tutti i campi selezionati con il titolo "Bianca come il latte, rossa come il sangue" con la descrizione il link e la locandina sempre di quel primo form.

A questo punto ho pensato che anche i campi che recuperano le info per la modifica debbano essere inseriti in un array, solo che poi a questo punto non so come comportarmi.

Questo che vedete nel codice appena postato
PHP:
<input name="id[]" type="hidden" value="<?php echo $ris['id']; ?>">

è il campo nascosto che invio a if(isset($_POST['mod_film'])){ per determinare l'id di ogni riga.

Spero di essere stato più chiaro e che qualcuno possa aiutarmi a dirimere la questione xD
 
Ultima modifica:
Questo che vedete nel codice appena postato
PHP:
<input name="id[]" type="hidden" value="<?php echo $ris['id']; ?>">

è il campo nascosto che invio a if(isset($_POST['mod_film'])){ per determinare l'id di ogni riga.

Spero di essere stato più chiaro e che qualcuno possa aiutarmi a dirimere la questione xD

Quest'ultima parte è una ripetizione ma non posso più eliminarla poichè sono passati 10 min dalla pubblicazione, non tenetela di conto. :skull:
 
ciao
ho dato un'occhiata superficiale, ma credo, mi sbaglierò, che così non sia possibile.
se non ho capito male tu vorresti fare una cosa del genere (tralascio alcune cose) es hai:
id nome genenere
33 pinco fantasy
34 pallo horror

e vuoi modificare contemporaneamente così
33 pinco fantascienza
34 pallo sentimentale
giusto?

da quello che ho capito tramite le chek trasmetti l'array degli id e sin qui va bene, ma per fare quello che vuoi non devi trasmettere solo gli id,
ma per un determinato id, anche il valore che vuoi che venga sostituito, cioè schematizzando dovresti trasmettere
per id 33 genere[33]=> fantascienza
per id 34 genere[34] => sentimentale
mentre come stai facendo
per id 33 trasmetti genere=>fantascienza
per id 34 ancora genere=>fantascienza
ma non so quanto semplice sia fare quello che vuoi perche anche i valori da modificare devono essere un array con indice uguale all'id checcato
 
ciao
ho dato un'occhiata superficiale, ma credo, mi sbaglierò, che così non sia possibile.
se non ho capito male tu vorresti fare una cosa del genere (tralascio alcune cose) es hai:
id nome genenere
33 pinco fantasy
34 pallo horror

e vuoi modificare contemporaneamente così
33 pinco fantascienza
34 pallo sentimentale
giusto?

da quello che ho capito tramite le chek trasmetti l'array degli id e sin qui va bene, ma per fare quello che vuoi non devi trasmettere solo gli id,
ma per un determinato id, anche il valore che vuoi che venga sostituito, cioè schematizzando dovresti trasmettere
per id 33 genere[33]=> fantascienza
per id 34 genere[34] => sentimentale
mentre come stai facendo
per id 33 trasmetti genere=>fantascienza
per id 34 ancora genere=>fantascienza
ma non so quanto semplice sia fare quello che vuoi perche anche i valori da modificare devono essere un array con indice uguale all'id checcato

Ciao borgo, come sempre sei il mio eroe, vieni sempre in mio soccorso :P

Allora bene o male si hai ben capito quello che voglio fare.

Comincio con il dirti che fare "per id 33 genere[33]=> fantascienza" come da te detto non è per nulla un problema, basta cambiare nell'html da così

HTML:
<input name="titolo[]" value="<?php echo $ris['titolo']; ?>" type="text" tabindex="1" required autofocus>

A così
PHP:
<input name="titolo[<?php echo $ris['id']; ?>]" value="<?php echo $ris['titolo']; ?>" type="text" tabindex="1" required autofocus>
No? E' $ris['id']; che porta l'id di ogni campo.

Comunque tralasciando quanto detto su ho fatto dei progressi e te li mostro. Secondo me la soluzione non è lontana (associata a quanto hai detto tu non mi sembra per nulla impossibile).

Allora ho dato un occhio agli array multidimensionali e agli array associativi.

In base a questi ho leggermente modificato il form html. Come ho già postato su per ogni campo ho inserito un array:
HTML:
			<form action="<?php echo $_SERVER['PHP_SELF'];?>" method="post">
					<div>
							<label>
									<span>Titolo: </span>
									<input name="titolo[]" value="<?php echo $ris['titolo']; ?>" type="text" tabindex="1" required autofocus>
							</label>
					</div>
					<div>
							<label>
									<span>Genere: </span>
									<select name="genere[]" tabindex="2" required>
										<option value="">Seleziona
										<option <?php if ($ris['genere'] === "Non definito"){echo "selected";}?>>Non definito
										<option <?php if ($ris['genere'] === "Animazione"){echo "selected";}?>>Animazione
										<!-- ho ridotto la select per comodità perchè nel mio codice è lunga -->
									</select>
							</label>
					</div>
					<div>
							<label>
									<span>Trama: </span>
									<textarea name="trama[]" tabindex="3" maxlength="1000" required><?php echo $ris['descrizione']; ?></textarea>
							</label>
					</div>
					<div>
							<label>
									<span>La locandina del film: </span>
									<input name="locandina[]" value="<?php echo $ris['locandina']; ?>" type="url" tabindex="4">
							</label>
					</div>
					<div>
							<label>
									<span>Link: </span>
									<input name="stream[]" value="<?php echo $ris['link']; ?>" type="url" tabindex="5" required>
							</label>
					</div>
						<input name="id[]" type="hidden" value="<?php echo $ris['id']; ?>">
						<hr style="background:url(../../img/hr.png) no-repeat top center; height:37px; border:none !important;" />
					<div>

Come vedi ad ogni nome è associato un array: quindi quando recupero le variabili faccio in questo modo

PHP:
if(isset($_POST['mod_film'])){

	$titolo = array_map('mysql_real_escape_string', $_POST['titolo']);
	$genere = array_map('mysql_real_escape_string', $_POST['genere']);
	$trama = array_map('mysql_real_escape_string', $_POST['trama']);
	$locandina = array_map('mysql_real_escape_string', $_POST['locandina']);
	$stream = array_map('mysql_real_escape_string', $_POST['stream']);
adesso ho in sostanza per ogni variabile un array:

es: $titolo = array('titolo1', 'titolo2', 'titolo3');
$genere = array('genere1', 'genere2', 'genere3');
ecc...

ora per stampare tutti i risultati ho fatto così
Ho inserito tutti gli array in un unico array

PHP:
	$array_multidimensionale = array( $titolo, $genere, $trama, $locandina, $stream);

E ho stampato i risultati in questo modo:

PHP:
	foreach ($array_multidimensionale AS $key1 => $val1){
		foreach ($val1 AS $key2 => $val2){
			echo "Array di riga $key1, posizione $key2, contenuto $val2<br />\n";
		}
	}

A video esce

Codice:
Array di riga 0, posizione 0, contenuto titolo film1
Array di riga 0, posizione 1, contenuto titolo film2
Array di riga 1, posizione 0, contenuto genere1
Array di riga 1, posizione1, contenuto genere2
Array di riga 2, posizione 0, contenuto trama1
Array di riga 2, posizione 1, contenuto trama2

E poi qui mi sono bloccato. Come vedi dovrei associare la riga 0 con la posizione 0 alla riga 1 con la posizione 0
Se lo faccio con un echo:
PHP:
		echo "titolo" . $array_multidimensionale[0][0]." genere ".$array_multidimensionale[1][0]." trama ".$array_multidimensionale[2][0]."<br />";
Ovviamente allinea tutto correttamente, ma mi allinea solo il risultato che metto tra []. Non so proprio come procedere in questo senso.

Se invece riesco a trasmettere come dici tu l'id in questo modo "per id 34 genere[34] => sentimentale" dopo come procedo?

Grazie borgo sei il mio capitan ventosa XD
 
Ultima modifica:
L'edit qui scade dopo 10 minuti quindi sono costretto a fare più post consecutivi.

Ho fatto la modifica ipotizzata prima:
PHP:
			<form action="<?php echo $_SERVER['PHP_SELF'];?>" method="post">
					<div>
							<label>
									<span>Titolo: </span>
									<input name="titolo[<?php echo $ris['id']; ?>]" value="<?php echo $ris['titolo']; ?>" type="text" tabindex="1" required autofocus>
							</label>
					</div>
					<div>
							<label>
									<span>Genere: </span>
									<select name="genere[<?php echo $ris['id']; ?>]" tabindex="2" required>
										<option value="">Seleziona
										<option <?php if ($ris['genere'] === "Non definito"){echo "selected";}?>>Non definito
										<option <?php if ($ris['genere'] === "Animazione"){echo "selected";}?>>Animazione
										<option <?php if ($ris['genere'] === "Avventura"){echo "selected";}?>>Avventura
										<option <?php if ($ris['genere'] === "Azione"){echo "selected";}?>>Azione
										<option <?php if ($ris['genere'] === "Balletto"){echo "selected";}?>>Balletto
										<option <?php if ($ris['genere'] === "Biografico"){echo "selected";}?>>Biografico
										<option <?php if ($ris['genere'] === "Commedia"){echo "selected";}?>>Commedia
										<option <?php if ($ris['genere'] === "Concerto"){echo "selected";}?>>Concerto
										<option <?php if ($ris['genere'] === "Cortometraggio"){echo "selected";}?>>Cortometraggio
										<option <?php if ($ris['genere'] === "Fiction"){echo "selected";}?>>Fiction
										<option <?php if ($ris['genere'] === "Documentario"){echo "selected";}?>>Documentario
										<option <?php if ($ris['genere'] === "Drammatico"){echo "selected";}?>>Drammatico
										<option <?php if ($ris['genere'] === "Epico"){echo "selected";}?>>Epico
										<option <?php if ($ris['genere'] === "Erotico"){echo "selected";}?>>Erotico
										<option <?php if ($ris['genere'] === "Fantascienza"){echo "selected";}?>>Fantascienza
										<option <?php if ($ris['genere'] === "Fantastico"){echo "selected";}?>>Fantastico
										<option <?php if ($ris['genere'] === "Fiabesco"){echo "selected";}?>>Fiabesco
										<option <?php if ($ris['genere'] === "Guerra"){echo "selected";}?>>Guerra
										<option <?php if ($ris['genere'] === "Horror"){echo "selected";}?>>Horror
										<option <?php if ($ris['genere'] === "Musical"){echo "selected";}?>>Musical
										<option <?php if ($ris['genere'] === "Poliziesco"){echo "selected";}?>>Poliziesco
										<option <?php if ($ris['genere'] === "Religioso"){echo "selected";}?>>Religioso
										<option <?php if ($ris['genere'] === "Romanzo"){echo "selected";}?>>Romanzo
										<option <?php if ($ris['genere'] === "Sentimentale"){echo "selected";}?>>Sentimentale
										<option <?php if ($ris['genere'] === "Sportivo"){echo "selected";}?>>Sportivo
										<option <?php if ($ris['genere'] === "Storico"){echo "selected";}?>>Storico
										<option <?php if ($ris['genere'] === "Thriller"){echo "selected";}?>>Thriller
										<option <?php if ($ris['genere'] === "Western"){echo "selected";}?>>Western
									</select>
							</label>
					</div>
					<div>
							<label>
									<span>Trama: </span>
									<textarea name="trama[<?php echo $ris['id']; ?>]" tabindex="3" maxlength="1000" required><?php echo $ris['descrizione']; ?></textarea>
							</label>
					</div>
					<div>
							<label>
									<span>La locandina del film: </span>
									<input name="locandina[<?php echo $ris['id']; ?>]" value="<?php echo $ris['locandina']; ?>" type="url" tabindex="4">
							</label>
					</div>
					<div>
							<label>
									<span>Link: </span>
									<input name="stream[<?php echo $ris['id']; ?>]" value="<?php echo $ris['link']; ?>" type="url" tabindex="5" required>
							</label>
					</div>
						<input name="id[]" type="hidden" value="<?php echo $ris['id']; ?>">
						<hr style="background:url(../../img/hr.png) no-repeat top center; height:37px; border:none !important;" />
					<div>

Effettivamente funziona: ogni campo ha come indice l'id della riga del db cioè:
per id 33 titolo[33]=> titolo1
per id 33 genere[33]=> fantascienza
per id 33 trama[33]=> trama1

per id 34 titolo[34]=> titolo2
per id 34 genere[34]=> horror
per id 34 trama[34]=> trama2

e così via. L'id è corretto nel senso che campi e id sono corrispondenti a quelli presenti nel db.

Il risultato è quello che avevi ipotizzato tu solo che ora non so come procedere. :dipser:
 
Ultima modifica:
vedi se questo esempio ti puo essere utile
PHP:
<?php
if (isset($_POST['modifica'])) {

    $arrayautori = array_combine($_POST['id'], $_POST['autore']);
    foreach ($arrayautori as $key => $value) {
        echo "UPDATE tabella SET autore = $value WHERE id = $key";
        echo "<br/>";
    }
    $arraytitoli = array_combine($_POST['id'], $_POST['titolo']);
    foreach ($arraytitoli as $key => $value) {
        echo "UPDATE tabella SET titolo = $value WHERE id = $key";
        echo "<br/>";
    }
}
?>

<table>
    <form method="post" action="">
        <tr>
            <td><input type="text" name="autore[]" value="autore 1"/></td>
            <td><input type="text" name="titolo[]" value="titolo 1"/></td>
            <td><input type="hidden" name="id[]" value="1"/></td>
        </tr>
        <tr>
            <td><input type="text" name="autore[]" value="autore 2"/></td>
            <td><input type="text" name="titolo[]" value="titolo 2"/></td>
            <td><input type="hidden" name="id[]" value="2"/></td>
        </tr>
        <tr>
            <td>&nbsp;</td>
            <td>&nbsp;</td>
            <td><input type="submit" name="modifica" value="Modifica"/></td>
        </tr>
    </form>
</table>
non so se ho azzeccato la struttura della tua tabella
 
Ultima modifica:
Ciao criric, più tardi testo quanto mi hai postato ad un primo acchito sembra funzionare.... potresti commentare il codice che hai postato in modo da spiegarmelo?
In particolare as $key => $value
Grazie ^__^
 
la funzione array_combine() restituisce un nuovo array utilizzando i valori del primo array passato come chiavi e i valori dal secondo array come valori corrispondenti.
il foreach() serve per ciclare un array
la differenza tra la sintassi che hai usato tu
PHP:
foreach($_POST['id'] as $val){
e questa
PHP:
foreach ($arrayautori as $key => $value) {
è che in piu estrae anche il valore della chiave e lo memorizza in $key (ma potresti utilizzare qualsiasi altra variabile)
PHP:
foreach ($arrayautori as $id => $autore) {

PHP:
<?php
if (isset($_POST['modifica'])) {
    // creiamo l'array per gli autori
    $arrayautori = array_combine($_POST['id'], $_POST['autore']);
    // ciclo dell'array
    foreach ($arrayautori as $key => $value) {
        // creazione della query
        $query = "UPDATE tabella SET autore = '$value' WHERE id = $key";
        
        // esecuzione
    }
    // primo aggiornamento effettuato
    
    // creiamo l'array per i titoli
    $arraytitoli = array_combine($_POST['id'], $_POST['titolo']);
    // ciclo dell'array
    foreach ($arraytitoli as $key => $value) {
        // creazione della query
        $query = "UPDATE tabella SET titolo = '$value' WHERE id = $key";
        
        // esecuzione
    }
    // secondo aggiornamento effettuato
}
?>
 
Ultima modifica:
Grazie sei stato gentilissimo (ringrazio anche a Borgo ovviamente per essersi interessato xD)
Non ho ben capito
foreach ($arrayautori as $key => $value) {

Vuol dire "per ogni" arrayautori valorizzali come $key non capisco l'uguale e il maggiore.

Il codice funziona. Ho solo fatto qualche cambiamento:

Poichè le check box già mi portavano gli id delle righe mi è bastato fare così:

I campi del form:
PHP:
<label>
	<span>Titolo: </span>
	<input name="titolo[]" value="<?php echo $ris['titolo']; ?>" type="text" tabindex="1" required autofocus>
</label>
Ho messo name="titolo[]" e come value <?php echo $ris['titolo']; ?> perchè mi serviva per auto compilare i campi da modificare.

Poi invece di trasmettere per ogni label un campo hidden ne ho messo uno solo alla fine in questo modo:

PHP:
					</div>
						<input name="id[]" type="hidden" value="<?php echo $ris['id']; ?>">
						<hr style="background:url(../../img/hr.png) no-repeat top center; height:37px; border:none !important;" />
					<div>

Dove racchiudo in un array id[] i valori già trasmessi che già sono in un array $ris['id'];. Li avevo recuperati in questo modo:
PHP:
		foreach($_POST['chek'] as $val){ 
			$query = "SELECT * FROM Films WHERE id LIKE $val"; 
			$ris_query = mysql_query($query); 
			$ris = mysql_fetch_array($ris_query);

E alla fine ho messo il codice da te postato:
PHP:
if(isset($_POST['mod_film'])){

	$titolo = array_map('mysql_real_escape_string', $_POST['titolo']);
	$genere = array_map('mysql_real_escape_string', $_POST['genere']);
	$trama = array_map('mysql_real_escape_string', $_POST['trama']);
	$locandina = array_map('mysql_real_escape_string', $_POST['locandina']);
	$stream = array_map('mysql_real_escape_string', $_POST['stream']);
	
    $a_titoli = array_combine($_POST['id'], $_POST['titolo']);
    foreach ($a_titoli as $key => $value) {
        echo "UPDATE Films SET titolo = $value WHERE id = $key";
        echo "<br/>";
    }
	$a_genere = array_combine($_POST['id'], $_POST['genere']);
    foreach ($a_genere as $key => $value) {
        echo "UPDATE Films SET genere = $value WHERE id = $key";
        echo "<br/>";
    }

Ora a video esce così:
Codice:
UPDATE Films SET titolo = film1 WHERE id = 16
UPDATE Films SET titolo = titolo1 WHERE id = 20
UPDATE Films SET genere = Documentario WHERE id = 16
UPDATE Films SET genere = Animazione WHERE id = 20
UPDATE Films SET descrizione = Un buon metodo per inserire questi dati in un array, è utilizzare un indice per la prima dimensione, ed una chiave per la seconda dimensione (N.B. : potete usare anche 3 dimensioni e vedere la base di dati come un cubo, ma non è questo il caso del nostro esempio). WHERE id = 16
UPDATE Films SET descrizione = trama 1 WHERE id = 20
UPDATE Films SET locandina = http://18digital.com.br/blog/wp-content/uploads/et_temp/google-shopping-45050_630x210.jpg WHERE id = 16
UPDATE Films SET locandina = http://locandina.1 WHERE id = 20
UPDATE Films SET stream = http://it.wikipedia.org/wiki/Come_un_tuono WHERE id = 16
UPDATE Films SET stream = http://link.1 WHERE id = 20

Quindi quasi sicuramente ora che inserisco le query andrà benone. Non mi resta che ideare un sistema per eventuali errori, se avete suggerimenti dite pure ^_^
 
Ultima modifica:
Funziona tutto perfettamente. Posto il codice casomai servisse a qualcuno completo della gestione degli errori (Borgo docet)

PHP:
if(isset($_POST['mod_film'])){

	$titolo = array_map('mysql_real_escape_string', $_POST['titolo']);
	$genere = array_map('mysql_real_escape_string', $_POST['genere']);
	$trama = array_map('mysql_real_escape_string', $_POST['trama']);
	$locandina = array_map('mysql_real_escape_string', $_POST['locandina']);
	$stream = array_map('mysql_real_escape_string', $_POST['stream']);
	
	$errore = "";
	
    $a_titoli = array_combine($_POST['id'], $titolo);
    foreach ($a_titoli as $key => $value) {
        $q = "UPDATE Films SET titolo='$value' WHERE id='$key'";
		$result = mysql_query($q);
		if (!$result) {
			$errore.="<font color='red'>Errore</font> - non è stato possibile eseguire la query \"$q\"<br />";
			$errore.="<p><font color='red'>MySQL Error:</font> " . mysql_error() . "</p>\n";
		}
    }
	$a_genere = array_combine($_POST['id'], $genere);
    foreach ($a_genere as $key => $value) {
		$q = "UPDATE Films SET genere='$value' WHERE id='$key'";
		$result = mysql_query($q);
		if (!$result) {
			$errore.="<font color='red'>Errore</font> - non è stato possibile eseguire la query \"$q\"<br />";
			$errore.="<p><font color='red'>MySQL Error:</font> " . mysql_error() . "</p>\n";
		}
    }

	$a_trama = array_combine($_POST['id'], $trama);
    foreach ($a_trama as $key => $value) {
		$q = "UPDATE Films SET descrizione='$value' WHERE id='$key'";
		$result = mysql_query($q);
		if (!$result) {
			$errore.="<font color='red'>Errore</font> - non è stato possibile eseguire la query \"$q\"<br />";
			$errore.="<p><font color='red'>MySQL Error:</font> " . mysql_error() . "</p>\n";
		}
    }
	
	$a_locandina = array_combine($_POST['id'], $locandina);
    foreach ($a_locandina as $key => $value) {
		$q = "UPDATE Films SET locandina='$value' WHERE id='$key'";
		$result = mysql_query($q);
		if (!$result) {
			$errore.="<font color='red'>Errore</font> - non è stato possibile eseguire la query \"$q\"<br />";
			$errore.="<p><font color='red'>MySQL Error:</font> " . mysql_error() . "</p>\n";
		}
    }
	$a_stream = array_combine($_POST['id'], $stream);
    foreach ($a_stream as $key => $value) {
		$q = "UPDATE Films SET link='$value' WHERE id='$key'";
		$result = mysql_query($q);
		if (!$result) {
			$errore.="<font color='red'>Errore</font> - non è stato possibile eseguire la query \"$q\"<br />";
			$errore.="<p><font color='red'>MySQL Error:</font> " . mysql_error() . "</p>\n";
		}
    }
	if($errore !=""){
		echo $errore;
		exit;
	}
	echo "<br /><font color='green'>Successo</font> - Tutti i campi sono stati modificati correttamente.";
	echo "<br /><button type=\"button\" id=\"btn\" onclick=\"top.location.href = 'itf.php'\" ><img src=\"../../img/video.png\" align=\"absmiddle\" alt=\"Elenco Film\" /> Elenco Film</button>";
}
 
ciao
due consigli
se devi ripetere più volte codice simile sarebbe meglio fare una function simile a questa
PHP:
<?php
function uppa($il_post,$il_genere,$il_campo){
	$a = array_combine($il_post, $il_genere);
    foreach ($a as $key => $value) {
        $q = "UPDATE Films SET $il_campo='$value' WHERE id='$key'";
        $result = mysql_query($q);
        if (!$result) {
            $errore.="<font color='red'>Errore</font> - non è stato possibile eseguire la query \"$q\"<br />";
            $errore.="<p><font color='red'>MySQL Error:</font> " . mysql_error() . "</p>\n";
			return $errore;
        }//potresti mettere anche un esle
		/*
		else{
			return "OK: campo $il_campo aggiornato<br />";
		}
		*/
    } 
}
//..tutti i post
//poi
echo uppa($_POST['id'],$titolo,"titolo");
echo uppa($_POST['id'],$genere,"genere");
echo uppa($_POST['id'],$trama,"descrizione");
echo uppa($_POST['id'],$locandina,"locandina");
echo uppa($_POST['id'],$stream,"link");
//.....
?>
poi, se non ricordo male $_POST['id'] proviene da un input hidden (giusto?), se si controlla almeno che sia un numero intero, se non lo è esci
 
O Borgo grazie per la dritta :)

Direi che non ci sarei riuscito a fare la funzione se non me l'avessi suggerita tu, purtroppo non ho familiarità con queste (è una lacuna lo so u.u).

Ho modificato il codice in questo modo:

PHP:
if(isset($_POST['mod_film'])){

	$titolo = array_map('mysql_real_escape_string', $_POST['titolo']);
	$genere = array_map('mysql_real_escape_string', $_POST['genere']);
	$trama = array_map('mysql_real_escape_string', $_POST['trama']);
	$locandina = array_map('mysql_real_escape_string', $_POST['locandina']);
	$stream = array_map('mysql_real_escape_string', $_POST['stream']);
	
    function uppa($il_post,$il_genere,$il_campo){ 
    $a = array_combine($il_post, $il_genere); 
    foreach ($a as $key => $value) { 
        $q = "UPDATE Films SET $il_campo='$value' WHERE id='$key'"; 
        $result = mysql_query($q); 
        if (!$result) { 
            $errore.="<font color='red'>Errore</font> - non è stato possibile eseguire la query \"$q\"<br />"; 
            $errore.="<p><font color='red'>MySQL Error:</font> " . mysql_error() . "</p>\n"; 
            return $errore; 
        }else{ 
            return "<font color='green'>Successo</font> - Il campo $il_campo è stato aggiornato correttamente.<br />"; 
        }
    }
	}
	
	echo uppa($_POST['id'],$titolo,"titolo"); 
	echo uppa($_POST['id'],$genere,"genere"); 
	echo uppa($_POST['id'],$trama,"descrizione"); 
	echo uppa($_POST['id'],$locandina,"locandina"); 
	echo uppa($_POST['id'],$stream,"link");
	
	echo "<br /><button type=\"button\" id=\"btn\" onclick=\"top.location.href = 'itf.php'\" ><img src=\"../../img/video.png\" align=\"absmiddle\" alt=\"Elenco Film\" /> Elenco Film</button>";
}

La cosa che non funzioni sembra sia il controllo dell'id
ho utilizzato questo codice

PHP:
	foreach ($_POST['id'] as $numero) {
		if (is_int($numero)) {
			echo "$numero è un numero intero";
		} else {
			echo "$numero NON è un numero intero";
		}
	}

Mi restituisce sempre che il numero non è intero anche se a video stampa il numero intero T.T

Ho provato anche ad utilizzare
PHP:
	foreach ($_POST['id'] as $value) {
    echo "is_int(";
    var_export($value);
    echo ") = ";
    var_dump(is_int($value));
	}
Trovta su php ma mi restituisce

21 NON è un numero intero

is_int('21') = bool(false)
 
Ultima modifica:
ciao
php ha il difetto/pregio di fare il cast delle variabili
quindi se provi questo vedi che funziona
PHP:
<?php
$_POST['id'][0]=1;
$_POST['id'][1]="a";
$_POST['id'][2]="2";
    foreach ($_POST['id'] as $numero) {
		if (is_int($numero)) {
            echo "$numero è un numero intero<br>";//vale solo per 1
        } else {
            echo "$numero NON è un numero intero<br>";//gli altri due valori sono stringhe
        }
    }  
?>
e questo è l'output
1 è un numero intero
a NON è un numero intero
2 NON è un numero intero
ma nel tuo caso il $_POST['id'] è del tipo stringa quindi devi forzarlo ad intero, considerando che (es) la stringa "a" viene considerata 0
quindi correggi
PHP:
<?php
$_POST['id'][0]=1;
$_POST['id'][1]="a";
$_POST['id'][2]="2";
    foreach ($_POST['id'] as $numero) {
		$numero=(int)$numero;//forzo ad intero
		if (is_int($numero) && $numero > 0) {//e se è un id DEVE essere maggiore di 0
            echo "$numero è un numero intero<br>";
        } else {
            echo "$numero NON è un numero intero<br>";
        }
    }  
?>
e questo è l'out
1 è un numero intero
0 NON è un numero intero
2 è un numero intero
eventualmente dentro la function metti anche una verifica che l'id esista (select+mysql_num_rows)
se esiste fai l'up altrimenti ritorni errore

p.s.
tutte queste verifiche diventano importanti se le eventuali modifiche le possono fare terzi, se le fai solo tu, volendo, potresti anche evitarle, non credo che tu ti diverta a scombussolare il tuo db
 
In realtà l'id non si può modificare se non dal pannello phpmyadmin. Ergo il valore è sempre lo stesso di quello ricevuto.

La realtà dei fatti è che sono solo io a dover mettere le mani in questo "pannello di controllo". Io nella vita studio giurisprudenza ma ho la passione dell'informatica e mi diletto da autodidatta, quindi ogni volta che vi vengo a rompere le scatole qui è sempre per progetti personali :book:

Tuttavia mi piace prendere in considerazione varie prospettive, quindi renderò modificabile anche l'id (penso di metterlo però come link) xD

Tornando nel merito, ho scoperto ctype_digit che dovrebbe fare al caso mio:
PHP:
foreach ($_POST['id'] as $value) {
    echo "ctype_digit(";
    var_export($value);
    echo ") = ";
    var_dump(ctype_digit($value));
	}

Infatti questa volta mi viene restituito

ctype_digit('1') = bool(true)

Noto però che "5.1.0 Before PHP 5.1.0, this function returned TRUE when text was an empty string."

Quindi il controllo darà errore se la versione di php è inferiore alla 5.1.0

Immagino che per ovviare controllerò se la versione di php che gira è uguale o superiore alla 5.1.0 allora permetto l'utilizzo di tutto l'applicativo, altrimenti esco. Immagino che l'informazione della versione di php la posso recuperare con un semplice phpversion();

Che dici ctype_digit è idoneo e sicuro?
 
Alla fine ho adottato la tua soluzione Borgo. Ovviamente funziona benissimo.
 
Avrei ancora bisogno d'aiuto T.T

Vorrei controllare che ogni campo recuperato quando modifico NON sia vuoto.

Ho fatto così:

PHP:
	function controllo($dati){
		foreach ($dati as $val) {
			if ($val = ""){
				$error = "errore $val </br>";
				if ($error !=""){
					return $error;
					echo "<br /><button type=\"button\" id=\"btn\" onclick=\"top.location.href = 'itf.php'\" ><img src=\"../../img/video.png\" align=\"absmiddle\" alt=\"Elenco Film\" /> Elenco Film</button>";
					exit;
				}
			}
		}
	}
	echo controllo($titolo); 
	echo controllo($genere); 
	echo controllo($trama); 
	echo controllo($locandina); 
	echo controllo($stream);

Solo che i campi me li da in ogni caso pieni....
 
Ho modificato così ma ancora nulla T.T

PHP:
	$titolo = array_map('mysql_real_escape_string', $_POST['titolo']);
	$genere = array_map('mysql_real_escape_string', $_POST['genere']);
	$trama = array_map('mysql_real_escape_string', $_POST['trama']);
	$locandina = array_map('mysql_real_escape_string', $_POST['locandina']);
	$stream = array_map('mysql_real_escape_string', $_POST['stream']);
	
	function controllo($dati){
		$error = "";
		foreach ($dati as $dato) {
			if ($dato == ""){
				$error.="errore $dato </br>";
			}
			if ($error !=""){
				return $error;
				echo "chupa";
				echo "<br /><button type=\"button\" id=\"btn\" onclick=\"top.location.href = 'itf.php'\" ><img src=\"../../img/video.png\" align=\"absmiddle\" alt=\"Elenco Film\" /> Elenco Film</button>";
				exit;
					var_dump($error);
			}
		}
	}
	
	echo controllo($titolo); 
	echo controllo($genere); 
	echo controllo($trama); 
	echo controllo($locandina); 
	echo controllo($stream);
 
ciao
c'è qualcosa che non torna nella function
PHP:
<?php
function controllo($dati){
	foreach ($dati as $val) {
		if ($val = ""){
			$error = "errore $val </br>";
			if ($error !=""){
				return $error;
				//le istruzioni seguenti NON vengono eseguite perche il return interrompe l'esecuzione
				echo "<br /><button type=\"button\" id=\"btn\" onclick=\"top.location.href = 'itf.php'\" ><img src=\"../../img/video.png\" align=\"absmiddle\" alt=\"Elenco Film\" /> Elenco Film</button>";
				//exit;//questa non serve 
			}
		}
	}
}
    echo controllo($titolo); 
    echo controllo($genere); 
    echo controllo($trama); 
    echo controllo($locandina); 
    echo controllo($stream); 
?>
prova così (al massimo non funzia)
PHP:
<?php
function controllo($dati){
	$dati=array_map("trim", $dati); //elimini eventuali caratteri es spazio
	foreach ($dati as $val) {
		if ($val = ""){
			$error = "errore $val </br>";
			$error.= "<br /><button type=\"button\" id=\"btn\" onclick=\"top.location.href = 'itf.php'\" ><img src=\"../../img/video.png\" align=\"absmiddle\" alt=\"Elenco Film\" /> Elenco Film</button>";
			if ($error !=""){
				return $error;
			}
		}
	}
}
    echo controllo($titolo); 
    echo controllo($genere); 
    echo controllo($trama); 
    echo controllo($locandina); 
    echo controllo($stream); 
?>
 

Discussioni simili