Mysql
 sql >> Datenbank >  >> RDS >> Mysql

Wordpress - Abrufen von Bildern aus der Datenbank, die als Blob-Daten gespeichert werden

Sie bekommen alle Informationen in der Tabelle für diese Produkt-ID und versuchen dann, sie als Bild anzuzeigen. Sie müssen auf das Bild aus dem Ergebnisarray oder SELECT zugreifen nur das Bild z.B. Verwenden Sie get_var statt get_results und wählen Sie img statt * :

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

Übrigens, das lässt Sie offen für SQL-Injection, also sollten Sie wirklich $wpdb->prepare verwenden um eine Variable in Ihre Abfrage aufzunehmen, z. B.

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

BLOB-Größenbeschränkung

Beachten Sie, dass ein BLOB in MYSQL auf 64 KB begrenzt ist. Wenn Ihre Bilder größer sind, müssen Sie ein MEDIUMBLOB mit 16 MB verwenden

Speichern Sie den Bildpfad statt direkt in der Datenbank als BLOB

Eine praktischere Lösung besteht darin, nur den Pfad zu speichern.

Dazu müssen Sie einen Ordner erstellen, in den Sie die Bilder hochladen können (z. B. in meinem Code unten, im Webstammverzeichnis und mit dem Namen myimages). ) und eine neue VARCHAR- oder TEXT-Spalte in Ihrer Datenbank (sie heißt img_path im Beispiel unten).

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

So rufen Sie das Bild aus der Datenbank ab und zeigen es an:

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

Der obige Code ist ungetestet, aber die Grundidee ist da. Außerdem funktioniert es nicht, wenn bereits eine Datei mit dem gleichen Namen existiert, also sollten Sie erwägen, dem Namen einen Zeitstempel hinzuzufügen, um ihn eindeutig zu machen.

Referenz :