Question: For example, let say a user purchase product called `soap` with price of `1.50` on `20th sept 2012`. This have been recorded on database under `purchase` table with `productID` and `date`.

Let say on 22nd sept 2012, the admin changed the price of `soap` to `1.20`, now the report price is changed because of this.

What is the best approach to make sure that old data of `1.50` is stored for old reports and `1.20` for new reports. Should i insert all data including, product name, product price onto `purchase` table?

Answer: 
The simple answer to your questions is yes. 

When it comes to financial systems, well any systems that may be required to be audited "transactions" should be stored in their entirety in a "document" or "record". 

There are other methods such as recording each deletion or modification with "flags" (E.G. current, deleted, modified, etc), "from\_date" and "to\_date" instead of actually deleting or modifying the data from the database, however this will use more server resources and the programming is significantly more complicated not only in mySQL but PHP also. But it allows you to provide only a relationship between records at the same time. 

My suggestion is to keep it simple and store all required data in a single record. You will save time and legally, should the system ever need to be audited you're much safer. 

Good luck and I hope it helps!
I normally store the price for the product on the purchase table with the productID and date, or if you can have multiple items in the cart, you will have a purchase table and a purchase\_product table. This was if you ever add coupon codes or anything else like that you will always be able to see what the person paid for the item on that particular purchase.