Mysql
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> Mysql

Sử dụng PHP để tải hình ảnh lên một thư mục trong khi lưu mô tả vào cơ sở dữ liệu

1) Tải lên tệp

Khi sử dụng cú pháp mảng cho đầu vào tệp, chỉ mục tệp là khóa cuối cùng. $_FILES["file"]["name"] , ví dụ, là một mảng tên tệp. Để lấy thông tin cho tệp thứ i, bạn cần truy cập $_FILES["file"]["name"][$i] , $_FILES["file"]["size"][$i] &c.

2) Lưu ảnh vào thư mục

Một số dữ liệu trong $_FILES (chẳng hạn như tên) đến từ máy khách, và do đó không đáng tin cậy (nghĩa là xác minh trước). Trong trường hợp của tên tệp , bạn có thể bắt đầu bằng cách sử dụng realpath để xác minh rằng tên đường dẫn của tệp đích là an toàn hoặc sử dụng basename hoặc pathinfo để trích xuất thành phần cuối cùng của tên được cung cấp trước khi lắp ráp tên đường dẫn đích.

3) Lưu thông tin hình ảnh vào DB

Lược đồ cơ sở dữ liệu (không đầy đủ) mà bạn đưa ra có vẻ như bạn cung cấp cho mỗi hình ảnh hai cột trong cùng một bảng. Theo mô hình quan hệ, các mối quan hệ với nhiều được lập mô hình bằng một bảng riêng biệt:

CREATE TABLE images (
    id INT UNSIGNED PRIMARY KEY AUTO_INCREMENT,
    `path` VARCHAR(256) NOT NULL,
    `description` TEXT,
    `member` INT UNSIGNED NOT NULL,
    FOREIGN KEY `member` REFERENCES members (`id`) ON DELETE CASCADE ON UPDATE CASCADE -- the image's owner
) Engine=InnoDB;

-- Note: this is a many-to-many relationship
CREATE TABLE ad_images (
    `ad` INT UNSIGNED NOT NULL,
    `image` INT UNSIGNED NOT NULL,
    FOREIGN KEY `ad` REFERENCES ads (`ad_id`) ON DELETE CASCADE ON UPDATE CASCADE,
    FOREIGN KEY `image` REFERENCES images (id) ON DELETE CASCADE ON UPDATE CASCADE,
    UNIQUE KEY (`ad`, `image`)
) Engine=InnoDB;

Nếu không, bạn đang phá vỡ zero-one-infinity quy tắc và lãng phí dung lượng khi có ít hơn số lượng hình ảnh tối đa.

Khác

Lưu ý rằng bạn có thể sử dụng cú pháp mảng cho các trường mô tả tệp để giúp xử lý chúng dễ dàng hơn. Đặt tên cho chúng là "filesesc []".

Thay vì một chuỗi so sánh dài, hãy sử dụng tra cứu mảng hoặc so khớp mẫu.

function isImage($type) {
    static $imageTypes = array(
            'image/gif'=>1, 'image/jpeg'=>1, 'image/pjpeg'=>1, 'image/png'=>1,
        );
    return isset($imageTypes[$type]);
    /* OR */
    return preg_match('%^image/(?:p?jpeg|gif|png)%', $type);
    /* OR allow all images */
    return preg_match('%^image/%', $type);
}

if (isImage($_FILES["file"]["type"][$idx]) && ($_FILES["file"]["size"][$idx] < 1048600)) {

Loại tệp là một trong những giá trị do khách hàng cung cấp. An toàn hơn sẽ là sử dụng fileinfo để lấy loại hình ảnh.

$finfo = finfo_open(FILEINFO_MIME_TYPE);

if (isImage(finfo_file($finfo, $path)) && ($_FILES["file"]["size"][$idx] < 1048600)) {

Thậm chí điều đó có thể bị đánh lừa nếu tệp có tiêu đề hình ảnh hợp lệ nhưng phần còn lại không hợp lệ. Bạn có thể sử dụng thư viện hình ảnh (chẳng hạn như GD hoặc ImageMagick) để xác thực tệp bằng cách kiểm tra xem bạn có thể mở thành công tệp dưới dạng hình ảnh hay không.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Lệnh CREATE bị từ chối đối với người dùng?

  2. Tính giá trị trung vị với Mysql

  3. Cách tạo DDL cho tất cả các bảng trong cơ sở dữ liệu trong MySQL

  4. Hiển thị thông báo trong thủ tục được lưu trữ

  5. Không thể tạo trình kích hoạt MySQL với đặc quyền TRIGGER trên 5.1.32