Archivi tag: php

PHP: lock delle tabelle e restituzione dell’ID relativo all’ultimo record inserito

Durante la realizzazione di un portale multiutente, ho riscontrato la necessità di ricavare l’ID dell’ultimo record inserito, in modo da salvarlo all’interno di un’altra tabella. Essendo però, come già detto, un portale multiutente, ho deciso di evitare eventuali comportamenti “imprevisti” semplicemente effettuando un LOCK/UNLOCK delle tabelle interessate. Nella fattispecie ecco il codice PHP:

$lock = $mysqli->query("LOCK TABLE cartaimbarco WRITE");

$insert = $mysqli->query("INSERT INTO cartaimbarco (DataPartenza, Prezzo) VALUES ('$datapartenza', '$prezzo')");

$idcarta = $mysqli -> insert_id;

$unlock = $mysqli->query("UNLOCK TABLES");

Per prima cosa “blocco” la tabella “cartaimbarco” in scrittura. Successivamente inserisco all’interno di tale tabella un record e ne ricavo l’ID utilizzando $mysqli -> insert_id; (come potete notare sto utilizzando il paradigma ad oggetti e non quello procedurale). L’equivalente nel paradigma procedurale di tale chiamata è la funzione mysql_insert_id().

Dopo aver ricavato l’ID del record “sblocco” le tabelle.

Ma perchè si rende necessario il LOCK/UNLOCK delle tabelle? Semplicemente perchè un altro utente potrebbe inserire un record immediatamente prima dell’istruzione $mysqli -> insert_id, la quale ci restituirà (erroneamente) l’ID del record inserito dall’altro utente (e non l’ID del record da noi inserito).

Spero di essere stato esauriente. A presto.

NB: $mysqli -> insert_id; restituirà 0 nel caso in cui L’ID non sia un campo AUTO_INCREMENT.

PHP: gestione delle date

Qui di seguito riporto uno stralcio di codice PHP che permette di verificare la validità della data e dell’ora inserita in un apposito campo di input testuale. Per la precisione tale codice può essere utilizzato nell’ambito dell’invio posticipato degli SMS. Se la data è futura o uguale a quella odierna e l’ora è strettamente maggiore di quella attuale, l’SMS può essere salvato nel database in attesa dell’invio programmato.

if(isset($_POST['data']) && $_POST['data'] != '' && $_POST['data'] != 'Data')
{
$data = $_POST['data'];
if(preg_match('/^[0-9]{2}-{1}[0-9]{2}-{1}[0-9]{4}$/', $data) && strlen($data) <= 10) //il backslash (da inserire prima dei "-") è il carattere di escape da usare poichè il "-" ha un significato anche nell'ambito dell'espressione regolare. Controllo inoltre (lato server) che la data inserita non sia costituita da più di 10 caratteri
{
$data1=explode("-",$data); //ricavo il giorno, il mese e l'anno usando il "-" come separatore

$giorno = $data1[0];
$mese = $data1[1];
$anno = $data1[2];
if (@checkdate($mese, $giorno, $anno) == TRUE) //nel caso in cui non è vera la condizione, devo silenziare l'errore restituito da checkdate (misura necessaria per contrastare eventuali attacchi basati sul blind SQL Injection
{ //se la data è corretta controllo l'ora
if(isset($_POST['ora']) && $_POST['ora'] != '' && $_POST['ora'] != 'Ora')
{
$ora = $_POST['ora'];
if(preg_match('/^[0-9]{2}:{1}[0-9]{2}:{1}[0-9]{2}/', $ora) && strlen($ora) <= 8)
{
$ora1=explode(":",$ora);
//con il casting converto la stringa in intero
$ore = (int) $ora1[0];
$minuti = (int) $ora1[1];
$secondi = (int) $ora1[2];
if ($ore <= 24 && $ore >= 00 && $minuti <= 59 && $minuti >= 00 && $secondi <= 59 && $secondi >= 00) //nel caso in cui non è vera la condizione, devo silenziare l'errore restituito da checkdate
{
$time = mktime($ore,$minuti,$secondi,$mese,$giorno,$anno);
if($time > time()) //se la data è futura
{
$datatotale = $anno . "-" . $mese . "-" . $giorno . " " . $ore . ":" . $minuti . ":" . $secondi;
}
}
else
{
$errore = 'Ora non valida';
}
}
else
{
$errore = 'Formato ora non valido';
}
}
else
{
$errore = "Devi scegliere l'ora in cui inviare il messaggio";
}
}
else
{
$errore = 'Data non valida';
}
}
else
{
$errore = 'Formato data non valido';
}
}
else
{   
$timestamp = time(); //se non è stata settata alcuna data utilizzo il timestamp attuale
$datatotale = date("Y-m-d H:i:s", $timestamp);
}

Il codice è ampiamente commentato. Per ulteriori chiarimenti non esitate a contattarmi. A presto.

PHP e Javascript: somma automatica su campi generati dinamicamente

Recentemente mi è capitato di dover calcolare automaticamente la somma dei valori contenuti all’interno di campi di input generati dinamicamente. Per fare ciò mi sono servito di un pò di codice Javascrip intervallato a codice PHP. Eccone uno stralcio:

<?php if(isset($count))
{
?>
function startCalc(){
interval = setInterval("calc()",1);
}
function calc(){
var array = new Array(<?php echo $count ?>);
var sum = 0;
<?php
for($i=1; $i<=$count; $i++)
{
?>
var valore<?php echo $i ?> = document.tariffe.subtotaletariffa<?php echo $i ?>.value;
<?php
}
for($i=1; $i<=$count; $i++)
{
?>
array[<?php echo $i ?>] = (valore<?php echo $i ?> * 1);
sum += array[<?php echo $i ?>];
<?php
}
?>
document.tariffe.totale.value = Math.round(sum*100)/100; <!--arrotondo alla seconda cifra decimale -->
}
function stopCalc(){
clearInterval(interval);
}

Per prima cosa memorizzo all’interno della variabile $count il numero di campi di input da stampare a video. Successivamente dichiaro un array dimensionato proprio in base a $count. Non mi resta quindi che calcolare la somma dei valori contenuti nei vari campi di input e successivamente reindirizzarli all’interno del campo “totale”. Il codice HTML (intervallato ad altro codice PHP) è il seguente:

<?php
if(isset($_POST['continua']));
{
$i = 1;
$j = 1;
while(@$riga = $risultato_tariffe->fetch_assoc())
{
?>
<label for="tariffa<?php echo $i?>">
<select name="tariffa<?php echo $i?>" tabindex="<?php echo $j?>" id="tariffa"> Tariffa: (*)    
<option><?php echo $riga['Nome']?></option>
</select>
</label>
<label for="numpastariffa<?php echo $i?>">
<input type="text" name="numpastariffa<?php echo $i?>" tabindex="<?php echo $j+1?>" id="numpastariffa<?php echo $i?>" onFocus="startCalc2();" onBlur="stopCalc2();" />numero passeggeri per tariffa: (*)
</label>
<label for="importo<?php echo $i?>">
<input type="text" name="importo<?php echo $i?>" tabindex="<?php echo $j+2?>" id="importo<?php echo $i?>" onFocus="startCalc3();" onBlur="stopCalc3();" />importo: (*)
</label>
<label for="subtotaletariffa<?php echo $i?>">
<input type="text" name="subtotaletariffa<?php echo $i?>" tabindex="<?php $j=$j+3; echo $j?>" id="subtotaletariffa<?php echo $i?>" onFocus="startCalc();" onBlur="stopCalc();" />subtotale tariffa: (*)
</label>
<?php
$i++;
$j++;
}
$risultato_tariffe->);
}
?>

dove la variabile $i viene utilizzata per assegnare il nome ai vari campi, mentre $j è una semplice variabile di appoggio utilizzata nell’ambito dei tabindex. Per uteriori chiarimenti contattatemi. A presto.