sql >> Databasteknik >  >> RDS >> Mysql

Wordpress - få bilder från db lagrade som blobdata

Du får alla informationen i tabellen för det produkt-id:t och försöker sedan visa det som en bild. Du måste komma åt bilden från resultatmatrisen eller SELECT bara bilden t.ex. använd get_var istället för get_results och välj img istället för * :

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

Förresten, detta lämnar dig öppen för SQL-injektion, så du borde verkligen använda $wpdb->prepare för att inkludera en variabel i din fråga, t.ex.

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

BLOB storleksbegränsning

Observera att en BLOB i MYSQL är begränsad till 64kb. Om dina bilder är större än så här måste du använda en MEDIUMBLOB som är 16MB

Spara bildsökvägen istället för direkt i databasen som en BLOB

En mer praktisk lösning är att spara bara vägen.

För att göra detta måste du skapa en mapp att ladda upp bilderna till (t.ex. i min kod nedan, den ligger i webbroten och kallas myimages ), och en ny kolumn VARCHAR eller TEXT i din databas (den heter img_path i exemplet nedan).

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

För att hämta bilden från databasen och visa den:

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

Koden ovan är oprövad, men grundidén finns där. Det fungerar inte heller om en fil med samma namn redan finns, så du kanske vill överväga att lägga till en tidsstämpel till namnet för att göra det unikt.

Ref :




  1. Okänd tabell i MULTI DELETE

  2. Finns det ANY_VALUE-kapacitet för mysql 5.6?

  3. CAST(DATETIME AS DATE) över WHERE-satsen

  4. Hur man får resultat som Oracle lag-funktion