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: 280

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
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
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
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
@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
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
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
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
Fisierul de pe server poate fi sters cu functia:

Cod: Selectaţi tot

unlink('cale/nume_fisier.ext');

sterica
Am reusit, multumesc mult de ajutor.

Subiecte similare