Befejezetlen form közbe kilépés az oldalról
2017-04-23T07:27:15+02:00
2017-04-23T10:52:03+02:00
2022-08-10T15:20:31+02:00
Pécsi Attila
Sziasztok!
Először is  elnézést ha nem fogalmaztam meg jól a témát , de igazából azt se tudom , hogy hogyan keressek rá.

Lenne egy üzent küldő  form amiben van egy bootstrap fileinput  képfeltöltő

<form method="post" class="" action="send_msg.php?act=uzenet" enctype="multipart/form-data"> <div id="error"></div> <?=$user["nev"]?> Részére üzeneted tartalma <div class="col-sm-9"><input type="text" name="tema" value="" placeholder="Üzent témája" class="form-control"></div> <div class="col-sm-12"><hr></div> <div class="col-sm-12"> <h3> Üzeneted:</h3> <textarea class="walltext form-control" id="watermark" name="uzenet" > </textarea> </div> <input type="hidden" name="felado" value="<?=$felado?>"> <input type="hidden" name="cimzet" value="<?=$cimzet?>"> <input type="hidden" name="act" value="uzenet"> <div class="col-sm-12"><hr></div> <div class=" col-sm-12" data-provides="fileinput">Kép hozzáadása <input id="input-711" name="images[]" type="file" multiple class="file-loading"> <script> var $input = $("#input-711"); $input.fileinput({ uploadUrl: "upload.php", // server upload action showBrowse: false, showCaption: false, uploadAsync: false, maxFileSize: 20000, resizeImage: true, msgFilesTooLess: 'File "{name}" (<b>{size} KB</b>) exceeds maximum allowed upload size of <b>{maxFileSize} KB</b>.', allowedFileExtensions: ['jpeg', 'jpg', 'gif','png'], dropZoneTitle: 'Húzd ide a feltölteni kívánt fájlokat &hellip;', dropZoneClickTitle: '<br>(vagy kattints ide és tallózd be)', msgFilesTooMany: 'Összesen <b>({n})</b> fájlt vállasztottál feltöltésre ! Engedélyezett fájlok száma <b>{m}</b>.', browseOnZoneClick: true, showUpload: false, // hide upload button showRemove: false, // hide remove button minFileCount: 1, maxFileCount: 4 }).on("filebatchselected", function(event, files) { // trigger upload method immediately after files are selected $input.fileinput("upload"); }); </script> </div> <div class="modal-footer"> <button type="button" class="btn btn-white" data-dismiss="modal">Mégse</button> <button id="toggleSpinners" class="ladda-button ladda-button-demo btn btn-primary" data-style="zoom-in" type="submit">Küldés</button> </form>




Ez   a típus a kép betallózásával fel is tölti azt és  az adatbázisba is kreál hozzá egy elérést .




upload.php

<?php require_once("funkcio/mag.php"); adatbazis(); get_stilus(); function save_data($uid="", $name="",$link, $next){ $query="INSERT INTO users_images( uid, user_nev, kep, act, next_id) VALUES ('".$uid."','".$name."','".$link."', 'msg','msg-".$next."' )"; add_db($query); } global $CURUSER; // upload.php // 'images' refers to your file input name attribute if (empty($_FILES['images'])) { echo json_encode(['error'=>'No files found for upload.']); // or you can throw an exception return; // terminate } // get the files posted $images = $_FILES['images']; // get user id posted $userid = empty($_POST['userid']) ? '' : $_POST['userid']; // get user name posted $username = empty($_POST['username']) ? '' : $_POST['username']; // a flag to see if everything is ok $success = null; // file paths to store $paths= []; // get file names $filenames = $images['name']; $resultr = db(" SHOW TABLE STATUS LIKE 'uzenetek'"); $data2 = $resultr->fetch_assoc(); $next_increment = $data2['Auto_increment']; // loop and process files for($i=0; $i < count($filenames); $i++){ $ext = explode('.', basename($filenames[$i])); $target = "uploads" . DIRECTORY_SEPARATOR . md5(uniqid()) . "." . array_pop($ext); if(move_uploaded_file($images['tmp_name'][$i], $target)) { $success = true; save_data($CURUSER["uid"], $CURUSER["nev"], $target, $next_increment ); $paths[] = $target; } else { $success = false; break; } } // check and process based on successful status if ($success === true) { // call the function to save all data to database // code for the following function `save_data` is not // mentioned in this example // store a successful response (default at least an empty array). You // could return any additional response info you need to the plugin for // advanced implementations. $output = []; // for example you can get the list of files uploaded this way // $output = ['uploaded' => $paths]; } elseif ($success === false) { $output = ['error'=>'Error while uploading images. Contact the system administrator']; // delete any uploaded files foreach ($paths as $file) { unlink($file); } } else { $output = ['error'=>'No files were processed.']; } // return a json encoded response for plugin to process successfully echo json_encode($output); ?>

 

 az uzenet kovetkező  azonosítóját használja arra , hogy megjelenjen az üzentbe.



A problémám az : Ha a felhasználó nem küldi el a formot  és egyszerűen csak kilép belőle.  a képek ott maradnak  és az adatbázisba is ott maradnak , így a következő üzentbe megfognak jelenni . mert hát a soron következő id  lessz az amit nem használtak fel amikor a képet feltöltötték :/.


Azt szeretném  megoldani , ha  a felhasználó kilép bármilyen módon a formból akkor ezek a képek és adatok törlődjenk . Ebbe szeretném kérni a segítségeteket.



Bocsánat ha már ez a téma létezik , de   akkor én vagyok béna , hogy nem találtam.
Mutasd a teljes hozzászólást!
Szerintem az semmiképp nem jó, hogy a következő ID-t használod erre - egyszerre ha több felhasználó is kitölti az űrlapot, akkor összekeverednek képek (egy felhasználó kapja meg az összes képet, a többi felhasználó meg semmit nem kap).

Ehelyett inkább generálnék egy tokent amit az űrlappal együtt küldenék és a fájlfeltöltésnél is ez lenne (ha a felhasználó elküldi az űrlapot de az nem érvényes, akkor az elküldött tokent használná és nem generálna újat):

$token = md5(uniqid()); .... <form ...> ... <input type="hidden" name="token" value="<?=$token?>"> ... </form> .... $input.fileinput({ ... uploadExtraData: { token: '<?=$token?>' } ... });
majd a users_images táblába a külső kulcson kívül lenne egy token is - feltöltésnél a tokennel kerülnének be a képek a táblába. Vagyis így nézne ki pl.:

uid | user_nev | kep | act | next_id | token | ----+----------+-------+-----+---------+----------------------------------+- 1 | valami | a.jpg | msg | msg-1 | NULL | 1 | valami | b.jpg | msg | msg-1 | NULL | 1 | valami | c.jpg | msg | msg-1 | NULL | 2 | valami2 | f.jpg | msg | NULL | da717b4422e251a59407039ea4634020 | 2 | valami2 | h.png | msg | NULL | da717b4422e251a59407039ea4634020 | 2 | valami2 | x.jpg | msg | NULL | da717b4422e251a59407039ea4634020 | 2 | valami2 | o.jpg | msg | NULL | da717b4422e251a59407039ea4634020 |
Amikor a felhasználó elküldi az űrlapot és az érvényes is, akkor beszúrod a következő sort az uzenetek táblába, így már tudod az ID-t - erre kell cserélni azokat a sorokat ahol a token=$token - így véglegesítve a feltöltést:

UPDATE users_images SET next_id = 'msg-$id', token = NULL WHERE token = '$token';
A fenti táblába rakhatsz egy datetime mezőt is - ez alapján tudod törölni a félkész feltöltéseket - pl. törlöd az azokat a sorokat + fájlokat ahol csak token van és a feltöltés ideje nagyobb mint 1 nap.
Mutasd a teljes hozzászólást!

  • Ne submit-et használj, hanem type="button"-t és csak ellenőrzés után küld el JS-el a formot...
    Miért raksz minen-t (js-kód) bele a form-ba, így kissé átláthatatlan?
    Ha valamit félreértek, akkor viszont
    Megj: Egy küldés legyen (vizsgálat után és esetleg feltételekkel -> ha nincs kiválasztva kép ne menjen az azonosító) és abban legyen a fileinput, az azonosító, azaz minden és ha nem küldi el, akkor semmo sem kerül az adatbázisba...
    Mutasd a teljes hozzászólást!
  • Szerintem az semmiképp nem jó, hogy a következő ID-t használod erre - egyszerre ha több felhasználó is kitölti az űrlapot, akkor összekeverednek képek (egy felhasználó kapja meg az összes képet, a többi felhasználó meg semmit nem kap).

    Ehelyett inkább generálnék egy tokent amit az űrlappal együtt küldenék és a fájlfeltöltésnél is ez lenne (ha a felhasználó elküldi az űrlapot de az nem érvényes, akkor az elküldött tokent használná és nem generálna újat):

    $token = md5(uniqid()); .... <form ...> ... <input type="hidden" name="token" value="<?=$token?>"> ... </form> .... $input.fileinput({ ... uploadExtraData: { token: '<?=$token?>' } ... });
    majd a users_images táblába a külső kulcson kívül lenne egy token is - feltöltésnél a tokennel kerülnének be a képek a táblába. Vagyis így nézne ki pl.:

    uid | user_nev | kep | act | next_id | token | ----+----------+-------+-----+---------+----------------------------------+- 1 | valami | a.jpg | msg | msg-1 | NULL | 1 | valami | b.jpg | msg | msg-1 | NULL | 1 | valami | c.jpg | msg | msg-1 | NULL | 2 | valami2 | f.jpg | msg | NULL | da717b4422e251a59407039ea4634020 | 2 | valami2 | h.png | msg | NULL | da717b4422e251a59407039ea4634020 | 2 | valami2 | x.jpg | msg | NULL | da717b4422e251a59407039ea4634020 | 2 | valami2 | o.jpg | msg | NULL | da717b4422e251a59407039ea4634020 |
    Amikor a felhasználó elküldi az űrlapot és az érvényes is, akkor beszúrod a következő sort az uzenetek táblába, így már tudod az ID-t - erre kell cserélni azokat a sorokat ahol a token=$token - így véglegesítve a feltöltést:

    UPDATE users_images SET next_id = 'msg-$id', token = NULL WHERE token = '$token';
    A fenti táblába rakhatsz egy datetime mezőt is - ez alapján tudod törölni a félkész feltöltéseket - pl. törlöd az azokat a sorokat + fájlokat ahol csak token van és a feltöltés ideje nagyobb mint 1 nap.
    Mutasd a teljes hozzászólást!
  • Kicsit   gondolkodtam közbe és megoldottam  a kérdést, mondjuk  kicsit összetett módon  Én lefoglaltam a következő id t  a félkész üzenet részére... csak  adtam neki egy   "tokent".
    Ha tölt fel képeket és kilép akkor az üzenet ott marad üressen  cimzet=0  (tehát senki se kapta meg csak ott áll üresen) . Amikor újra üzenetet akar küldeni  megtalálja ezt az elküldetlen üzenetet és törli a képeket és kezdheti előröl az elmentett azonosítóval az üzenet küldést  akár képekkel akár képek nélkül . a submit gomb lenyomásával  updatet csinál a lefoglalt táblán és beírja az üzenetet a címzett  és minden szükséges adatot .


    De az id foglalásba igazad lehet és így tényleg jobb  5 let egy  token


    Köszönöm
    Mutasd a teljes hozzászólást!
    Csatolt állomány
abcd