• Bannato User Attivo

    Problema di concorrenza DB

    Salve a tutti,

    sto realizzando uno spazio di image hosting tutto italiano, ma non riesco bene a gestire la concorrenza simultanea al DB. La mia idea è quella di avere una tabella con un solo campo 'num' autoincrement nel quale inserisco un record ogni qual volta un utente inserisce un immagine, questo per fare in modo che le immagini hanno tutte nome del tipo "Immagine_$num" ovvero: Immagine_1, Immagine_2, e cosi via.

    Oggi ho provato a caricare due file quasi contemporaneamente con due finestre aperte del browser. Il risultato è che un'immagine è stata caricata correttamente e l'altra mi ha dato la scritta "ERRORE".

    Il codice php ancora sporco e non finito è questo:

    [PHP]<?php

    include("connection.php"); 
     
    $query = "SELECT num FROM iup ORDER BY num DESC LIMIT 0,1"; 
    $result = @mysql_query($query) or die("ERRORE"); 
     
    while ($row = mysql_fetch_row($result)){ 
        $num = $row[0]; 
        $num = $num + 1; 
        $query = "INSERT INTO iup (num) VALUES ('$num')"; 
        mysql_query($query); 
    } 
     
     
         
    $nome_immagine = "immagine_".$num.".jpg"; 
    $nome_immagine_thumb = "immagine_".$num."_thumb.jpg"; 
    

    do{
    if (is_uploaded_file($_FILES['image']['tmp_name'])) {
    if ($_FILES['image'] > 800432) { //Controllo sul peso dell'immagine
    $msg = "<p>Il file non deve superare i 800 KB!!</p>";
    break;
    }
    // Ottengo alcune informazioni sull'immagine
    list($width, $height, $type, $attr) = getimagesize($_FILES['image']['tmp_name']);

        //Controllo che l'immagine sia GIF, JPG o PNG 
        if (($type!=1) && ($type!=2) && ($type!=3)) { 
             $msg = "<p>Formato non corretto!!</p>"; 
             break; 
           } 
         
        if (file_exists('upload_img/'.$nome_immagine)) { 
              $msg = "<p>File già esistente sul server. Rinominarlo e riprovare.</p>"; 
              break; 
        } 
         
        if (!move_uploaded_file($_FILES['image']['tmp_name'], 'upload_img/'.$nome_immagine)) { 
              $msg = "<p>Errore nel caricamento dell'immagine!!</p>"; 
              break; 
        } 
    } 
    

    }while(false);

    echo $msg;

    //Spazio riservato alla creazione del thumb
    $src="upload_img/".$nome_immagine;
    header("Content-type: image/png");
    $w=300;
    $h=300;
    $size = getimagesize($src);
    if( $size[2] == 2 ){$im = @imagecreatefromjpeg($src);}
    elseif( $size[2] == 1 ){$im = @imagecreatefromgif($src);}
    elseif( $size[2] == 3 ){$im = @imagecreatefrompng($src);}

    $newwidth = $size[0];
    $newheight = $size[1];

    if( $newwidth > $w ){
    $newheight = ($w / $newwidth) * $newheight;
    $newwidth = $w;
    }
    if( $newheight > $h ){
    $newwidth = ($h / $newheight) * $newwidth;
    $newheight = $h;
    }

    $new = imagecreatetruecolor($newwidth, $newheight); 
    imagecopyresampled($new, $im, 0, 0, 0, 0, $newwidth, $newheight, $size[0], $size[1]); 
    

    header('Content-Type: ' . $size['mime']);
    if( $size[2] == 2 ){@imagejpeg($new, '', 100);}
    elseif( $size[2] == 1 ){@imagegif($new);}
    elseif( $size[2] == 3 ){@imagepng($new);}
    if (!move_uploaded_file($new, 'upload_img/'.$nome_immagine_thumb)) {
    $msg = "<p>Errore nel caricamento dell'immagine!!</p>";
    break;
    }
    @imagedestroy($im);
    @imagedestroy($new);
    ?>[/PHP]

    Praticamente mi è comparo l'errore della echo presente qui: $result = @mysql_query($query) or die("ERRORE");

    Come devo risolvere?


  • Super User

    ciao,

    prima di agire sul database memorizzando dei dati verifica che sia arrivato il file e che questo sia corretto.
    Se il file è arrivato, il formato è corretto la dimensione etc etc etc allora estrai dal db il primo numero disponibile e lo assegni al file mentre lo sposti.

    in questo modo non dovresti avere problemi.