php-general Digest 24 Aug 2006 07:38:16 -0000 Issue 4310

Topics (messages 241054 through 241071):

Re: strange mysqli error
        241054 by: Jochem Maas
        241057 by: Richard K Miller

Re: Why small > big?
        241055 by: tedd
        241066 by: Alex Turner

Re: Shopping cart
        241056 by: Chris W. Parker

Where to download APC for windows?
        241058 by: steve
        241065 by: Alex Turner
        241069 by: steve
        241070 by: Rasmus Lerdorf

usort within a class
        241059 by: Peter Lauri
        241060 by: Robert Cummings
        241067 by: Peter Lauri

Re: PHP & BEA Weblogic 8.
        241061 by: Andrew Kreps
        241064 by: Alex Turner

Re: OT alternate website authentication methods
        241062 by: Chris W. Parker

E_ALL | E_STRICT
        241063 by: tedd
        241068 by: Ligaya Turmelle

upload image
        241071 by: Sonja

Administrivia:

To subscribe to the digest, e-mail:
        [EMAIL PROTECTED]

To unsubscribe from the digest, e-mail:
        [EMAIL PROTECTED]

To post to the list, e-mail:
        [email protected]


----------------------------------------------------------------------
--- Begin Message ---
Richard K Miller wrote:
> 
> On Aug 23, 2006, at 2:33 AM, Jochem Maas wrote:
> 
>> how do you know which object is destroyed first?
>>
>> also you are using 3 different versions of php - not something that will
>> help narrow down the problem.
>>

...

>>
> 
> No errors when I use unset().   I see what you mean about not knowing
> which object is destroyed first.  Maybe I'll have to use a non-OOP
> connection to MySQL, 

you can still use OOP, only you can't rely on auto destruct with
regard to object existance.

> since it wouldn't appear there's any way to specify
> the order of destruction of objects.

try the ini settings auto_prepend_file auto_append_file

http://php.net/manual/en/ini.core.php#ini.auto-append-file

and use them to control the startup &/or shutdown phase of your app. e.g:

class DB {
        private $connObj; // obj of class DB
                          // don't allow references to it outside the class     

        static function shutdown()  { unset(self::$connObj); /* trigger 
self::__destruct() */ }
        function __destruct()  { /* do stuff (which you could just as well do 
in self::shutdown()?) */ }
}

shutdown.php:
<?php

DB::shutdown();

> 
> 

--- End Message ---
--- Begin Message ---

On Aug 23, 2006, at 11:41 AM, Jochem Maas wrote:

you can still use OOP, only you can't rely on auto destruct with
regard to object existance.

try the ini settings auto_prepend_file auto_append_file

http://php.net/manual/en/ini.core.php#ini.auto-append-file

and use them to control the startup &/or shutdown phase of your app. e.g:

class DB {
        private $connObj; // obj of class DB
                          // don't allow references to it outside the class     

static function shutdown() { unset(self::$connObj); /* trigger self::__destruct() */ } function __destruct() { /* do stuff (which you could just as well do in self::shutdown()?) */ }
}

shutdown.php:
<?php

DB::shutdown();


Jochem,

That's a good idea, and I'm glad to learn about the auto-append-file directive for the first time, but that seems a bit more "hack-ey" than I want.

Just to document this a bit more, this page has a quote supposedly from Andi Gutmans saying we "must not rely in any way on the order of destruction during shutdown":

http://www.phpbuilder.com/board/archive/index.php/t-10293485.html

Previous bug reports on this issue:
http://bugs.php.net/bug.php?id=36034
http://bugs.php.net/bug.php?id=31326

Since these bugs don't appear to be slated for fixing, I submitted a request to change the documentation:
http://bugs.php.net/bug.php?id=38572

The documentation ought to reflect that we cannot "rely on the the order of destruction" rather than the current "The destructor method will be called as soon as all references to a particular object are removed", which is incorrect.

But I'd actually prefer that the bug be fixed rather than the documentation changed.

Richard

--- End Message ---
--- Begin Message ---
Alex:

Excuse for top posting:

You said: Clear as mud?

Well actually, it's simperer than I thought. After your reply, I did some reading on jpeg and found it's simply a transform, not unlike FFT where two-dimensional temporal data is transformed from the time domain to the frequency domain -- very interesting reading.

The reverse cosine matrix you mention is probably the discrete cosine transform (DCT) matrix where the x, y pixels of an image file have a z component representing color. From that you can translate the data into the frequency domain, which actually generates more data than the original.

However, the quality setting is where you make it back up in compression ratio's by trimming off higher frequencies which don't add much to the data. Unlike the FFT, the algorithm does not address phasing, which I found interesting.

However, the answer to my question deals with the quality statement. In the statement:

imagejpeg($image_p, null, 100);

I should have used something less than 100.

I've change the figure to 25 and don't see any noticeable difference in quality of the thumbnail.

It seems to me there should be a table (or algorithm) somewhere that would recommend what quality to use when reducing the size of an image via this method. In this case, I reduced an image 62 percent (38% of the original) with a quality setting of 25 and "see" no difference. I think this (the quality factor) is programmable.

As for png images, I would probably agree (if I saw comparisons), but not all browsers accept them. I belive that at least one IE has problems with png's, right?

tedd

At 4:45 PM +0100 8/23/06, Alex Turner wrote:
M Sokolewice got it nearly correct. However, the situation is a little more complex than he has discussed.

The % compression figure for jpeg is translated into the amount of information stored in the reverse cosine matrix. The size of the compressed file is not proportional to the % you set in the compressor. Thus 100% actually means store all the information in the reverse cosine matrix. This is like storing the image in a 24 bit png, but with the compressor turned off. So at 100% jpeg is quite inefficient.

The other issue is the amount of high frequency information in your images. If you have a 2000x2000 image with most of the image dynamics at a 10 pixel frequency, and you reduce this to 200x200 then the JPEG compression algorithm will 'see' approximately the same amount of information in the image :-( The reality is not quite as simple as this because of the way JPEG uses blocks etc, but it is an easy way of thinking about it.

What all this means is that as you reduce the size of an image, if you want it to retain some of the detail of the original but at a smaller size, there will be a point at which 8 or 24 bit PNG will become a better bet.

Clear as mud?

AJ

M. Sokolewicz wrote:
I'm not quite sure, but consider the following:

Considering the fact that most JPEG images are stored with some form of compression usually ~75% that would mean the original image, in actual size, is about 1.33x bigger than it appears in filesize. When you make a thumbnail, you limit the amount of pixels, but you are setting compression to 100% (besides that, you also use a truecolor pallete which adds to its size). So, for images which are scaled down less than 25% (actually this will prob. be more around 30-ish, due to palette differences) you'll actually see the thumbnail being bigger in *filesize* than the original (though smaller in memory-size)

- tul

P.S. isn't error_reporting( FATAL | ERROR | WARNING ); supposed to be error_reporting( E_FATAL | E_ERROR | E_WARNING ); ??

tedd wrote:
Hi gang:

I have a thumbnail script, which does what it is supposed to do. However, the thumbnail image generated is larger than the original image, how can that be?

Here's the script working:

http://xn--ovg.com/thickbox

And, here's the script:

<?php /* thumb from file */

/* some settings */
ignore_user_abort();
set_time_limit( 0 );
error_reporting( FATAL | ERROR | WARNING );

/* security check */
ini_set( 'register_globals', '0' );

/* start buffered output */
ob_start();

/* some checks */
if ( ! isset( $_GET['s'] ) ) die( 'Source image not specified' );

$filename = $_GET['s'];

// Set a maximum height and width
$width = 200;
$height = 200;

// Get new dimensions
list($width_orig, $height_orig) = getimagesize($filename);

if ($width && ($width_orig < $height_orig))
    {
    $width = ($height / $height_orig) * $width_orig;
    }
else
    {
    $height = ($width / $width_orig) * $height_orig;
    }

// Resample
$image_p = imagecreatetruecolor($width, $height);
$image = imagecreatefromjpeg($filename);
imagecopyresampled($image_p, $image, 0, 0, 0, 0, $width, $height, $width_orig, $height_orig);

//  Output & Content type
header('Content-type: image/jpeg');
imagejpeg($image_p, null, 100);

/* end buffered output */
ob_end_flush();
?>

---

Thanks in advance for any comments, suggestions or answers.

tedd


--
PHP General Mailing List (http://www.php.net/)
To unsubscribe, visit: http://www.php.net/unsub.php


--
-------
http://sperling.com  http://ancientstones.com  http://earthstones.com

--- End Message ---
--- Begin Message ---
Tedd,

Sorry for the floppy language. You are quite correct, the name is discrete cosine. I get too relaxed sometimes!

As to the visual impact of a degree of compression, I don't think that you can automate this. The issue surrounds the way the brain processes information. When you see something, you brain processes the visual field and looks for patters that it recognizes and then your conscious mind becomes aware of the patterns, not actually the thing you are looking at. Optical illusions can illustrate this point. For example where you see a bunch of blobs on a white background and then someone tells you it is a dog and you see the dog. Once you see the dog you can no longer 'not see it'. This is because of the way the brain processes patterns.

The trick to DCT is that in most 'organic' images - people, trees etc - the patterns for which your brain is looking actually occupy low frequencies. However, the majority of the information which is encoded into the image is in high frequencies. Consequently, by selectively removing the high frequencies, the image appears to the conscious mind to be the same whilst in reality it is degraded.

The snag come when the pattern your brain is looking to match to requires high frequencies. The classic is a edge. If one has an infinitely large white background with a single infinitely sharp line on it, you require infinite frequencies to encode it correctly (ten years ago I knew the proof for this, time and good wine has put a stop to that). This is much like the side band problem in radio transmission. If you encode an image in dimensional space rather than in frequency space you don't get this problem (hence PNG permitting perfectly sharp lines).

So - back on topic. If you take an image with sharp lines in it, then pass it through DCT twice (the process in symmetrical) but loose some of the high frequency data in the process (compression) then the result is that the very high frequency components that encode the edge are stripped off. Rather than (as one might like) this making the edge fussy, it produces what is called mosquito noise around the edges.

Because mosquito noise is nothing like what you are 'expecting' to see, the brain is very sensitive to it.

Thus, the amount you notice the compression of JPEG depends on the nature of the image you compress.

Now it gets nasty. DCT scales as a power of n (where n is the size of image) - there is a fast DCT process like the F in FFT. But it is still non linear. This means that to make the encoding and decoding of JPEG reasonably quick the image is split into blocks and each block is separately passed through the DCT process. This is fine except that it produces errors from one block to the next as to where the edges are in HSV space. Thus, as the compression is turned up, the edges of the block can become visible due to discontinuities in the color, huge and saturation at the borders. This again is sensitive to the sort of image you are compressing. For example, if it has a very flat (say black or white) background, then you will not notice. Alternatively, if the image is tonally rich, like someone's face, you will notice it a lot.

Again, this effect means that it is not really possible to automate the process of figuring out what compression setting is optimum.

As for PNG: As far as I know, the only issue with any realistic browser (other than very old ones like IE2 or something) is that the alpha channel is not supported. As there is no alpha channel in JPEG, so there is no difference. Though I do not profess to be absolutely sure that all browsers you might encounter manage PNG ok.

Side Issues:
DCT is integer. This means that if you have zero compression in the DCT process, then you get out what you put in (except if you get overflow, which can be avoided as far as I know). This is not the case in FFT where floating point errors mean you always loose something. Thus JPEG/100% should be at or near perfect (lossless) but does not actually compress.

Another area where FFT and DCT become very interesting is in moving picture processing. You can filter video using FFT or DCT in ways that are hard or impossible using spacing filters. This can be good for improving noisy or fussy 'avi' files etc.

Best wishes

AJ

PS - I'll stick the above on my nerd blog nerds-central.blogspot.com, if you have any good links to suggest to expand the subject, please let me know and I shall add them.


tedd wrote:
Alex:

Excuse for top posting:

You said: Clear as mud?

Well actually, it's simperer than I thought. After your reply, I did some reading on jpeg and found it's simply a transform, not unlike FFT where two-dimensional temporal data is transformed from the time domain to the frequency domain -- very interesting reading.

The reverse cosine matrix you mention is probably the discrete cosine transform (DCT) matrix where the x, y pixels of an image file have a z component representing color. From that you can translate the data into the frequency domain, which actually generates more data than the original.

However, the quality setting is where you make it back up in compression ratio's by trimming off higher frequencies which don't add much to the data. Unlike the FFT, the algorithm does not address phasing, which I found interesting.

However, the answer to my question deals with the quality statement. In the statement:

imagejpeg($image_p, null, 100);

I should have used something less than 100.

I've change the figure to 25 and don't see any noticeable difference in quality of the thumbnail.

It seems to me there should be a table (or algorithm) somewhere that would recommend what quality to use when reducing the size of an image via this method. In this case, I reduced an image 62 percent (38% of the original) with a quality setting of 25 and "see" no difference. I think this (the quality factor) is programmable.

As for png images, I would probably agree (if I saw comparisons), but not all browsers accept them. I belive that at least one IE has problems with png's, right?

tedd

At 4:45 PM +0100 8/23/06, Alex Turner wrote:
M Sokolewice got it nearly correct. However, the situation is a little more complex than he has discussed.

The % compression figure for jpeg is translated into the amount of information stored in the reverse cosine matrix. The size of the compressed file is not proportional to the % you set in the compressor. Thus 100% actually means store all the information in the reverse cosine matrix. This is like storing the image in a 24 bit png, but with the compressor turned off. So at 100% jpeg is quite inefficient.

The other issue is the amount of high frequency information in your images. If you have a 2000x2000 image with most of the image dynamics at a 10 pixel frequency, and you reduce this to 200x200 then the JPEG compression algorithm will 'see' approximately the same amount of information in the image :-( The reality is not quite as simple as this because of the way JPEG uses blocks etc, but it is an easy way of thinking about it.

What all this means is that as you reduce the size of an image, if you want it to retain some of the detail of the original but at a smaller size, there will be a point at which 8 or 24 bit PNG will become a better bet.

Clear as mud?

AJ

M. Sokolewicz wrote:
I'm not quite sure, but consider the following:

Considering the fact that most JPEG images are stored with some form of compression usually ~75% that would mean the original image, in actual size, is about 1.33x bigger than it appears in filesize. When you make a thumbnail, you limit the amount of pixels, but you are setting compression to 100% (besides that, you also use a truecolor pallete which adds to its size). So, for images which are scaled down less than 25% (actually this will prob. be more around 30-ish, due to palette differences) you'll actually see the thumbnail being bigger in *filesize* than the original (though smaller in memory-size)

- tul

P.S. isn't error_reporting( FATAL | ERROR | WARNING ); supposed to be error_reporting( E_FATAL | E_ERROR | E_WARNING ); ??

tedd wrote:
Hi gang:

I have a thumbnail script, which does what it is supposed to do. However, the thumbnail image generated is larger than the original image, how can that be?

Here's the script working:

http://xn--ovg.com/thickbox

And, here's the script:

<?php /* thumb from file */

/* some settings */
ignore_user_abort();
set_time_limit( 0 );
error_reporting( FATAL | ERROR | WARNING );

/* security check */
ini_set( 'register_globals', '0' );

/* start buffered output */
ob_start();

/* some checks */
if ( ! isset( $_GET['s'] ) ) die( 'Source image not specified' );

$filename = $_GET['s'];

// Set a maximum height and width
$width = 200;
$height = 200;

// Get new dimensions
list($width_orig, $height_orig) = getimagesize($filename);

if ($width && ($width_orig < $height_orig))
    {
    $width = ($height / $height_orig) * $width_orig;
    }
else
    {
    $height = ($width / $width_orig) * $height_orig;
    }

// Resample
$image_p = imagecreatetruecolor($width, $height);
$image = imagecreatefromjpeg($filename);
imagecopyresampled($image_p, $image, 0, 0, 0, 0, $width, $height, $width_orig, $height_orig);

//  Output & Content type
header('Content-type: image/jpeg');
imagejpeg($image_p, null, 100);

/* end buffered output */
ob_end_flush();
?>

---

Thanks in advance for any comments, suggestions or answers.

tedd


--
PHP General Mailing List (http://www.php.net/)
To unsubscribe, visit: http://www.php.net/unsub.php



--- End Message ---
--- Begin Message ---
Richard Lynch <mailto:[EMAIL PROTECTED]>
    on Tuesday, August 22, 2006 10:30 AM said:

> Guys, don't take this wrong but...
> 
> How do you think all the other PHP shopping carts got started?...
> 
> Pretty much the same way.
> 
> So you really need to spend the next couple months figuring out what
> they did wrong, why they did that, and how to avoid doing it...

Finally, some sanity.

--- End Message ---
--- Begin Message ---
I used to have a bookmark on where to download APC for windows. Anyone
have a link?

--- End Message ---
--- Begin Message --- At the risk of being flamed to death, I thought it was in ext in the standard windows distro. If it is not, I am stuffed if I can remember where I got it from (blush).

AJ

steve wrote:
I used to have a bookmark on where to download APC for windows. Anyone
have a link?

--- End Message ---
--- Begin Message ---
Yeah, sorry, it is missing from a test version of PHP 5.2. In the test
version, it is not available, nor is it on snaps. Likely doesn't work.

On 8/23/06, Alex Turner <[EMAIL PROTECTED]> wrote:
At the risk of being flamed to death, I thought it was in ext in the
standard windows distro.  If it is not, I am stuffed if I can remember
where I got it from (blush).

AJ

steve wrote:
> I used to have a bookmark on where to download APC for windows. Anyone
> have a link?

--
PHP General Mailing List (http://www.php.net/)
To unsubscribe, visit: http://www.php.net/unsub.php



--- End Message ---
--- Begin Message --- It's a pecl extension, so it is with all the other pecl extensions for Windows at http://pecl4win.php.net/

-Rasmus

steve wrote:
Yeah, sorry, it is missing from a test version of PHP 5.2. In the test
version, it is not available, nor is it on snaps. Likely doesn't work.

On 8/23/06, Alex Turner <[EMAIL PROTECTED]> wrote:
At the risk of being flamed to death, I thought it was in ext in the
standard windows distro.  If it is not, I am stuffed if I can remember
where I got it from (blush).

AJ

steve wrote:
> I used to have a bookmark on where to download APC for windows. Anyone
> have a link?

--
PHP General Mailing List (http://www.php.net/)
To unsubscribe, visit: http://www.php.net/unsub.php




--- End Message ---
--- Begin Message ---
Hi,

Is it possible to have the compare function in a class? I can not get it to
work, this is pseudo code:

class A {
   function getArray() {
      //dosomethingandgetanarray
      $array = blabla;
      usort($array, "$this->myCompareFunction"); 
      //Or maybe "A::myCompareFunction"
   }

   function myCompareFunction($a, $b) {
      //return rajraj depending on $a and $b values
   }
}


Right now I have keep the compare function outside of the class like this:

class A {
   function getArray() {
      //dosomethingandgetanarray
      $array = blabla;
      usort($array, "$this->myCompareFunction");
   }
}

function myCompareFunction($a, $b) {
   //return rajraj depending on $a and $b values
}

Best regards,
Peter Lauri

--- End Message ---
--- Begin Message ---
On Thu, 2006-08-24 at 03:13 +0700, Peter Lauri wrote:
> Hi,
> 
> Is it possible to have the compare function in a class? I can not get it to
> work, this is pseudo code:
> 
> class A {
>    function getArray() {
>       //dosomethingandgetanarray
>       $array = blabla;
>       usort($array, "$this->myCompareFunction"); 
>       //Or maybe "A::myCompareFunction"
>    }
> 
>    function myCompareFunction($a, $b) {
>       //return rajraj depending on $a and $b values
>    }
> }
> 
> 
> Right now I have keep the compare function outside of the class like this:
> 
> class A {
>    function getArray() {
>       //dosomethingandgetanarray
>       $array = blabla;
>       usort($array, "$this->myCompareFunction");
>    }
> }
> 
> function myCompareFunction($a, $b) {
>    //return rajraj depending on $a and $b values
> }
> 

RTF :)

usort( $array, array( $this, 'myCompareFunction' ) )

Cheers,
Rob.
-- 
.------------------------------------------------------------.
| InterJinn Application Framework - http://www.interjinn.com |
:------------------------------------------------------------:
| An application and templating framework for PHP. Boasting  |
| a powerful, scalable system for accessing system services  |
| such as forms, properties, sessions, and caches. InterJinn |
| also provides an extremely flexible architecture for       |
| creating re-usable components quickly and easily.          |
`------------------------------------------------------------'

--- End Message ---
--- Begin Message ---
Working perfect, thanks :) I did RTFM but I did miss that :)

-----Original Message-----
From: Robert Cummings [mailto:[EMAIL PROTECTED] 
Sent: Thursday, August 24, 2006 3:46 AM
To: Peter Lauri
Cc: [email protected]
Subject: Re: [PHP] usort within a class

On Thu, 2006-08-24 at 03:13 +0700, Peter Lauri wrote:
> Hi,
> 
> Is it possible to have the compare function in a class? I can not get it
to
> work, this is pseudo code:
> 
> class A {
>    function getArray() {
>       //dosomethingandgetanarray
>       $array = blabla;
>       usort($array, "$this->myCompareFunction"); 
>       //Or maybe "A::myCompareFunction"
>    }
> 
>    function myCompareFunction($a, $b) {
>       //return rajraj depending on $a and $b values
>    }
> }
> 
> 
> Right now I have keep the compare function outside of the class like this:
> 
> class A {
>    function getArray() {
>       //dosomethingandgetanarray
>       $array = blabla;
>       usort($array, "$this->myCompareFunction");
>    }
> }
> 
> function myCompareFunction($a, $b) {
>    //return rajraj depending on $a and $b values
> }
> 

RTF :)

usort( $array, array( $this, 'myCompareFunction' ) )

Cheers,
Rob.
-- 
.------------------------------------------------------------.
| InterJinn Application Framework - http://www.interjinn.com |
:------------------------------------------------------------:
| An application and templating framework for PHP. Boasting  |
| a powerful, scalable system for accessing system services  |
| such as forms, properties, sessions, and caches. InterJinn |
| also provides an extremely flexible architecture for       |
| creating re-usable components quickly and easily.          |
`------------------------------------------------------------'

--- End Message ---
--- Begin Message ---
Given that Weblogic is an application server, I don't think you're
going to have much luck.  PHP is typically installed directly on the
web server (Apache, or similar).

On 8/20/06, BKruger <[EMAIL PROTECTED]> wrote:
Could anyone please direct me to installation instructions for PHP on BEA
Weblogic 8.1?


--- End Message ---
--- Begin Message ---
I agree that it is probably pretty non standard!

You could write a bean to drive it using the java version of fcgi. But then the app server will hate you for ever as beans are not supposed to do things like open sockets etc.

I am very very interested in why you want to do such a thing :-)

AJ

Andrew Kreps wrote:
Given that Weblogic is an application server, I don't think you're
going to have much luck.  PHP is typically installed directly on the
web server (Apache, or similar).

On 8/20/06, BKruger <[EMAIL PROTECTED]> wrote:
Could anyone please direct me to installation instructions for PHP on BEA
Weblogic 8.1?


--- End Message ---
--- Begin Message ---
Everyone,

Been out of the office for a few days...

As nearly everyone has pointed out, the downside(s) to visual/audial
authentication methods are greater than the benefits


Thanks!
Chris.

--- End Message ---
--- Begin Message ---

- tul

P.S. isn't error_reporting( FATAL | ERROR | WARNING ); supposed to be error_reporting( E_FATAL | E_ERROR | E_WARNING ); ??


Good catch.

I'm not sure where I got that -- probably a message from some flounder (Bullwinkle circa 1964).

In my newer scripts I use:

ini_set('error_reporting', E_ALL | E_STRICT);

However, I'm not sure if that's redundant.

tedd
--
-------
http://sperling.com  http://ancientstones.com  http://earthstones.com

--- End Message ---
--- Begin Message ---
tedd wrote:

- tul

P.S. isn't error_reporting( FATAL | ERROR | WARNING ); supposed to be error_reporting( E_FATAL | E_ERROR | E_WARNING ); ??



Good catch.

I'm not sure where I got that -- probably a message from some flounder (Bullwinkle circa 1964).

In my newer scripts I use:

ini_set('error_reporting', E_ALL | E_STRICT);

However, I'm not sure if that's redundant.

tedd
It isn't redundant :) - E_STRICT isn't covered under E_ALL in PHP5 IIRC.

--

life is a game... so have fun.

--- End Message ---
--- Begin Message ---
Hi,

I have problems with uploading image, here is the code

if(isset($_POST['txtTitle']))
{
        $albumId   = $_POST['cboAlbum'];
        $imgTitle  = $_POST['txtTitle'];
        $imgDesc   = $_POST['mtxDesc'];

        $images    = uploadImage('fleImage', GALLERY_IMG_DIR);

        if ($images['image'] == '' && $images['thumbnail'] == '') {
                echo "Error uploading file";
                exit;
        }
        
        $image     = $images['image'];
        $thumbnail = $images['thumbnail'];
        
        if (!get_magic_quotes_gpc()) {
        $albumName  = addslashes($albumName);
        $albumDesc  = addslashes($albumDesc);
        $imgPath    = addslashes($imgPath);
    }  

        $sql = "INSERT INTO tbl_image (im_album_id, im_title, im_description,
im_image, im_thumbnail, im_date) 
                        VALUES ($albumId, '$imgTitle', '$imgDesc', '$image', 
'$thumbnail',
NOW())";

    mysql_query($sql) or die('Error, add image failed : ' . mysql_error());     
               
    
    echo
"<script>window.location.href='index.php?page=list-image&album=$albumId';</script>";
        exit;
} 

when I upload a picture return me error uploadin image.

Thanks  

-- 
View this message in context: 
http://www.nabble.com/upload-image-tf2157181.html#a5959218
Sent from the PHP - General forum at Nabble.com.

--- End Message ---

Reply via email to