MySQL [timestamps][1]:

- Are stored in [UTC][2]

    They are converted to UTC on storage and converted back to your time zone on retrieval. If you [change time zone settings][3], the retrieved values also change.

- Can be automatically initialised and updated

    You can set their default value and / or auto update value to `CURRENT_TIMESTAMP`

- Have a range of `1970-01-01 00:00:01 UTC` to `2038-01-19 03:14:07 UTC`

Whereas MySQL [datetime][4]:

- What you store is what you get ™.

- Have a range of `1000-01-01 00:00:00` to `9999-12-31 23:59:59` 

    Values outside the range may work - but only values within the range are _guaranteed_ to work.

- You can store dates where day or month is zero. 

   This is the MySQL way of storing birthdays! You can't do that with a `TIMESTAMP`, with the only exception being the zero value of `0000-00-00`.

- You can store invalid dates, if you need them, in [ALLOW_INVALID_DATES][5] mode.

- You can set default value to `NOW()` in some instances, but the preferable and more natural way of automatically initialised and updated dates is `TIMESTAMP`.

And of course there are also `DATE` and `TIME`, which work just like `DATETIME`, but of course `DATE` doesn't care for time and `TIME` doesn't care for date. All four data types work perfectly with the wide array of [date and time functions][6], but when you are mixing data types you should be aware of [conversion effects][7]. 

Now, to your question: You should use `DATETIME` everywhere. Not for technical reasons, but since you are still unclear on how MySQL works, `DATETIME` is the simpler choice. This will mean that you will have to calculate the current timestamp in PHP before storing, that's as easy as:

    $mysqldate = date("Y-m-d H:i:s"); 

PHP's [date function][8] works like: 

    string date ( string $format [, int $timestamp = time() ] )

The `"Y-m-d H:i:s"` format is the one compatible with MySQL and by leaving the second parameter empty, `date()` calls `time()` to get the current [UNIX timestamp][9].

Using a `TIMESTAMP` instead of a `DATETIME` has the added value of MySQL taking over the responsibility of deciding on the current timestamp, and you can skip the field when you are inserting / updating. But since you are already sending a query, and the code to get the current timestamp in PHP is minimal, you can safely go with `DATETIME` for everything.

As for the actual code to store the PHP timestamp into the database, you should look at [PHP Data Objects][10], and if you are still unclear, ask on [StackOverflow][11] instead. But there are [almost 1.5k related questions][12] already, make sure you go through them before asking. Just a hint, [prepared statements][13] is how the cool kids do it. 

  [1]: http://dev.mysql.com/doc/refman/5.1/en/timestamp.html
  [2]: http://en.wikipedia.org/wiki/Coordinated_Universal_Time
  [3]: http://dev.mysql.com/doc/refman/5.5/en/time-zone-support.html
  [4]: http://dev.mysql.com/doc/refman/5.1/en/datetime.html
  [5]: http://dev.mysql.com/doc/refman/5.1/en/server-sql-mode.html#sqlmode_allow_invalid_dates
  [6]: http://dev.mysql.com/doc/refman/5.5/en/date-and-time-functions.html
  [7]: http://dev.mysql.com/doc/refman/5.1/en/date-and-time-type-conversion.html
  [8]: http://php.net/manual/en/function.date.php
  [9]: http://en.wikipedia.org/wiki/Unix_time
  [10]: http://php.net/manual/en/book.pdo.php
  [11]: http://stackoverflow.com/
  [12]: http://stackoverflow.com/questions/tagged/pdo
  [13]: http://www.php.net/manual/en/pdo.prepared-statements.php