PDA

Visualizza la versione completa : INSERT/Update form multiriga


Kassandraxxx
12-07-2020, 20:41
Salve

Sto cercando di realizzare un form dove attraverso un pulsante add si possono inserire pi� righe per poi fare l'inserimento multiplo di ci� che si � inserito e devo avere la possibilit� di andare ad aggiornare i campi gi� presenti nel db.

Questo � il codice che ho fatto fino ad ora, riesco ad aggiungere un singolo record, ma mi da errore sull'inserimento multiplo e se voglio fare l'update funziona solo sull'ultimo campo inserito, mentre dovrei poter modificare tutti i campi dei vari record.



function datazione() {
global $conn;
$id = $_GET['id'];
$out='<table id="data" class="table display">';
$out.='<thead>';
$out.='<tr><th>Generica</th><th>Specifica</th><th>Da</th><th>Secolo</th><th>A</th><th>Secolo</th><th>Descrizione</th><th>Definizione</th></tr>';
$out.='</thead>';
$out.='<tbody>';
$sql = 'SELECT *, secoli1.secolo AS data_in, secoli2.secolo AS data_fin, prefisso1.pref AS pref_in, prefisso2.pref AS pref_fin, datazione.id AS iddata FROM datazione ';
$sql .= 'INNER JOIN siti_archeo ON datazione.id_sito = siti_archeo.id ';
$sql .= 'INNER JOIN data_gen ON datazione.id_data_gen = data_gen.id ';
$sql .= 'INNER JOIN data_spec ON datazione.id_data_spe = data_spec.id ';
$sql .= 'INNER JOIN prefisso AS prefisso1 ON datazione.id_pref1 = prefisso1.id ';
$sql .= 'INNER JOIN prefisso AS prefisso2 ON datazione.id_pref2 = prefisso2.id ';
$sql .= 'INNER JOIN secoli AS secoli1 ON datazione.id_sec_in = secoli1.id ';
$sql .= 'INNER JOIN secoli AS secoli2 ON datazione.id_sec_fin = secoli2.id ';
$sql .= 'INNER JOIN ogtd ON datazione.id_ogtd = ogtd.id ';
$sql .= 'INNER JOIN ogtt ON datazione.id_ogtt = ogtt.id ';
$sql .= 'WHERE datazione.id_sito = '.$id.' ORDER BY iddata ASC';
$stmt = $conn->prepare($sql);
$stmt->execute();
$out.='<form name="info_datazione" action="?azione=salva_datazione" method="post" enctype="multipart/form-data">';
$out.='<input type="hidden" id="id" name="id" value="'.$id.'">';
$out.='<input type="hidden" id="azione" name="azione" value="salva_datazione">';
while($row = $stmt->fetch(PDO::FETCH_ASSOC)){
$out.='<input type="hidden" id="iddata" name="iddata" value="'.$row['iddata'].'">';
$out.='<tr>';
$out.='<td>'.$row['iddata'].'</td>';
$out.='<td><select id="data_gen" name="data_gen">
<option value="'.$row['id_data_gen'].'" selected="selected">'.$row['n_data_gen'].'</option>
'.data_gen ().'
</select> </td>';
$out.='<td><select id="data_spec" name="data_spec">
<option value="'.$row['id_data_spe'].'" selected="selected">'.$row['n_data_spec'].'</option>
'.data_spec ().'
</select> </td>';
$out.='<td><select id="pref" name="pref">
<option value="'.$row['id_pref1'].'" selected="selected">'.$row['pref_in'].'</option>
'.prefisso ().'
</select> </td>';
$out.='<td><select id="secolo" name="secolo">
<option value="'.$row['id_sec_in'].'" selected="selected">'.$row['data_in'].'</option>
'.secoli ().'
</select> </td>';
$out.='<td><select id="pref_a" name="pref_a">
<option value="'.$row['id_pref2'].'" selected="selected">'.$row['pref_fin'].'</option>
'.prefisso ().'
</select> </td>';
$out.='<td><select id="secolo_a" name="secolo_a">
<option value="'.$row['id_sec_fin'].'" selected="selected">'.$row['data_fin'].'</option>
'.secoli ().'
</select> </td>';
$out.='<td><select id="ogtd" name="ogtd">
<option value="'.$row['id_ogtd'].'" selected="selected">'.$row['nome_ogtd'].'</option>
'.ogtd ().'
</select> </td>';
$out.='<td><select id="ogtt" name="ogtt">
<option value="'.$row['id_ogtt'].'" selected="selected">'.$row['nome_ogtt'].'</option>
'.ogtt ().'
</select> </td>';
$out.='</tr>';
}
$out.='</tbody>';
$out.='</table>';
$out.='<div class="col-md-12 col-xs-12">';
$out.='<div class="col-md-6 col-xs-12"><input name="sub" type="submit" value="Salva cronologia"/> </div>';
$out.='<div class="col-md-6 col-xs-12"><input type="button" id="addnew" name="addnew" value="Aggiungi cronologia" /><input type="hidden" id="items" name="items" value="1" /> </div> ';
$out.='</div>';
$out.='</form>';
return($out);
}


e l'action salva

function salva_datazione() {
global $conn;
$iddata = $_POST['iddata'];
$id = $_POST['id'];
$items = $_POST['items'];
for($r = 1; $r < $items; $r++) {
$data_gen = $_POST['data_gen'.$r];
$data_spec = $_POST['data_spec'.$r];
$pref = $_POST['pref'.$r];
$secolo = $_POST['secolo'.$r];
$pref_a = $_POST['pref_a'.$r];
$secolo_a = $_POST['secolo_a'.$r];
$ogtd = $_POST['ogtd'.$r];
$ogtt = $_POST['ogtt'.$r];
$sql = 'INSERT INTO datazione (id_sito, id_data_gen, id_data_spe, id_pref1, id_sec_in, id_pref2, id_sec_fin, id_ogtd, id_ogtt) VALUES('.$id.', '.$data_gen.', '.$data_spec.', '.$pref.', '.$secolo.', '.$pref_a.', '.$secolo_a.', '.$ogtd.', '.$ogtt.') ';
$stmt = $conn->prepare($sql);
$stmt->execute();
}
if ($iddata == $iddata ){
$data_gen = $_POST['data_gen'];
$data_spec = $_POST['data_spec'];
$pref = $_POST['pref'];
$secolo = $_POST['secolo'];
$pref_a = $_POST['pref_a'];
$secolo_a = $_POST['secolo_a'];
$ogtd = $_POST['ogtd'];
$ogtt = $_POST['ogtt'];
$sql='UPDATE datazione SET id_sito=:id, id_data_gen =:data_gen, id_data_spe =:data_spec, id_pref1 =:pref, id_sec_in =:secolo, id_pref2 =:pref_a, id_sec_fin =:secolo_a, id_ogtd =:ogtd, id_ogtt =:ogtt';
$sql .=' WHERE datazione.id=:iddata ';
$stmt = $conn->prepare($sql);
$stmt->bindParam(':iddata',$iddata,PDO::PARAM_INT);
$stmt->bindParam(':id',$id,PDO::PARAM_INT);
$stmt->bindParam(':data_gen',$data_gen,PDO::PARAM_INT);
$stmt->bindParam(':data_spec',$data_spec,PDO::PARAM_INT);
$stmt->bindParam(':pref', $pref, PDO::PARAM_INT);
$stmt->bindParam(':secolo', $secolo, PDO::PARAM_INT);
$stmt->bindParam(':pref_a', $pref_a, PDO::PARAM_INT);
$stmt->bindParam(':secolo_a', $secolo_a, PDO::PARAM_INT);
$stmt->bindParam(':ogtd', $ogtd, PDO::PARAM_INT);
$stmt->bindParam(':ogtt', $ogtt, PDO::PARAM_INT);
$stmt->execute();

}
}

questo � il javascript per aggiungere pi� righe al form


<script type="text/javascript">
//<![CDATA[
$(document).ready(function() {
var currentItem = 1;
$('#addnew').click(function(){
currentItem++;
$('#items').val(currentItem);
var strToAdd = '<?php echo '<tr><td><select id="data_gen'.item().'" name="data_gen'.item().'"><option value="" selected="selected"></option>'.data_gen ().'</select></td><td><select id="data_spec'.item().'" name="data_spec'.item().'"><option value="" selected="selected"></option>'.data_spec ().'</select></td><td><select id="pref'.item().'" name="pref'.item().'"><option value="" selected="selected"></option>'.prefisso ().'</select></td><td><select id="secolo'.item().'" name="secolo'.item().'"><option value="" selected="selected"></option>'.secoli ().'</select></td><td><select id="pref_a'.item().'" name="pref_a'.item().'"><option value="" selected="selected"></option>'.prefisso ().'</select></td><td><select id="secolo_a'.item().'" name="secolo_a'.item().'"><option value="" selected="selected"></option>'.secoli ().'</select></td><td><select id="ogtd'.item().'" name="ogtd'.item().'"><option value="" selected="selected"></option>'.ogtd ().'</select></td><td><select id="ogtt'.item().'" name="ogtt'.item().'"><option value="" selected="selected"></option>'.ogtt ().'</select></td></tr>'?>';
$('#data').append(strToAdd);

});
});

//]]>
</script>

In questo modo quando aggiungo una riga e compilo il form e salvo mi salva il dato nel db, non funziona per� l'inserimento multiplo. E per quanto riguarda l'aggiornamento mi aggiorna solo l'ultimo campo inserito


Per l'azione di salvataggio ho provato anche cosi, ma non funziona proprio



function salva_datazione() {
global $conn;
$id = $_POST['id'];
$iddata = $_POST['iddata'];
$data_gen = $_POST['data_gen'];
$data_spec = $_POST['data_spec'];
$pref = $_POST['pref'];
$secolo = $_POST['secolo'];
$pref_a = $_POST['pref_a'];
$secolo_a = $_POST['secolo_a'];
$ogtd = $_POST['ogtd'];
$ogtt = $_POST['ogtt'];
$sql = 'INSERT INTO datazione (id, id_sito, id_data_gen, id_data_spe, id_pref1, id_sec_in, id_pref2, id_sec_fin, id_ogtd, id_ogtt) VALUES(:iddata, :id, :data_gen, :data_spec, :pref, :secolo, :pref_a, :secolo_a, :ogtd, :ogtt)
ON CONFLICT (id) DO UPDATE SET id_sito=:id, id_data_gen =:data_gen, id_data_spe =:data_spec, id_pref1 =:pref, id_sec_in =:secolo, id_pref2 =:pref_a, id_sec_fin =:secolo_a, id_ogtd =:ogtd, id_ogtt =:ogtt';
$stmt = $conn->prepare($sql);
$stmt->bindParam(':iddata',$iddata,PDO::PARAM_INT);
$stmt->bindParam(':id',$id,PDO::PARAM_INT);
$stmt->bindParam(':data_gen',$data_gen,PDO::PARAM_INT);
$stmt->bindParam(':data_spec',$data_spec,PDO::PARAM_INT);
$stmt->bindParam(':pref', $pref, PDO::PARAM_INT);
$stmt->bindParam(':secolo', $secolo, PDO::PARAM_INT);
$stmt->bindParam(':pref_a', $pref_a, PDO::PARAM_INT);
$stmt->bindParam(':secolo_a', $secolo_a, PDO::PARAM_INT);
$stmt->bindParam(':ogtd', $ogtd, PDO::PARAM_INT);
$stmt->bindParam(':ogtt', $ogtt, PDO::PARAM_INT);
$stmt->execute();
}

boots
14-07-2020, 08:49
Quasi sicuramente sbagli con i nomi degli input. Io farei cos:


function datazone(){
...
$sql = ..
...
while($row = ...) {
...
<select name="update[<?php echo $row['iddata'] ?>]['data_gen']" id="data_gen">
<option>...</option>
...
</select>

<select name="update[<?php echo $row['iddata'] ?>]['data_spec']" id="data_spec">
<option>...</option>
...
</select>
...
}
}


Nuovo item:

...
var currentItem = 0;
$('#addnew').click(function(){
currentItem++;
var row = '<tr><td><select id=... name=\'insert[' +currentItem + '][data_gen]\' ><option> .... ';
$('#data').append(row);
}

Salvataggio:


...
foreach($_POST['update'] as $id => $values){
$sql = 'UPDATE datazione set data_ge = :data_gen, .... WHERE iddat = :iddata ';
...
$stmt->bindParam(':iddata', $id, PDO::PARAM_INT);
$stmt->bindParam(':data_gen', $values['data_gen'], PDO::PARAM_INT);
...
}

foreach($_POST['insert'] as $values){
$sql = 'INSERT INTO datazione(id, ...) VALUES (:data_gen, .... )';
...
$stmt->bindParam(':data_gen', $values['data_gen'], PDO::PARAM_INT);
...
}

PS: Non ho capito come mai i dati tipo data_gen, li prendi da una join ma poi li salvi sulla tabella

Loading