[Work Around] Images Not Being Deleted...

For Articles relating to more than one ISC version
Post Reply
Posts: 264
Joined: Sat Jun 26, 2010 9:22 pm

[Work Around] Images Not Being Deleted...

Post by Snooper »

This approach is not the most ideal. I strongly suggest that you firstly check to see if the ‘fix’ as described by CharlieFoxtrot works for you.


Regrettably, and perhaps not unexpected, the brilliance of CF’s fix was not going to extend to my version of ISC. :roll:

This script then, is a first stage of development and a work around. I shall call it Ver.1 :lol:
It is a very basic in its belt and brace approach - But it works !!

Firstly, you need to make a copy of the SQL Table ‘product_images’ local on your PC and run this in a MySQL server. This Table should include the SQL header that is used to create/ install the data in the format used by ISC. By example...

Code: Select all

-- phpMyAdmin SQL Dump
-- version 2.6.4-pl3
-- http://www.phpmyadmin.net
-- Host: localhost
-- Generation Time: Apr 23, 2012 at 12:13 AM
-- Server version: 5.0.91
-- PHP Version: 5.3.3-7+squeeze8
-- Database: `dbXXXXXXX641`
CREATE DATABASE `db333551641` DEFAULT CHARACTER SET latin1 COLLATE latin1_general_ci;
USE db333551641;

-- --------------------------------------------------------

-- Table structure for table `isc_product_images`

CREATE TABLE `isc_product_images` (
  `imageid` int(11) NOT NULL auto_increment,
  `imageprodid` int(11) NOT NULL default '0',
  `imageprodhash` varchar(32) NOT NULL default '',
  `imagefile` varchar(255) NOT NULL default '',
  `imageisthumb` tinyint(4) NOT NULL default '0',
  `imagesort` int(11) NOT NULL default '0',
  `imagefiletiny` varchar(255) default '',
  `imagefilethumb` varchar(255) default '',
  `imagefilestd` varchar(255) default '',
  `imagefilezoom` varchar(255) default '',
  `imagedesc` longtext,
  `imagedateadded` int(11) default '0',
  `imagefiletinysize` varchar(11) default '',
  `imagefilethumbsize` varchar(11) default '',
  `imagefilestdsize` varchar(11) default '',
  `imagefilezoomsize` varchar(11) default '',
  PRIMARY KEY  (`imageid`),
  KEY `i_product_images_imageprodid` (`imageprodid`,`imageisthumb`),
  KEY `i_product_images_imageprodid_imagesort_imageprodhash` (`imageprodid`,`imagesort`,`imageprodhash`),
  KEY `i_product_images_imageid_imageprodid_imageprodhash` (`imageid`,`imageprodid`,`imageprodhash`)

-- Dumping data for table `isc_product_images`

INSERT INTO `isc_product_images` VALUES (4, 30, '', 'w/170/1482_teal_front__70694.JPG', 1, 0, 'a/383/1482_teal_front__10117_tiny.JPG', 'm/810/1482_teal_front__87597_thumb.JPG', 'x/190/1482_teal_front__21463_std.JPG', 'e/866/1482_teal_front__78671_zoom.JPG', '', 1286573768, '68x100', '165x245', '236x350', '675x1000');
INSERT INTO `isc_product_images` VALUES (5, 30, '', 'y/918/1482_teal_back__22009.JPG', 0, 1, 'x/021/1482_teal_back__02295_tiny.JPG', 'k/320/1482_teal_back__22235_thumb.JPG', 'e/041/1482_teal_back__22361_std.JPG', 'o/954/1482_teal_back__16928_zoom.JPG', '', 1286573783, '68x100', '165x245', '236x350', '675x1000');
INSERT INTO `isc_product_images` VALUES (6, 30, '', 'j/576/1482_teal_back__23500.JPG', 0, 2, 'h/018/1482_teal_back__37600_tiny.JPG', 'b/667/1482_teal_back__99684_thumb.JPG', 'v/676/1482_teal_back__72948_std.JPG', 'z/610/1482_teal_back__47705_zoom.JPG', '', 1286573798, '68x100', '165x245', '236x350', '675x1000');
INSERT INTO `isc_product_images` VALUES (7, 30, '', 'd/403/1482_teal_back__13757.JPG', 0, 3, 'm/463/1482_teal_back__61392_tiny.JPG', 'k/331/1482_teal_back__03959_thumb.JPG', 'y/682/1482_teal_back__01263_std.JPG', 's/784/1482_teal_back__64295_zoom.JPG', '', 1286573814, '68x100', '165x245', '236x350', '675x1000');
INSERT INTO `isc_product_images` VALUES (8, 31, '', 'm/392/IMG_8677__56936.JPG', 1, 0, 'j/567/IMG_8677__90626_tiny.JPG', 'e/657/IMG_8677__24322_thumb.JPG', 'b/814/IMG_8677__21425_std.JPG', 'i/199/IMG_8677__28170_zoom.JPG', '', 1286573992, '68x100', '165x245', '236x350', '675x1000');
INSERT INTO `isc_product_images` VALUES (9, 31, '', 'g/209/IMG_8684__71484.JPG', 0, 1, 'f/784/IMG_8684__01498_tiny.JPG', 'r/582/IMG_8684__37635_thumb.JPG', 'l/086/IMG_8684__16142_std.JPG', 'r/461/IMG_8684__97958_zoom.JPG', '', 1286574009, '68x100', '165x245', '236x350', '675x1000');
INSERT INTO `isc_product_images` VALUES (10, 31, '', 'w/338/IMG_8684__13265.JPG', 0, 2, 'c/891/IMG_8684__72454_tiny.JPG', 'o/699/IMG_8684__32404_thumb.JPG', 'z/940/IMG_8684__47904_std.JPG', 'w/803/IMG_8684__80885_zoom.JPG', '', 1286574020, '68x100', '165x245', '236x350', '675x1000');
INSERT INTO `isc_product_images` VALUES (11, 31, '', 'z/382/IMG_8684__78546.JPG', 0, 3, 'f/598/IMG_8684__52680_tiny.JPG', 'b/907/IMG_8684__02360_thumb.JPG', 'h/201/IMG_8684__26342_std.JPG', 'n/351/IMG_8684__67179_zoom.JPG', '', 1286574029, '68x100', '165x245', '236x350', '675x1000');
INSERT INTO `isc_product_images` VALUES (12, 32, '', 'v/446/1482_teal_front__22376.JPG', 1, 0, 'v/534/1482_teal_front__37809_tiny.JPG', 'a/139/1482_teal_front__30200_thumb.JPG', 'c/739/1482_teal_front__67208_std.JPG', 'e/377/1482_teal_front__44141_zoom.JPG', '', 1286574202, '68x100', '165x245', '236x350', '675x1000');
INSERT INTO `isc_product_images` VALUES (13, 32, '', 'y/716/VT1501_brown_back__17759.JPG', 0, 1, 's/499/VT1501_brown_back__36197_tiny.JPG', 'u/120/VT1501_brown_back__33720_thumb.JPG', 'j/516/VT1501_brown_back__75710_std.JPG', 'w/738/VT1501_brown_back__18075_zoom.JPG', '', 1286574219, '68x100', '165x245', '236x350', '675x1000');
INSERT INTO `isc_product_images` VALUES (14, 32, '', 'w/391/VT1501_brown_back__80791.JPG', 0, 2, 'j/658/VT1501_brown_back__48857_tiny.JPG', 'x/462/VT1501_brown_back__89723_thumb.JPG', 'q/057/VT1501_brown_back__53404_std.JPG', 'y/370/VT1501_brown_back__98673_zoom.JPG', '', 1286574231, '68x100', '165x245', '236x350', '675x1000');
INSERT INTO `isc_product_images` VALUES (15, 32, '', 'c/724/VT1501_brown_back__02871.JPG', 0, 3, 'e/618/VT1501_brown_back__78129_tiny.JPG', 'g/895/VT1501_brown_back__66827_thumb.JPG', 'o/245/VT1501_brown_back__38245_std.JPG', 'i/074/VT1501_brown_back__69912_zoom.JPG', '', 1286574241, '68x100', '165x245', '236x350', '675x1000');
INSERT INTO `isc_product_images` VALUES (16, 33, '', 'h/321/IMG_9223__05453.jpg', 1, 0, 'h/560/IMG_9223__80300_tiny.jpg', 'j/586/IMG_9223__21566_thumb.jpg', 'n/561/IMG_9223__49654_std.jpg', 'v/462/IMG_9223__91806_zoom.jpg', '', 1329957880, '68x100', '165x245', '236x350', '675x1000');
INSERT INTO `isc_product_images` VALUES (17, 34, '', 'l/572/IMG_9245__88769.jpg', 1, 0, 'i/473/IMG_9245__93122_tiny.jpg', 'b/270/IMG_9245__15874_thumb.jpg', 'm/658/IMG_9245__62104_std.jpg', 'y/998/IMG_9245__45431_zoom.jpg', '', 1332605022, '68x100', '165x245', '236x350', '675x1000');
INSERT INTO `isc_product_images` VALUES (18, 34, '', 'y/354/IMG_9251__11154.jpg', 0, 1, 'd/526/IMG_9251__55296_tiny.jpg', 'z/736/IMG_9251__17580_thumb.jpg', 'f/803/IMG_9251__59845_std.jpg', 'j/127/IMG_9251__31866_zoom.jpg', '', 1332605034, '68x100', '165x245', '236x350', '675x1000');

-- --------------------------------------------------------

Then adjust the script below where I have placed XXXX’s to match your local environment and database pointers etc.

Code: Select all

//PHP has a maximum execution time of 30 seconds, and will halt with an error
//lets give it a no limit execution time (your browser may time out
//but the script should continue to run

set_time_limit(0);                   //ignore php timeout
while(ob_get_level())ob_end_clean(); //remove output buffers
ob_implicit_flush(true);             //output stuff directly

//function to ensure a path exists (make sure you have write permissions!
function CheckDir($dir) {
    $dir = dirname($dir);
    if(!file_exists($dir)) {
        $dir = str_replace('\\', '/', $dir);
        $arPaths = explode('/', $dir);
        $path = '';
        foreach($arPaths as $name) {
            if(strlen($path)>0) $path .= '/';
            $path .= $name;
            if(!file_exists($path)) mkdir($path);

$server = "localhost"; //set up connection to a local server
$user_name = "XXXXXXXXX";
$password = "XXXXXXXXX";
$database = "XXXXXXXXX";

$db_handle = mysql_connect($server, $user_name, $password);
$db_found = mysql_select_db($database, $db_handle);

//connection made, now query data
if ($db_found) {
$result = mysql_query("SELECT isc_product_images.imagefile
     , isc_product_images.imagefiletiny
     , isc_product_images.imagefilethumb
     , isc_product_images.imagefilestd
     , isc_product_images.imagefilezoom

$num_rows = mysql_num_rows($result); //how many 'lines' of data in our table
$num_imgs = $num_rows * 5;  // the number of lines is equall to 5 images
$imagepath = "http://www.XXXXXXXX.com/product_images/"; //where your store keeps images online
$mydrivepath = "f:/product_images2/"; //where you want to save the mirror locally on PC

echo '<!DOCTYPE html><html><head></head><body>'; // webkit hotfix
echo $num_rows . " Lines in this table<br/>"; // show the lines found in table
echo $num_imgs . " Image referances in this table<br/><br/>";  //show hany images this equalls

while ($row = mysql_fetch_assoc($result)) { 

//make sure directories exists
CheckDir($mydrivepath . $row['imagefile']);
CheckDir($mydrivepath . $row['imagefiletiny']);
CheckDir($mydrivepath . $row['imagefilethumb']);
CheckDir($mydrivepath . $row['imagefilestd']);
CheckDir($mydrivepath . $row['imagefilezoom']);

//copy the files
file_put_contents("$mydrivepath{$row['imagefile']}", file_get_contents("$imagepath{$row['imagefile']}"));
file_put_contents("$mydrivepath{$row['imagefiletiny']}", file_get_contents("$imagepath{$row['imagefiletiny']}"));
file_put_contents("$mydrivepath{$row['imagefilethumb']}", file_get_contents("$imagepath{$row['imagefilethumb']}"));
file_put_contents("$mydrivepath{$row['imagefilestd']}", file_get_contents("$imagepath{$row['imagefilestd']}"));
file_put_contents("$mydrivepath{$row['imagefilezoom']}", file_get_contents("$imagepath{$row['imagefilezoom']}"));

echo $imagepath . $row['imagefile']."<br/>"; //image found
echo $mydrivepath . $row['imagefile']."<br/><br/>"; //image saved

echo '</body></html>'; // webkit hotfix
Once you 'run' the script by a local PHP server, the screen 'might' display the number of lines (of data) within the Table and the number of Images this will give you to download.

NOTE the 'might' in the above sentance. PHP can also hide information untill a process has been completed.

However, to prevent browser 'time outs' (prevalent in IE and Opera) I have tried to keep the browser active by displaying Image found/saved to screen. IF however, you do get a time out - DON'T PANIC !!! The script was still running in the background.. This problem and a few improvements are for Ver.2 as I find time to work on the script. When the browser returns to view, you will have only the first image per SQL line referanced. So if you count this number and it matches the number given at the top of the page. All is good...
I personally check to see activity by having the folder created locally on view and now and then do a right mouse click ‘properties’ check. Once the number of files (images) is same as the number calculated, job done. Or the software used to run the script reports program is completed.....

So okay, what are we doing?

Well, we are simply using a non-invasive approach to read your stores current database, and then to copy every and all image referenced onto your computer. This will give you just the images. There are one or two non-copied folders/files (obvious if checked) you can add to script and copy over from within the product_images folder itself, but for now you need to copy these manually. This is simply because they held no images and would not bee 'seen' by my script.

With the mirrored copy of images now local you can upload this back online. So in theory you will now have a fresh up to date image folder, but more importantly without the dead/old images. Do a quick integrity check and then rename old folder, rename the new and you should be good to go. Last check and then only on being satisfied you DO have a good copy. Remove the older folder. Free up host server space !!

I use XAMPP for my local MySQL server and with this setup (but not running) develop and test on phpDesigner 7

Anybody willing to assist in this development and can ‘add’ function or improvements. Please do so freely and without cost !!! :D
Last edited by Snooper on Fri Dec 13, 2013 12:33 am, edited 2 times in total.
ISC 5.5.4 Ultimate : Being used here -- http://www.kdklondon.com

Posts: 413
Joined: Sun Aug 09, 2009 1:23 pm

Re: [Work Around] Images Not Being Deleted...

Post by CharlieFoxtrot »

Just a guess... but would the php "flush()" function help with getting information pushed out to the browser?

Here's the info on how to use it (along with info on its limitations, and explanations of how the results may vary on different browsers.)


I haven't tested your script... but the concept seems solid enough.

If I understand correctly, there's a lot of file transfer traffic between the web server and the local PC. It's not something that would be very practical for me... I've got about 5 gigs of product images, so the download/upload process (with ordinary DSL) would be a bit cumbersome.

OTOH: I imagine that a variation of this process could be used to create an alternate (trimmed-down) /images_copy/ directory on the server itself. Then one needs to only rename the directory and eventually delete the original directory when everything checks out.
ISC 4.0.7

"... and let's be honest that whole "by design" thing is getting old too."

Posts: 264
Joined: Sat Jun 26, 2010 9:22 pm

Re: [Work Around] Images Not Being Deleted...

Post by Snooper »

Yes valid point *doh*.. Maybe then peeps should exchange the forced clear ob_implicit_flush(true); to flush(). Same result in script function. Less harsh on server.. Well spotted CF!!

As for improvement, I shall alter the code to copy all folders onto a 'copy' and then have this do able on host server. The only risk with either route IS the potentual of users having space isue.

But yes, one step at a time.. I am working on an error class to sort out time outs etc and veriations of requirement betwen browser..
ISC 5.5.4 Ultimate : Being used here -- http://www.kdklondon.com

Post Reply