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

Wordpress - lấy hình ảnh từ db được lưu trữ dưới dạng dữ liệu blob

Bạn đang nhận được tất cả thông tin trong bảng cho id sản phẩm đó, và sau đó cố gắng hiển thị nó dưới dạng hình ảnh. Bạn cần truy cập hình ảnh từ mảng kết quả hoặc SELECT chỉ là hình ảnh, ví dụ:sử dụng get_var thay vì get_results và chọn img thay vì * :

$product_id = get_query_var('id');
$image = $wpdb->get_var("SELECT img FROM products  WHERE id = ".$product_id);

Nhân tiện, điều này khiến bạn mở cửa với SQL injection, vì vậy bạn thực sự nên sử dụng $wpdb->prepare để bao gồm một biến trong truy vấn của bạn, ví dụ:

$image = $wpdb->get_var( 
    $wpdb->prepare("SELECT img FROM products  WHERE id = %d", $product_id)  
);

Giới hạn kích thước BLOB

Lưu ý rằng BLOB trong MYSQL được giới hạn ở 64kb. Nếu hình ảnh của bạn lớn hơn mức này, bạn sẽ cần sử dụng MEDIUMBLOB là 16MB

Lưu đường dẫn hình ảnh thay vì trực tiếp trong cơ sở dữ liệu dưới dạng BLOB

Một giải pháp thiết thực hơn là chỉ lưu đường dẫn.

Để thực hiện việc này, bạn sẽ cần tạo một thư mục để tải hình ảnh lên (ví dụ:trong mã của tôi bên dưới, nó nằm trong thư mục gốc của web và được gọi là myimages ) và một cột VARCHAR hoặc TEXT mới trong cơ sở dữ liệu của bạn (nó được gọi là img_path trong ví dụ bên dưới).

/* 1. Define the path to the folder where you will upload the images to, 
      Note, this is relative to your web root. */ 
define (MY_UPLOAD_DIR, "myimages/");

$imagefilename = basename( $_FILES['image']['name']);

/* 2. define the full path to upload the file to, including the file name */
$fulluploadpath = get_home_path(). MY_UPLOAD_DIR . $imagefilename;

$image_name = strip_tags($_FILES['image']['name']);
$image_size = getimagesize($_FILES['image']['tmp_name']);

/* 3. Do your validation checks here, e.g. */
if($image_size == FALSE) {
    echo 'The image was not uploaded';
} 
/* 4. if everything is ok, copy the temp file to your upload folder */
else if(move_uploaded_file($_FILES['image']['tmp_name'], $fulluploadpath )) {
    /* 5. if the file was moved successfully, update the database */
    $wpdb->insert( 
        $table, 
        array( 
            'title' => $title,
            'description' => $description,
            'brand' => $brand,
            'img_name' => $image_name,
            'img_path' => MY_UPLOAD_DIR . $imagefilename, /* save the path instead of the image */
        )
    ); 

} else {
    //Display an error if the upload failed
    echo "Sorry, there was a problem uploading your file.";
}

Để truy xuất hình ảnh từ cơ sở dữ liệu và hiển thị nó:

$product_id = get_query_var('id');
/* query the database for the image path */
$imagepath = $wpdb->get_var( 
    $wpdb->prepare("SELECT img_path FROM products  WHERE id = %d", $product_id)  
);

/* 6. Display the image using the path. 
      Because the path we used is relative to the web root, we can use it directly 
      by prefixing it with `/` so it starts at the webroot */ 
if ($imagepath)
    echo '<img src="/'.$imagepath.'" />';

Đoạn mã trên chưa được kiểm tra, nhưng ý tưởng cơ bản là ở đó. Ngoài ra, nó sẽ không hoạt động nếu một tệp có cùng tên đã tồn tại, vì vậy bạn có thể muốn xem xét thêm dấu thời gian vào tên để làm cho nó trở thành duy nhất.

Tham khảo :




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Các tên_dưỡng_thường_của MySQL sẽ không thay đổi

  2. Laravel và AWS Cloudfront

  3. SQL LIKE% bên trong mảng

  4. Nhận các giá trị chung nhất cho tất cả các cột

  5. Có cách nào tốt để thực hiện kết xuất SQL của cơ sở dữ liệu MySQL trong DataGrip không?