τηρηση registration date

Συζητήσεις για την βάση δεδομένων MySQL και το phpMyAdmin

Συντονιστές: WebDev Moderators, Super-Moderators

Απάντηση
Serghio
Δημοσιεύσεις: 455
Εγγραφή: 08 Φεβ 2011 19:20
Τοποθεσία: Περιστέρι

τηρηση registration date

Δημοσίευση από Serghio » 30 Οκτ 2013 21:09

σκοπεύω να κρατώ το registration date στην βάση και έχω καταλήξει οτι το σχετικό column θα πρέπει να είναι timestamp.
Η σχετική εντολή πρέπει να είναι NOT NULL DEFAULT CURRENT_TIMESTAMP.
To ερώτημα είναι το εξής:

Όταν κάνω insert τα σχετικά με τον χρήστη δεδομένα(registration) κατά την εγγραφή του...το timestamp της αντίστοιχης row τίθεται αυτόματα;

Το δοκίμασα το παραπάνω και το insert query μου έβγαλε σφάλμα.Δεν το έχω ρυθμίσει το error reporting έτσι ώστε να μου δίνει παραπάνω πληροφορίες για τις ρίζες του error-πράγμα που θα κάνω βέβαια αλλά είπα να ρωτήσω έτσι και αλλιώς.

Άβαταρ μέλους
dva_dev
Script Master
Δημοσιεύσεις: 3790
Εγγραφή: 16 Σεπ 2005 01:32
Επικοινωνία:

τηρηση registration date

Δημοσίευση από dva_dev » 31 Οκτ 2013 01:42

Ναι. Αν και λογικά μέχρι τώρα θα το έχεις δοκιμάσει...
αλλά μιας και ρώτησες είπα να απαντήσω.

Serghio
Δημοσιεύσεις: 455
Εγγραφή: 08 Φεβ 2011 19:20
Τοποθεσία: Περιστέρι

τηρηση registration date

Δημοσίευση από Serghio » 31 Οκτ 2013 10:07

dva_dev έγραψε:Ναι. Αν και λογικά μέχρι τώρα θα το έχεις δοκιμάσει...
αλλά μιας και ρώτησες είπα να απαντήσω.
To λάθος που μου βγαίνει είναι αυτό:
Error code 1136, SQL state 21S01: Column count doesn't match value count at row 1

Η mysql θεωρεί λοιπόν ότι πρέπει να μπει value και για την έξτρα στήλη του registration date.
από ότι έχω καταλάβει μέχρι τώρα αυτή ή στήλη θα πρέπει κανονικά να ενημερώνεται αυτόματα...υπενθυμίζω ότι η στήλη αυτή είναι τύπου timestamp.

Serghio
Δημοσιεύσεις: 455
Εγγραφή: 08 Φεβ 2011 19:20
Τοποθεσία: Περιστέρι

τηρηση registration date

Δημοσίευση από Serghio » 31 Οκτ 2013 10:19

το εφτιαξα...

alou
Script Master
Δημοσιεύσεις: 1374
Εγγραφή: 24 Αύγ 2007 19:52
Επικοινωνία:

τηρηση registration date

Δημοσίευση από alou » 31 Οκτ 2013 12:50

Το σφάλμα απολύτως λογικά να συμβαίνει, ακόμα και αν ενημερωνόταν αυτόματα σε κάθε αλλαγή με το current timestamp ή αν ήταν auto increment, θα έπρεπε να στέλνεις έστω ένα άδειο string

πχ auto increment id, username, pass, updated:
('', 'username', 'password, '')

Serghio
Δημοσιεύσεις: 455
Εγγραφή: 08 Φεβ 2011 19:20
Τοποθεσία: Περιστέρι

τηρηση registration date

Δημοσίευση από Serghio » 31 Οκτ 2013 13:00

alou έγραψε:Το σφάλμα απολύτως λογικά να συμβαίνει, ακόμα και αν ενημερωνόταν αυτόματα σε κάθε αλλαγή με το current timestamp ή αν ήταν auto increment, θα έπρεπε να στέλνεις έστω ένα άδειο string

πχ auto increment id, username, pass, updated:
('', 'username', 'password, '')
Eτσι...εν προκειμένω έστειλα NULL.
Αυτό που δεν καταλαβαίνω βέβαια είναι πως μπορεί να γίνει αναζήτηση με βάση το timestamp, ότι θέλω να δω τους χρήστες π.χ που εγγράφηκαν μετά από τότε

alou
Script Master
Δημοσιεύσεις: 1374
Εγγραφή: 24 Αύγ 2007 19:52
Επικοινωνία:

τηρηση registration date

Δημοσίευση από alou » 31 Οκτ 2013 14:34

Αν υποθέσουμε ότι φτιάχνεις ένα date object με το τότε, πχ μετά την 1/9/13

Κώδικας: Επιλογή όλων

$tote = date('Y-m-d H:i:s', mktime(0, 0, 0, 9, 1, 2013));

$query = "SELECT * FROM table
WHERE timestamp_column > ".$tote;
Υπάρχουν όμως και στην MySQL date / time functions που ίσως βολέψουν κατά περίπτωση.
http://dev.mysql.com/doc/refman/5.1/en/ ... tions.html

gvre
Δημοσιεύσεις: 992
Εγγραφή: 14 Οκτ 2010 11:34
Τοποθεσία: Ηράκλειο Κρήτης
Επικοινωνία:

τηρηση registration date

Δημοσίευση από gvre » 31 Οκτ 2013 15:34

Serghio έγραψε:
alou έγραψε:Το σφάλμα απολύτως λογικά να συμβαίνει, ακόμα και αν ενημερωνόταν αυτόματα σε κάθε αλλαγή με το current timestamp ή αν ήταν auto increment, θα έπρεπε να στέλνεις έστω ένα άδειο string

πχ auto increment id, username, pass, updated:
('', 'username', 'password, '')
Eτσι...εν προκειμένω έστειλα NULL.
Όταν ένα πεδίο παίρνει μια default τιμή, τότε δε χρειάζεται να το έχεις στο query σου.
πχ.

Κώδικας: Επιλογή όλων

INSERT INTO users(username, pass) VALUES ('username', 'pass');
Το πεδίο id θα πάρει τιμή αυτόματα. Εννοείται ότι δε γράφεις ποτέ insert query χωρίς να συμπεριλάβεις τα ονόματα των πεδίων.
πχ.

Κώδικας: Επιλογή όλων

INSERT INTO users VALUES ('', 'username', 'pass');
ή κάτι τέτοιο, γιατί μόλις χρειαστεί να προσθέσεις ένα πεδίο στη βάση θα σταματήσουν να λειτουργούν τα queries σου.

Serghio
Δημοσιεύσεις: 455
Εγγραφή: 08 Φεβ 2011 19:20
Τοποθεσία: Περιστέρι

τηρηση registration date

Δημοσίευση από Serghio » 31 Οκτ 2013 21:36

gvre έγραψε: Όταν ένα πεδίο παίρνει μια default τιμή, τότε δε χρειάζεται να το έχεις στο query σου.
πχ.
Εδώ μπερδεύτηκα λίγο.
στο column που ορίσει ως timestamp έχω ορίσει σαν default CURRENT_TIMESTAMP...πάραυτα πρέπει να βάζω null στο query για ανανεώνεται το timestamp στην row που γίνεται insert εκείνη την στιγμή.

Αυτό που λες παραπάνω πως "κολλάει" στην περίπτωση του timestamp;

Άβαταρ μέλους
dva_dev
Script Master
Δημοσιεύσεις: 3790
Εγγραφή: 16 Σεπ 2005 01:32
Επικοινωνία:

τηρηση registration date

Δημοσίευση από dva_dev » 31 Οκτ 2013 22:01

Το insert statement που τρέχεις ποιό είναι;

Serghio
Δημοσιεύσεις: 455
Εγγραφή: 08 Φεβ 2011 19:20
Τοποθεσία: Περιστέρι

τηρηση registration date

Δημοσίευση από Serghio » 31 Οκτ 2013 22:14

dva_dev έγραψε:Το insert statement που τρέχεις ποιό είναι;
Aυτό είναι το query:

Κώδικας: Επιλογή όλων

insert into users values (NULL,'" .$name. "','" .$lastname . "','".$email."','". $passwd."','". $hash."','".$usertype."',NULL)");
Όπως είπα αν δεν μπει το NULL στο τέλος(το οποιο αντιστοιχεί στην στήλη με column type ΤΙΜΕSTAMP) βγαίνει σφάλμα.
Όπως είπα η συγκεκριμένη στήλη έχει σαν default CURRENT_TIMESTAMP

gvre
Δημοσιεύσεις: 992
Εγγραφή: 14 Οκτ 2010 11:34
Τοποθεσία: Ηράκλειο Κρήτης
Επικοινωνία:

τηρηση registration date

Δημοσίευση από gvre » 31 Οκτ 2013 22:19

Όπως έγραψα παραπάνω, δε γράφεις ποτέ insert query χωρίς να συμπεριλάβεις τα ονόματα των πεδίων. Δες τα παραδείγματα που έχω γράψει.
Με την ευκαιρία, καλό είναι να δεις λίγο τα prepared statements.

Άβαταρ μέλους
dva_dev
Script Master
Δημοσιεύσεις: 3790
Εγγραφή: 16 Σεπ 2005 01:32
Επικοινωνία:

τηρηση registration date

Δημοσίευση από dva_dev » 31 Οκτ 2013 22:30

Όπως έχει πει (και μάλλον θα το ξαναπεί) ο gvre, το statement πρέπει να γίνει κάπως έτσι

Κώδικας: Επιλογή όλων

$insertsql = 'insert into users (name, lastname, email, password, hash, usertype) values' .
             "('$name','$lastname','$email','$passwd','$hash','$usertype')";
mysql_blablabla...
Τα prepared statements που ανέφερε μην σε μπερδέψουν, λύνουν άλλα προβλήματα που μπορεί να έχεις.

Serghio
Δημοσιεύσεις: 455
Εγγραφή: 08 Φεβ 2011 19:20
Τοποθεσία: Περιστέρι

τηρηση registration date

Δημοσίευση από Serghio » 31 Οκτ 2013 23:28

dva_dev έγραψε:Όπως έχει πει (και μάλλον θα το ξαναπεί) ο gvre, το statement πρέπει να γίνει κάπως έτσι

Κώδικας: Επιλογή όλων

$insertsql = 'insert into users (name, lastname, email, password, hash, usertype) values' .
             "('$name','$lastname','$email','$passwd','$hash','$usertype')";
mysql_blablabla...
Τα prepared statements που ανέφερε μην σε μπερδέψουν, λύνουν άλλα προβλήματα που μπορεί να έχεις.
Δηλαδή υπάρχουν 2 τύποι insert statement;
Και πως ο τρόπος που φαίνεται στο παραπάνω παράδειγμα λύνει το πρόβλημα να μην ξαναγράφω τα queries στην περίπτωση που προσθέσω στον πίνακα πεδίο(column);

Όσον αφορά τα prepared statements τα έχω υπόψη μου αλλά απλώς με ενοχλεί που για να εκτελεστεί ένα query χρειάζονται τόσες εντολές(bind, execute....κλπ)...αργά ή γρήγορα βέβαια θα στραφώ σε αυτά για λόγους ασφάλειας.

gvre
Δημοσιεύσεις: 992
Εγγραφή: 14 Οκτ 2010 11:34
Τοποθεσία: Ηράκλειο Κρήτης
Επικοινωνία:

τηρηση registration date

Δημοσίευση από gvre » 31 Οκτ 2013 23:37

Yπάρχει περίπτωση να προσθέσεις πεδίο στη βάση και να μη χρειαστεί να αλλάξεις τα queries;

Για το 2ο, μπορείς να χρησιμοποιήσεις ένα database abstraction layer και να κάνεις τη ζωή σου πιο εύκολη.

Απάντηση

Επιστροφή στο “MySQL”

Μέλη σε σύνδεση

Μέλη σε αυτήν τη Δ. Συζήτηση: Δεν υπάρχουν εγγεγραμμένα μέλη και 1 επισκέπτης