sql >> Database >  >> RDS >> Mysql

Wordpress - afbeeldingen van db opslaan als blob-gegevens

Je krijgt alles informatie in de tabel voor dat product-ID en probeer het vervolgens als een afbeelding weer te geven. U moet de afbeelding openen vanuit de resultatenreeks of SELECT alleen de afbeelding b.v. gebruik get_var in plaats van get_results en selecteer img in plaats van * :

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

Dit laat je trouwens open voor SQL-injectie, dus je zou echt $wpdb->prepare moeten gebruiken om een ​​variabele in uw zoekopdracht op te nemen, bijv.

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

BLOB-groottebeperking

Merk op dat een BLOB in MYSQL beperkt is tot 64 kb. Als uw afbeeldingen groter zijn, moet u een MEDIUMBLOB gebruiken van 16 MB

Sla het afbeeldingspad op in plaats van rechtstreeks in de database als een BLOB

Een meer praktische oplossing is om alleen het pad op te slaan.

Om dit te doen, moet je een map maken om de afbeeldingen naar te uploaden (bijvoorbeeld in mijn code hieronder, het is in de webroot en genaamd myimages ), en een nieuwe VARCHAR- of TEXT-kolom in uw database (deze heet img_path in het onderstaande voorbeeld).

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

Om de afbeelding uit de database op te halen en weer te geven:

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

De bovenstaande code is niet getest, maar het basisidee is er. Het werkt ook niet als er al een bestand met dezelfde naam bestaat, dus u kunt overwegen een tijdstempel aan de naam toe te voegen om deze uniek te maken.

Ref :




  1. Schema instellen voor alle query's van een verbinding in psycopg2:racevoorwaarde ophalen bij het instellen van zoekpad

  2. Standaardwaarde instellen van een integerkolom SQLite

  3. Hoe belangrijk zijn opzoektabellen?

  4. Aantal Postgres json-sleutels