Mysql
 sql >> Base de données >  >> RDS >> Mysql

Wordpress - obtenir des images de la base de données stockées sous forme de données blob

Vous obtenez tout informations dans le tableau pour cet identifiant de produit, puis en essayant de l'afficher sous forme d'image. Vous devez accéder à l'image à partir du tableau de résultats ou SELECT juste l'image par ex. utilisez get_var au lieu de get_results et sélectionnez img au lieu de * :

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

Au fait, cela vous laisse ouvert à l'injection SQL, vous devriez donc vraiment utiliser $wpdb->prepare pour inclure une variable dans votre requête, par exemple

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

Limitation de taille BLOB

Notez qu'un BLOB dans MYSQL est limité à 64kb. Si vos images sont plus grandes que cela, vous devrez utiliser un MEDIUMBLOB de 16 Mo

Enregistrer le chemin de l'image plutôt que directement dans la base de données en tant que BLOB

Une solution plus pratique consiste à enregistrer uniquement le chemin.

Pour ce faire, vous devrez créer un dossier dans lequel télécharger les images (par exemple, dans mon code ci-dessous, il se trouve à la racine Web et s'appelle myimages ) et une nouvelle colonne VARCHAR ou TEXT dans votre base de données (elle s'appelle img_path dans l'exemple ci-dessous).

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

Pour récupérer l'image de la base de données et l'afficher :

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

Le code ci-dessus n'a pas été testé, mais l'idée de base est là. De plus, cela ne fonctionnera pas si un fichier portant le même nom existe déjà, vous pouvez donc envisager d'ajouter un horodatage au nom pour le rendre unique.

Réf :