insert in bd link-ul pentru fisierul uploadat

Discutii despre script-uri si coduri PHP-MySQL, precum si lucru cu XML in PHP.
sterica
Mesaje: 285

insert in bd link-ul pentru fisierul uploadat

Salutare,
Vreau sa introduc intr-o tabela link-ul fisierului uploadat, ca ulterior sa il pot downloada prin <a href="">Download</a>
Cum pot crea o variabila care sa contina calea catre fisierul uploadat si unde trebuie creata?
Ce am pana acum:
fisierul care exporta din tabela:

Cod: Selectaţi tot

...
while($row = $result->fetch_assoc()){
    $den_down = " ";
    $den_down = ($row['CALE_DOWNLOAD']<>NULL) ? "Download" : $den_down ;
      echo "<td><a href='" .$row['CALE_DOWNLOAD']. "'>" .$den_down. "</a></td>";
      ....
    
fisierul de upload:

Cod: Selectaţi tot

  <form action="upload_file.php" method="post" enctype="multipart/form-data" name="upload_file" autocomplete="off"><br>
    <label for="UploadFileField"></label><br>
    <input type="file" name="UploadFileField"/>
    <input type="submit" name="UploadButton" value="Upload" />
  </form>


<?php
if (isset ($_FILES['UploadFileField'])){
  $UploadName = $_FILES['UploadFileField'] ['name'];
  $UploadName = mt_rand (100000, 999999).$UploadName;
  $UploadTmp = $_FILES['UploadFileField'] ['tmp_name'];
  $UploadType = $_FILES['UploadFileField'] ['type'];
  $FileSize = $_FILES['UploadFileField'] ['size'];

  $UploadName = preg_replace("#[^a-z0-9.]#i", "", $UploadName);

  if(($FileSize > 1250000)){
    die ("Error - File to big");
  }

  if(!$UploadTmp) {
    die ("No File Selected");
  }
  else {
    if (move_uploaded_file($UploadTmp, "Upload/$UploadName")) {
        echo "Successfully inserted";
        header('Location: /index.php');
    }
    else {
      echo  "Something went wrong";
      header('Location: /index.php');
    }
  }
}
 ?>
Multumesc mult!

MarPlo Mesaje: 4343
Salut
Pai calea e deja adresa (directorul si numele) unde face upload. Dupa upload se face Insert folosind aceeasi adresa.

Cod: Selectaţi tot

if(move_uploaded_file($UploadTmp, "Upload/$UploadName")) {
  $sql ="INSERT INTO tabel (col) VALUES ('Upload/$UploadName')";
  //...
}

sterica Mesaje: 285
Am mai adaugat o variabila si codul meu ara cam asa:

Cod: Selectaţi tot

....
if (move_uploaded_file($UploadTmp, "Upload/$UploadName")) {
            $UPLOAD_COD = $_POST['UPLOAD_COD'];
            $sql = "INSERT INTO download (ID_PRODUS,CALE_DOWNLOAD) VALUES ('$UPLOAD_COD','Upload/$UploadName')";
            $result = $conn->query($sql);
        echo '<script> alert("Successfully inserted"); window.location ="/index.php";</script>';
        ....
    }
Cum pot face sa imi inlocuiasca calea spre download daca in coloana ID_PRODUS mai exista acelasi ID?

Multumesc!

MarPlo Mesaje: 4343
Ca sa eviti astfel de situatii, poti de la inceput sa generezi un nume unic, aleator pt. fisierul incarcat si salvat; cu functia: uniqid();

Cod: Selectaţi tot

$UploadName = preg_replace('#(.*?)(\.[^\.]*)$#i', uniqid().'$2', $_FILES['UploadFileField']['name']);
Sau, inainte de stabilirea adresei de Upload faci un Select in tabel dupa $UPLOAD_COD.

Cod: Selectaţi tot

$sql ="SELECT CALE_DOWNLOAD FROM download WHERE ID_PRODUS ='$UPLOAD_COD'";
//...
Daca sunt randuri returnate, setezi alt nume de salvat la fisier.

sterica Mesaje: 285
@MarPlo nu prea inteleg de ce ar trebui sa generez fisier unic, poate m-am exprimat gresit si a dus la generarea unui alt raspuns.
Am in tabela urmatoarele date:

Cod: Selectaţi tot

+-----------+-----------------------------+
| ID_PRODUS |      CALE_DOWNLOAD          |
+-----------+-----------------------------+
|   256     | fisier/2016.08.22 - doc.pdf |
|  1254     | fisier/2015.03.14 - file.pdf|
+-----------+-----------------------------+
fisierul 2015.03.14 - file.pdf a primit astazi o actualizare si se va redenumi in 2016.03.24 - file.pdf. Va trebui sa il incarc pe server, atribuindu-l lui ID_PRODUS 1254

Fisierul index.php contine:

Cod: Selectaţi tot

  <form action="upload_file.php" method="post" enctype="multipart/form-data" name="upload_file" autocomplete="off"><br>
    <label for="UploadFileField"></label><br>
    <input type="file" name="UploadFileField"/>
    <input type="submit" name="UploadButton" value="Upload" /><br>
    <input type ="text" name="UPLOAD_COD" />
  </form>
Multumesc!

MarPlo Mesaje: 4343
Daca ceea ce vrei e sa redenumesti adresa fisierului in mysql la id-ul $UPLOAD_COD, in loc de Insert aplici un Insert-Update.
Coloana ID_PRODUS trebuie sa fie de tip PRIMARY KEY.
Codul e asa:

Cod: Selectaţi tot

$sql = "INSERT INTO download (ID_PRODUS,CALE_DOWNLOAD) VALUES ('$UPLOAD_COD','Upload/$UploadName')
 ON DUPLICATE KEY UPDATE CALE_DOWNLOAD ='Upload/$UploadName'";
- Daca id-ul $UPLOAD_COD e deja in tabel, va face Update, in rest face Insert.

sterica Mesaje: 285
Cred ca va trebui sa gandesc altfel structura (dar nu stiu cum), ID_PRODUS, nu il pot face PRIMARY KEY. Ma gandesc si la faptul ca va trebui sa sterg fisierele vechi pentru a nu aglomera serverul.

Am adaugat:
$deleteSql = "DELETE FROM download WHERE ID_PRODUS = '$UPLOAD_COD'";
$conn->query($deleteSql);

Cod: Selectaţi tot

if (move_uploaded_file($UploadTmp, "Upload/$UploadName")) {
            $UPLOAD_COD = $_POST['UPLOAD_COD'];
            $deleteSql = "DELETE FROM download WHERE ID_PRODUS = '$UPLOAD_COD'";
            $conn->query($deleteSql);
            $sql = "INSERT INTO download (ID_PRODUS,CALE_DOWNLOAD) VALUES ('$UPLOAD_COD','Upload/$UploadName')";
            $result = $conn->query($sql);
        echo '<script> alert("Successfully inserted"); window.location ="index.php";</script>';
}
$deletesql imi inlocuieste valorile din tabela, insa nu imi sterge si fiserul de pe server. Ce pot face sa sterg si fisierul?

Multumesc!

sterica Mesaje: 285
Am adaugat:
$deleteSql = "DELETE FROM download WHERE ID_PRODUS = '$UPLOAD_COD'";
$conn->query($deleteSql);

Cod: Selectaţi tot

if (move_uploaded_file($UploadTmp, "Upload/$UploadName")) {
            $UPLOAD_COD = $_POST['UPLOAD_COD'];
            $deleteSql = "DELETE FROM download WHERE ID_PRODUS = '$UPLOAD_COD'";
            $conn->query($deleteSql);
            $sql = "INSERT INTO download (ID_PRODUS,CALE_DOWNLOAD) VALUES ('$UPLOAD_COD','Upload/$UploadName')";
            $result = $conn->query($sql);
        echo '<script> alert("Successfully inserted"); window.location ="index.php";</script>';
    }
$deletesql imi inlocuieste valorile din tabela, insa nu imi sterge si fiserul de pe server. Ce pot face sa sterg si fisierul?

Multumesc!

MarPlo Mesaje: 4343
Fisierul de pe server poate fi sters cu functia:

Cod: Selectaţi tot

unlink('cale/nume_fisier.ext');

sterica Mesaje: 285
Am reusit, multumesc mult de ajutor.

Subiecte similare