javascript - 在 php 中上传图像时显示错误

标签 javascript php html mysql

我的网站中有一个图像上传选项,当用户上传图像时,它会进入数据库并且应该显示在主页中。我已经完成了以下代码:

对于add.php

<?php
// Start session
session_start();

$postData = $imgData = array();

// Get session data
$sessData = !empty($_SESSION['sessData'])?$_SESSION['sessData']:'';

// Get status message from session
if(!empty($sessData['status']['msg'])){
    $statusMsg = $sessData['status']['msg'];
    $statusMsgType = $sessData['status']['type'];
    unset($_SESSION['sessData']['status']);
}

// Get posted data from session
if(!empty($sessData['postData'])){
    $postData = $sessData['postData'];
    unset($_SESSION['sessData']['postData']);
}

// Get image data
if(!empty($_GET['id'])){
    // Include and initialize DB class
    require_once 'DB.class.php';
    $db = new DB();
    
    $conditions['where'] = array(
        'id' => $_GET['id'],
    );
    $conditions['return_type'] = 'single';
    $imgData = $db->getRows('images', $conditions);
}

// Pre-filled data
$imgData = !empty($postData)?$postData:$imgData;

// Define action
$actionLabel = !empty($_GET['id'])?'Edit':'Add';
?>

  <!-- Display status message -->
  <?php if(!empty($statusMsg)){ ?>
  <div class="col-xs-12">
    <div class="alert alert-<?php echo $statusMsgType; ?>">
      <?php echo $statusMsg; ?>
    </div>
  </div>
  <?php } ?>

  <div class="row">
    <div class="col-md-6">
      <form method="post" action="postAction.php" enctype="multipart/form-data">
        <div class="form-group">
          <label>Image</label>
          <?php if(!empty($imgData['file_name'])){ ?>
          <img src="uploads/images/<?php echo $imgData['file_name']; ?>">
          <?php } ?>
          <input type="file" name="image" class="form-control">
        </div>
        <div class="form-group">
          <label>Title</label>
          <input type="text" name="title" class="form-control" placeholder="Enter title" value="<?php echo !empty($imgData['title'])?$imgData['title']:''; ?>">
        </div>
        <a href="index.php" class="btn btn-secondary">Back</a>
        <input type="hidden" name="id" value="<?php echo !empty($imgData['id'])?$imgData['id']:''; ?>">
        <input type="submit" name="imgSubmit" class="btn btn-success" value="SUBMIT">
      </form>
    </div>
  </div>

对于处理操作的 db.class.php:

<?php

class DB{
    private $dbHost     = "localhost";
    private $dbUsername = "root";
    private $dbPassword = "";
    private $dbName     = "sample";
    
    public function __construct(){
        if(!isset($this->db)){
            // Connect to the database
            $conn = new mysqli($this->dbHost, $this->dbUsername, $this->dbPassword, $this->dbName);
            if($conn->connect_error){
                die("Failed to connect with MySQL: " . $conn->connect_error);
            }else{
                $this->db = $conn;
            }
        }
    }
    
    
    public function getRows($table, $conditions = array()){
        $sql = 'SELECT ';
        $sql .= array_key_exists("select",$conditions)?$conditions['select']:'*';
        $sql .= ' FROM '.$table;
        if(array_key_exists("where",$conditions)){
            $sql .= ' WHERE ';
            $i = 0;
            foreach($conditions['where'] as $key => $value){
                $pre = ($i > 0)?' AND ':'';
                $sql .= $pre.$key." = '".$value."'";
                $i++;
            }
        }
        
        if(array_key_exists("order_by",$conditions)){
            $sql .= ' ORDER BY '.$conditions['order_by']; 
        }else{
            $sql .= ' ORDER BY id DESC '; 
        }
        
        if(array_key_exists("start",$conditions) && array_key_exists("limit",$conditions)){
            $sql .= ' LIMIT '.$conditions['start'].','.$conditions['limit']; 
        }elseif(!array_key_exists("start",$conditions) && array_key_exists("limit",$conditions)){
            $sql .= ' LIMIT '.$conditions['limit']; 
        }
        
        $result = $this->db->query($sql);
        
        if(array_key_exists("return_type",$conditions) && $conditions['return_type'] != 'all'){
            switch($conditions['return_type']){
                case 'count':
                    $data = $result->num_rows;
                    break;
                case 'single':
                    $data = $result->fetch_assoc();
                    break;
                default:
                    $data = '';
            }
        }else{
            if($result->num_rows > 0){
                while($row = $result->fetch_assoc()){
                    $data[] = $row;
                }
            }
        }
        return !empty($data)?$data:false;
    }
    
    
    public function insert($table, $data){
        if(!empty($data) && is_array($data)){
            $columns = '';
            $values  = '';
            $i = 0;
            if(!array_key_exists('created',$data)){
                $data['created'] = date("Y-m-d H:i:s");
            }
            if(!array_key_exists('modified',$data)){
                $data['modified'] = date("Y-m-d H:i:s");
            }
            foreach($data as $key=>$val){
                $pre = ($i > 0)?', ':'';
                $columns .= $pre.$key;
                $values  .= $pre."'".$this->db->real_escape_string($val)."'";
                $i++;
            }
            $query = "INSERT INTO ".$table." (".$columns.") VALUES (".$values.")";
            $insert = $this->db->query($query);
            return $insert?$this->db->insert_id:false;
        }else{
            return false;
        }
    }
    
    
    public function update($table, $data, $conditions){
        if(!empty($data) && is_array($data)){
            $colvalSet = '';
            $whereSql = '';
            $i = 0;
            if(!array_key_exists('modified',$data)){
                $data['modified'] = date("Y-m-d H:i:s");
            }
            foreach($data as $key=>$val){
                $pre = ($i > 0)?', ':'';
                $colvalSet .= $pre.$key."='".$this->db->real_escape_string($val)."'";
                $i++;
            }
            if(!empty($conditions)&& is_array($conditions)){
                $whereSql .= ' WHERE ';
                $i = 0;
                foreach($conditions as $key => $value){
                    $pre = ($i > 0)?' AND ':'';
                    $whereSql .= $pre.$key." = '".$value."'";
                    $i++;
                }
            }
            $query = "UPDATE ".$table." SET ".$colvalSet.$whereSql;
            $update = $this->db->query($query);
            return $update?$this->db->affected_rows:false;
        }else{
            return false;
        }
    }
    
    
    public function delete($table, $conditions){
        $whereSql = '';
        if(!empty($conditions)&& is_array($conditions)){
            $whereSql .= ' WHERE ';
            $i = 0;
            foreach($conditions as $key => $value){
                $pre = ($i > 0)?' AND ':'';
                $whereSql .= $pre.$key." = '".$value."'";
                $i++;
            }
        }
        $query = "DELETE FROM ".$table.$whereSql;
        $delete = $this->db->query($query);
        return $delete?true:false;
    }
}

但是当我尝试上传图像时,它显示

Sorry, there was an error uploading your file

将图像添加到表格的代码:

public function insert($table, $data){
        if(!empty($data) && is_array($data)){
            $columns = '';
            $values  = '';
            $i = 0;
            if(!array_key_exists('created',$data)){
                $data['created'] = date("Y-m-d H:i:s");
            }
            if(!array_key_exists('modified',$data)){
                $data['modified'] = date("Y-m-d H:i:s");
            }
            foreach($data as $key=>$val){
                $pre = ($i > 0)?', ':'';
                $columns .= $pre.$key;
                $values  .= $pre."'".$this->db->real_escape_string($val)."'";
                $i++;
            }
            $query = "INSERT INTO ".$table." (".$columns.") VALUES (".$values.")";
            $insert = $this->db->query($query);
            return $insert?$this->db->insert_id:false;
        }else{
            return false;
        }
    }

作为新手,任何人都可以告诉我我的代码有什么问题,提前致谢

最佳答案

您似乎正在尝试将图像直接插入表中。根据我迄今为止的经验,这种方法行不通。

PHP 中文件的基本上传是通过使用 move_uploaded_file 函数完成的。您可以获取更多详情Here.

当您通过文件 HTML 元素在 PHP 中上传文件时,该文件将被上传到临时位置,并在 $_FILES 数组中为您提供详细信息。您可以在 $_FILES 数组中找到完整的文件信息,例如文件名、大小、mime 类型、临时名称和错误。

因此,您应该做的是将文件上传到目标文件夹,然后再将其插入数据库。所以你需要创建一个上传函数:

function uploadFile($file) {
    $destination = "[YOUR DESTINATION FOLDER PATH]";
    if ($file['errors'] == 0) {
        $fileNameSplit = explode('.', $file['name']);
        $newFileName = $fileNameSplit[0] . time() . $fileNameSplit[1];
        $uploadPath = $destination . DIRECTORY_SEPARATOR . $newFileName;

        if (move_uploaded_file($file['tmp_name'], $uploadPath)) {
            return $newFileName;
        }
    }

    return null;
}

您必须在插入查询之前调用此函数。所以你的代码将是这样的:

public function insert($table, $data){
    $uploadedFileName = uploadFile($_FILES['image']);
    if (!empty($uploadedFileName)) {
        $data['image'] = $uploadedFileName;
    }
    if(!empty($data) && is_array($data)){
        $columns = '';
        $values  = '';
        $i = 0;
        if(!array_key_exists('created',$data)){
            $data['created'] = date("Y-m-d H:i:s");
        }
        if(!array_key_exists('modified',$data)){
            $data['modified'] = date("Y-m-d H:i:s");
        }
        foreach($data as $key=>$val){
            $pre = ($i > 0)?', ':'';
            $columns .= $pre.$key;
            $values  .= $pre."'".$this->db->real_escape_string($val)."'";
            $i++;
        }
        $query = "INSERT INTO ".$table." (".$columns.") VALUES (".$values.")";
        $insert = $this->db->query($query);
        return $insert?$this->db->insert_id:false;
    }else{
        return false;
    }
}

试试这个。根据您的逻辑,可能需要对代码进行一些细微的修改。我已将 $_FILES['image'] 作为参数传递,但您也可以直接在上传函数中使用 $_FILES 数组,而不向其传递任何内容。

另请注意,您也必须在编辑功能中使用相同的逻辑,但我想您可以做到。如果没有,请告诉我。

希望这有帮助。

关于javascript - 在 php 中上传图像时显示错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59434490/

相关文章:

javascript - 以数组形式返回对象的所有键或值的函数

javascript - 需要输入 JavaScript i18n 实现

javascript - v-model 不使用 switch 更改数据并在 vuejs 中选择下拉列表

php - 返回的 json 未定义

javascript - html php POSTing javascript整数数组

javascript - 在动态内容上按下后退按钮时遇到困难

javascript - 使用多个追加函数和单个追加函数有什么区别

php - 使用 AJAX 检索 HTML 下拉列表值

html - 如何修复内容安全策略错误?

html - 如何使用 CSS 从网站(提供的链接)中抓取表格?