iT邦幫忙

0

php傳送檔案名稱到資料庫 問題求解!

test.php

<!DOCTYPE html>
<html lang="en" dir="ltr">
  <head>
    <meta charset="utf-8">
    <title></title>
  </head>
  <body>
    <form method="post" enctype="multipart/form-data" action="uploadas.php">
      <input type="file" name="file" id="file">
      <input name="action" type="hidden" value="add">
      <input type="submit" name="button" id="button" value="新增資料">
    </form>

  </body>
</html>

uploadas.php

<?php
# 檢查檔案是否上傳成功
include("connMysqlupload.php");

if(isset($_POST["action"])&&($_POST["action"]=="add")){
$sql_query = "INSERT INTO updataasas (file) VALUES (?)";
$stmt = $db_link -> prepare($sql_query);
$stmt -> bind_param("s", $_POST["file"]);
$stmt -> execute();
$stmt -> close();
$db_link -> close();

if ($_FILES['file']['error'] === UPLOAD_ERR_OK){
  echo '檔案名稱: ' . $_FILES['file']['name'] . '<br/>';
  echo '檔案類型: ' . $_FILES['file']['type'] . '<br/>';
  echo '檔案大小: ' . ($_FILES['file']['size'] / 1024) . ' KB<br/>';
  echo '暫存名稱: ' . $_FILES['file']['tmp_name'] . '<br/>';
  # 檢查檔案是否已經存在
  if (file_exists('Filepaper/' . $_FILES['file']['name'])){
    echo '檔案已存在。<br/>';
  } else {
    $file = $_FILES['file']['tmp_name'];
    $dest = 'Filepaper/' . $_FILES['file']['name'];

    # 將檔案移至指定位置
    move_uploaded_file($file, $dest);
  }
} else {
  echo '錯誤代碼:' . $_FILES['file']['error'] . '<br/>';
}
}
?>

https://ithelp.ithome.com.tw/upload/images/20210408/201169266gdTwGmFyE.jpg
我是php新手,目前正在試做php傳送檔案名稱到資料庫的這個功能,目前遇到一些問題想請教一下各位~

資料庫有正常連線,我的問題是在form裡面加入enctype="multipart/form-data"可以正常上傳資料但檔名無法寫入資料庫,如果我那這段刪掉的話可以順利寫入資料庫但無法正常上傳檔案,那請問這是甚麼問題?

圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

2 個回答

1
淺水員
iT邦大師 6 級 ‧ 2021-04-09 00:46:11

uploads.php

  1. 我沒看到你的 $file 是從哪來的
  2. 應該是沒有 bind_param 這個 method,而且第一個參數("s")應該是錯的,請參考PDOStatement::bindParam
  3. 如果沒顯示錯誤訊息,請搜尋一下「php 顯示錯誤」,先依據錯誤訊息除錯。

uploads.php

$stmt -> bind_param("s", $_POST["file"]);

不好意思~那段忘記復原了,我那段是打這樣才對~如果這樣的沒錯的話那問題是出在哪?
我一直在想說enctype="multipart/form-data"是不是這段的問題

抱歉!第一次使用這個網站發問

淺水員 iT邦大師 6 級 ‧ 2021-04-09 03:22:26 檢舉

抱歉之前看錯以為你是用 PDO,後來才發現是用 mysqli
你要的我猜是這樣

<?php
# 檢查檔案是否上傳成功
include("connMysqlupload.php");

if(
    isset($_POST["action"]) &&
    $_POST["action"]==="add" &&
    isset($_FILES['file'])
) {
    if ($_FILES['file']['error'] === UPLOAD_ERR_OK){
        echo '檔案名稱: ' . $_FILES['file']['name'] . '<br/>';
        echo '檔案類型: ' . $_FILES['file']['type'] . '<br/>';
        echo '檔案大小: ' . ($_FILES['file']['size'] / 1024) . ' KB<br/>';
        echo '暫存名稱: ' . $_FILES['file']['tmp_name'] . '<br/>';
        # 檢查檔案是否已經存在
        if (file_exists('Filepaper/' . $_FILES['file']['name'])){
            echo '檔案已存在。<br/>';
        } else {
            $file = $_FILES['file']['tmp_name'];
            $dest = 'Filepaper/' . $_FILES['file']['name'];

            # 要儲存檔案的話才需要寫入資料庫
            $sql_query = "INSERT INTO updataasas (file) VALUES (?)";
            $stmt = $db_link -> prepare($sql_query);
            $stmt -> bind_param("s", $dest);
            $stmt -> execute();
            $stmt -> close();
            $db_link -> close();

            # 將檔案移至指定位置
            move_uploaded_file($file, $dest);
        }
    } else {
        echo '錯誤代碼:' . $_FILES['file']['error'] . '<br/>';
    }
}

資料庫要儲存的檔名從 $_FILES['file']['name'] 拿就好了

好的感謝您~我試看看

0
海綿寶寶
iT邦大神 1 級 ‧ 2021-04-09 10:03:17

有三點要注意的:

1.上傳檔案的「檔案變數」是$_FILES而不是_$POST
關於「檔案」,從頭到尾都是$_FILES,不用$_POST

2.變數命名不要用相同名字,會造成混淆
像你參考的這篇裡就用了不同的名稱: my_file
你從頭到尾都參考他的寫法
偏偏就是 file 這個變數不參考
結果就是你的 file 混淆了你自己
一下子是「檔案本身」
一下子又拿來當成「檔案的路徑檔名」

3.還沒確定上傳成功,就將檔名寫進資料庫
應該將這段寫在if ($_FILES['file']['error'] === UPLOAD_ERR_OK){裡面而不是前面

好的感謝您的建議~~

我要發表回答

立即登入回答