sql >> Database teknologi >  >> RDS >> Mysql

Wordpress - få billeder fra db gemt som blob-data

Du får alle oplysninger i tabellen for det produkt-id, og forsøg derefter at vise det som et billede. Du skal have adgang til billedet fra resultatarrayet eller SELECT bare billedet f.eks. brug get_var i stedet for get_results og vælg img i stedet for * :

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

Dette giver dig i øvrigt åben for SQL-injektion, så du burde virkelig bruge $wpdb->prepare at inkludere en variabel i din forespørgsel, f.eks.

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

BLOB-størrelsesbegrænsning

Bemærk, at en BLOB i MYSQL er begrænset til 64kb. Hvis dine billeder er større end dette, skal du bruge en MEDIUMBLOB, som er 16MB

Gem billedstien i stedet for direkte i databasen som en BLOB

En mere praktisk løsning er at gemme stien.

For at gøre dette skal du oprette en mappe at uploade billederne til (f.eks. i min kode nedenfor, den er i webroden og kaldes myimages ), og en ny VARCHAR- eller TEXT-kolonne i din database (den hedder img_path i eksemplet nedenfor).

/* 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.";
}

For at hente billedet fra databasen og vise det:

$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.'" />';

Ovenstående kode er ikke testet, men den grundlæggende idé er der. Det virker heller ikke, hvis der allerede findes en fil med det samme navn, så du bør overveje at tilføje et tidsstempel til navnet for at gøre det unikt.

Ref. :




  1. Grafproblemer:oprette forbindelse med NOCYCLE forud for udskiftning i SQL-server?

  2. Migrering af en Oracle MERGE-sætning til en PostgreSQL UPSERT-sætning

  3. SQL Server BCP-eksport hvor komma i SQL-feltet

  4. .patch_storage