【问题标题】:How to update PDF file that already has been added to the database in PHP?如何更新已经在 PHP 中添加到数据库中的 PDF 文件?
【发布时间】:2019-05-22 18:53:10
【问题描述】:

我需要更新已为某个用户上传的 PDF 文件(使用 html 表单)。我添加了一个代码来更新 PDF 文档(选择另一个/新文档),但它不起作用。它只是将文件的名称更新到数据库,而不像我在 insert.php 中那样将文件上传到文件夹和数据库的路径。

这是我的 insert.php 代码:

<?php
$server = "localhost";
$user = "root";
$pass = "";
$dbname = "employees";

// Create connection
$conn = mysqli_connect($server, $user, $pass, $dbname);

// Check connection
if (!$conn) {
    die("Connection failed: " . mysqli_connect_error());
}

$fname = mysqli_real_escape_string($conn, $_POST['fname']);
$lname = mysqli_real_escape_string($conn, $_POST['lname']);
$dob = mysqli_real_escape_string($conn, $_POST['dob']);
$embg = mysqli_real_escape_string($conn, $_POST['embg']);
$address = mysqli_real_escape_string($conn, $_POST['address']);
$city = mysqli_real_escape_string($conn, $_POST['city']);
$mobile = mysqli_real_escape_string($conn, $_POST['mobile']);
$email = mysqli_real_escape_string($conn, $_POST['email']);
$workplace = mysqli_real_escape_string($conn, $_POST['workplace']);
$workposition = mysqli_real_escape_string($conn, $_POST['workposition']);
$jobstartdate = mysqli_real_escape_string($conn, $_POST['jobstartdate']);
$contractfrom = mysqli_real_escape_string($conn, $_POST['contractfrom']);
$contractto = mysqli_real_escape_string($conn, $_POST['contractto']);
$healthbookfrom = mysqli_real_escape_string($conn, $_POST['healthbookfrom']);
$healthbookto = mysqli_real_escape_string($conn, $_POST['healthbookto']);
$bankaccount = mysqli_real_escape_string($conn, $_POST['bankaccount']);
$bank = mysqli_real_escape_string($conn, $_POST['bank']);
$workcode = mysqli_real_escape_string($conn, $_POST['workcode']);
$gender = mysqli_real_escape_string($conn, $_POST['gender']);
$bloodtype = mysqli_real_escape_string($conn, $_POST['bloodtype']);
$notes = mysqli_real_escape_string($conn, $_POST['notes']);
$contract_file = basename($_FILES['contractupload']['name']);
$contract_path = "files/contracts/$contract_file";
$contract_file = mysqli_real_escape_string($conn, $contract_file);

copy($_FILES['contractupload']['tmp_name'], $contract_path);  // copy the file to the folder


$sql = "INSERT INTO addemployees (fname, lname, dob, embg, address, city, mobile, email, workplace, workposition, jobstartdate, contractfrom, contractto, healthbookfrom,
                                  healthbookto, contractupload, bankaccount, bank, workcode, gender, bloodtype, notes)
        VALUES ('$fname', '$lname', '$dob', '$embg', '$address', '$city', '$mobile', '$email', '$workplace', '$workposition', '$jobstartdate', '$contractfrom', '$contractto',
                '$healthbookfrom', '$healthbookto', '$contract_file', '$bankaccount', '$bank', '$workcode', '$gender', '$bloodtype', '$notes')";

if (mysqli_query($conn, $sql)) {
  header("location: employees.php");
    // echo "New record created successfully";
} else {
    echo "Error: " . $sql . "<br>" . mysqli_error($conn);
}


// Use this to write text for the connection ---> echo "Connected successfully";

//Close the connection
mysqli_close($conn);    
?>

这是我的 update.php 代码:

       <?php

// Include config file
require_once "new_db_connect.php";

if($_POST) {
    $fname = $_POST['fname'];
    $lname = $_POST['lname'];
    $embg = $_POST['embg'];
    $contractupload = $_POST['contractupload'];
    $contract_file = $_FILES['contractupload']['name'];
    $contract_path = "files/contracts/$contract_file";

copy($_FILES['contractupload']['tmp_name'], $contract_path);

    $id = $_POST['id'];

// UPDATE the info
    $sql = "UPDATE addemployees SET fname = '$fname', lname = '$lname', embg = '$embg', contractupload = '$contractupload' WHERE id = {$id}";
    if($connect->query($sql) === TRUE) {
        header("location: employees.php");

    } else {
        echo "Erorr while updating record : ". $connect->error;
    }

    $connect->close();

}

?>

这是我的edit.php代码:

<?php

// Include config file
require_once "new_db_connect.php";

if($_GET['id']) {
    $id = $_GET['id'];

    $sql = "SELECT * FROM addemployees WHERE id = {$id}";
    $result = $connect->query($sql);

    $data = $result->fetch_assoc();

    $connect->close();

?>

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Update Record</title>
    <link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/css/bootstrap.css">
    <style type="text/css">
        .wrapper{
            width: 500px;
            margin: 0 auto;
        }
    </style>
</head>
<body>
    <div class="wrapper">
        <div class="container-fluid">
            <div class="row">
                <div class="col-md-12">
                    <div class="page-header">
                        <h2>Update User Info</h2>
                    </div>
                    <form action="update.php" method="post">

                      <div class="form-group">
                          <label>Name</label>
                          <input type="text" id="fname" name="fname" class="form-control" value="<?php echo $data['fname'] ?>">
                      </div>

                      <div class="form-group">
                          <label>Last Name</label>
                          <input type="text" id="lname" name="lname" class="form-control" value="<?php echo $data['lname'] ?>">
                      </div>

                      <div class="form-group">
                          <label>ID Number</label>
                          <input type="text" id="embg" name="embg" class="form-control" value="<?php echo $data['embg'] ?>">
                      </div>

                      <div class="form-group">
                          <label>Contract PDF</label>
                          <input type="file" name="contractupload" id="contractupload" class="form-control" style="border: 1px solid #CED4DA!important;" style="width: 50%!important;" value="<?php echo $data['contractupload'] ?>">
                      </div>

                      <input type="hidden" name="id" value="<?php echo $data['id'] ?>"/>
                      <input type="submit" class="btn btn-primary" value="Submit">
                      <a href="employees.php" class="btn btn-default">Cancel</a>
                  </form>

                </div>
            </div>
        </div>
    </div>
</body>
</html>

<?php
}
?>

更新

我更新了我的代码,使其更具可读性和更简单。我正在寻求有关更新 PDF 文件的帮助。

【问题讨论】:

  • 您的代码很大,我猜它的设计目的不是可重现的。您可能想查看How to create a Minimal, Complete, and Verifiable example上的 SO 指南
  • @NinoFiliu 我已经更新了我的代码,使其更具可读性和更简单。我希望你们中的某个人现在可以帮助我更新 PDF 文件。谢谢
  • 文件输入只放入$_FILES,而不是$_POST。所以$contractupload = $_POST['contractupload'];显然是错误的。
  • 为什么还拒绝使用move_uploaded_file()?这是在回答您关于上传脚本的第一个问题时提到的。
  • @Blagojce 这是$_FILES['contractupload']['tmp_name']

标签: php html mysql mysqli


【解决方案1】:

$_POST['contractupload'] 不起作用。文件名仅在$_FILES 中。您应该像在insert.php 中一样处理它。

我还展示了如何使用准备好的语句而不是变量替换来重写您的代码。

您应该使用move_uploaded_file() 而不是copy()。见Difference between copy and move_uploaded_file

<?php

// Include config file
require_once "new_db_connect.php";

if($_POST) {
    $fname = $_POST['fname'];
    $lname = $_POST['lname'];
    $embg = $_POST['embg'];
    $contract_file = basename($_FILES['contractupload']['name']);
    $contract_path = "files/contracts/$contract_file";

    move_uploaded_file($_FILES['contractupload']['tmp_name'], $contract_path);

    $id = $_POST['id'];

    // UPDATE the info
    $stmt = $connect->prepare("UPDATE addemployees SET fname = ?, lname = ?, embg = ?, contractupload = ? WHERE id = ?");
    $stmt->bind_param("ssssi", $fname, $lname, $embg, $contract_file, $id);
    if($stmt->execute()) {
        header("location: employees.php");
    } else {
        echo "Erorr while updating record : ". $stmt->error;
    }

    $connect->close();

}

?>

【讨论】:

  • 非常感谢。我用我的代码替换了你的代码,但它仍然不起作用。它在浏览器中没有显示任何错误,但我在 php 日志文件中看到了一些错误:
  • [23-Dec-2018 21:41:32 UTC] PHP Notice: Undefined index: contractupload in C:\wamp64\www\management3\update.php on line 10 [23-Dec-2018 21:41:32 UTC] PHP Stack trace: [23-Dec-2018 21:41:32 UTC] PHP 1. {main}() C:\wamp64\www\management3\update.php:0 [23-Dec-2018 21:41:32 UTC] PHP Notice: Undefined index: contractupload in C:\wamp64\www\management3\update.php on line 13 [23-Dec-2018 21:41:32 UTC] PHP Stack trace: [23-Dec-2018 21:41:32 UTC] PHP 1. {main}() C:\wamp64\www\management3\update.php:0
  • 它不会将文件移动到文件夹中,也不会在数据库或我列出所有用户的表中显示文件的名称。
  • 顺便说一句,您不能设置 type="file" 输入的默认值。见stackoverflow.com/questions/1696877/…
  • 那我想不出它不起作用的原因。 move_uploaded_filecopy 做同样的事情,除了它检查文件是否真的在上传目录中,然后它会删除它。您是否启用了error_reporting(E_ALL); 以便记录所有警告?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-07-02
  • 2021-09-02
  • 2015-09-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多