How to insert data dynamically in MySQL - php

I need to record the date each event happens. I have this table.
Click here to view the table
NULL spaces are available to save a new date.
The X represents the date that the event occurred.
The problem is I do not know how to update the date each event occurs
I need to know the best option if you use INSERT or UPDATE querys.
Thank you for your help

If you just want to update a column in a table with the current time:
UPDATE `yourtable` SET `yourcolumn` = NOW() WHERE `ID` = yourid
Assuming your columns are DATETIME() columns.
As an aside, it's best to have event-related information in another relationship table. This way you can link multiple events for each row in your main table. This provides a more accurate data-trail for accounting purposes (or in other words, you can see each and every update without overwriting anything).

If you are seeking to have a 'last_modified' column on your table to help you keep track of changes made on your records, you should do this:
ALTER TABLE my_table
ADD last_modified TIMESTAMP
DEFAULT CURRENT_TIMESTAMP
ON UPDATE CURRENT_TIMESTAMP;
Basically what it does is to add a 'last_modified' column, Set it to be a timestamp and make it to be updated with the current timestamp when there is an update on the record.

Related

mySQL `date_updated` column only for specific fields: SELECT and INSERT vs TRIGGER?

I have a bunch of resources that are stored in a MySQL db.
Each have a date_modified field that was set to ON UPDATE CURRENT_TIMESTAMP.
however, there are now columns on those tables that we DON'T want to trigger the date_modified.
From what I can see there are 2 options. (excluding refactoring the tables)
1) Before the update, load the current entity back from the DB, check if the fields have changed, and set the date_modified based on that.
2) Create a TRIGGER for each table that will check the NEW fields against the OLD fields and set the time stamp.
I'm torn between the two approaches.
1 will have a bigger overhead, as it has to perform 2 queries.
2 helps maintain data integrity, but potentially could cause issues later as it masks some of the application logic. If a new field is added at a later date, the dev will have to remember to also update the trigger to to ensure it updates the modified column.
Is there a third approach? Somehow in the UPDATE check if the values have changed and then update the date_modified?
Or any other ways to approach this?
There's a third choice. Mention the date_modified column in the UPDATE query.
For example,
UPDATE some_table
SET some_column = 'new value',
date_modified = date_modified
WHERE id = some_id_value
This will change the row in the table while preserving the date_modified value.

MySQL insert date if no field exists

Is there a way in MySQL to get insert date/time for rows if there was no insert_date field. I have a database which I configured to store insert_date but can I populate the field before that change ( month ago ). Is that even possible?
Pull that insert date/time from log or something else?
Nope. If that date wasn't stored before, it's impossible to find out when a row was inserted. The best you can do is just pick a date, or maybe make a rough estimate if you have information to base that on (for instance, the create date of a customer might be related to the date of their first invoice)..
By the way, you can add timestamp columns and specify the clause DEFAULT CURRENT_TIMESTAMP to set a timestamp as soon as you insert the row. That way, you don't need a trigger to update the row.
You can even add a clause ON UPDATE CURRENT_TIMESTAMP so the column (or a different column) is updated automatically too.
See Timestamp initialization for more information about this subject.
This doesn't change the fact, though, that you cannot get those values for rows that already exist.

How to get DATETIME of the row inserted into Table

I need to display number of users created from last login to current login in my ELGG application, but there is no field in the ElggUser to record the date & time of users created (ElggUser Table Structure).
So is there any way to get DATETIME of rows already inserted into Table?
Thank You
Database schema of Elgg does contain this information. ElggUser extends ElggEntity that has attributes time_created, time_updated, last_action containing Unix timestamps representation of entity creation/modification/last action by this entity or on related content.
These attributes are stored in {DB_PREFIX}entities table and are availible as properties of all ElggEntity subclasses.
You have to add a field for recording date and time. For instance my table name is my_table and for date time using created_date then create a trigger as:
DELIMITER ;;
CREATE TRIGGER `my_table_bi` BEFORE INSERT ON `my_table` FOR EACH ROW
BEGIN
SET NEW.created_date = NOW();
END;;
DELIMITER ;
Every time for added record the trigger will hit recording the date and time of entry
Don't know, if you can alter your table, but you could add a created column like this:
ALTER TABLE yourTable ADD COLUMN created timestamp DEFAULT CURRENT_TIMESTAMP;
The column created would then always have the time when a row gets inserted without further ado.

How to get time since MySQL database last edited in PHP

I need to know the time since a table in my MySQL database was edited. Is there any way to do this in PHP? The only way I can think of is to get the update time, and compare it to the current time (which will be a little bothersome).
SELECT TIMEDIFF(CURRENT_TIME, UPDATE_TIME)
FROM INFORMATION_SCHEMA.TABLES
WHERE TABLE_SCHEMA = DATABASE() AND TABLE_NAME = 'my_table'
One solution would be to add a timestamp field, that is automatically updated whenever a row is changed.
Then you can find the last change time by selecting the last update value:
# Add a timestamp column:
ALTER TABLE [TABLENAME] add column `ts_update` timestamp NOT NULL default CURRENT_TIMESTAMP on update CURRENT_TIMESTAMP;
# Get the last update value:
SELECT MAX(ts_update) from [TABLENAME];
It's a bit of a pain since SHOW TABLE STATUS doesn't seem to return a standard result set. Every way I tried to use it as a subquery failed. It seems like you'll need to figure it out programmatically.
SHOW TABLE STATUS
WHERE name = 'target_table';
And if you're concerned about the timezone just do a separate SELECT NOW() to get the time the mysql server has.
Note: This will only show you the time at which the table schema was updated. If you want to know when the last time a row was inserted/edited you'll have to add a timestamp column like Amirshk suggested.

How to add date with PHP/MySQL?

I want to automatically add date in order_date field when a customer checkouts my online shop.
What is the best way to do it?
There are other fields like, delivery data and payment date in the same table.
Is it good idea to add a hidden field so that when a cutomer submit, the date will be added?
But I am not sure how to do it.
Can anyone suggests me the better way to do it please?
No, you don't need a hidden form field. You can do this directly in MySQL.
Assuming that your order_date field is a DATE. DATETIME or TIMESTAMP, then in your SQL that inserts the order record, simply put NOW() as the value for order_date:
INSERT INTO orders (x,y,z,order_date) VALUES ('x','y','z',NOW());
In the update statement that finalizes your order record, do something like this:
update order set ....., order_date = now() where ...
You don't want to rely on client-side date anyway. It could be off, and think of the timezones. You want a single source of dates in your system, and that should be either the database or the server-side code layer (PHP or what have you).
When a customer places an order you can use a TIMESTAMP column to track when the order was placed / the order was saved the database. Something like:
ALTER TABLE sales_order ADD COLUMN date_placed TIMESTAMP DEFAULT CURRENT_TIMESTAMP;
The DEFAULT CURRENT_TIMESTAMP will be filled with the current time when the row is created, but not on subsequent updates. See the docs for more:
http://dev.mysql.com/doc/refman/5.0/en/timestamp.html
With a DEFAULT CURRENT_TIMESTAMP
clause and no ON UPDATE clause, the
column has the current timestamp for
its default value but is not
automatically updated.

Categories