2012-03-23 20 views
38

का उपयोग कर किसी फ़ील्ड में अब() का उपयोग करके वर्तमान दिनांक/समय डालें क्योंकि MySQL स्पष्ट रूप से टिप्पणियों के आधार पर कुछ अन्य डेटाबेस जैसे नए रिकॉर्ड जोड़ने में डेटाटाइम फ़ील्ड में फ़ंक्शन को स्वचालित रूप से सम्मिलित नहीं कर सकता है, मैं हूं स्पष्ट रूप से एक SQL कथन का उपयोग करके इसे सम्मिलित करने का प्रयास कर रहा है। (लोग सोचते हैं कि दही के साथ टाइमस्टैम्प() टाइमस्टैम्प की विभिन्न सीमाओं के कारण उत्तर नहीं है।) वेब पर कई लेख हैं जो अब डालने का सुझाव देते हैं() एसक्यूएल का उपयोग करके काम करना चाहिए।MySQL/PHP

जब मैं SQL कथन का उपयोग कर दिनांक समय सम्मिलित करने का प्रयास करता हूं, हालांकि, फ़ील्ड वर्तमान समय/दिनांक के साथ पॉप्युलेट नहीं करता है, लेकिन यह केवल मुझे डिफ़ॉल्ट 0000-00- आदि देता है, यह शायद एक वाक्यविन्यास है त्रुटि, लेकिन यह मुझे पागल कर रहा है, इसलिए मैं इसे पोस्ट कर रहा हूं।

mysql_query("INSERT INTO users (first, last, whenadded) VALUES ('$first', '$last', now())"; 

यह पहली और आखिरी सम्मिलित करता है, लेकिन जब जोड़ा के लिए कुछ भी नहीं है, whenadded क्षेत्र में 0000-00-00, आदि हो जाता है।

फ़ील्ड प्रकार डेटाटाइम है, इसमें कोई संयोजन, विशेषताएँ, शून्य डिफ़ॉल्ट या अतिरिक्त नहीं है। बीटीडब्लू, मैंने अब सिंगल कोट्स में डालने की कोशिश की ... यह एक त्रुटि फेंक दी।

+3

अजीब है, जो आपको दिखाया जाना चाहिए। क्या आप वाकई उचित डेटाटाइम फ़ील्ड हैं? वैसे भी, टिप्पणियां गलत हैं, आप इसे 'DEFAULT CURRENT_TIMESTAMP' और' UPDATE CURRENT_TIMESTAMP 'पर उपयोग कर स्वचालित कर सकते हैं http://dev.mysql.com/doc/refman/5.0/en/timestamp-initialization.html –

+0

क्या काम करता है TIMESTAMP (CURRENT_TIMESTAMP) डेटाटाइम के लिए भी काम करता है? http://bugs.mysql.com/bug.php?id=27645 लोग टाइमस्टैंप से दूर शर्मिंदा हैं क्योंकि लोग इसकी तिथि सीमाओं के रूप में वर्णन करते हैं। फ़ील्ड प्रकार – user1260310

+0

उग, मेरी गलती को रीसेट करने का प्रयास करेगा। माफ़ कीजिये। यह वास्तव में केवल TIMESTAMP फ़ील्ड के लिए काम करता प्रतीत होता है, जो शर्म की बात है। लेकिन ऊपर दिखाए गए प्रश्न * को * –

उत्तर

7

पेक्का की तरह, यह इस तरह से काम करना चाहिए। मैं इस संयमी उदाहरण के साथ समस्या को पुन: नहीं कर सकते हैं:

<?php 
    $pdo = new PDO('mysql:host=localhost;dbname=test;charset=utf8', 'localonly', 'localonly'); 
    $pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); 
    $pdo->setAttribute(PDO::ATTR_EMULATE_PREPARES, false); 

    $pdo->exec(' 
     CREATE TEMPORARY TABLE soFoo (
      id int auto_increment, 
      first int, 
      last int, 
      whenadded DATETIME, 
      primary key(id) 
     ) 
    '); 
    $pdo->exec('INSERT INTO soFoo (first,last,whenadded) VALUES (0,1,Now())'); 
    $pdo->exec('INSERT INTO soFoo (first,last,whenadded) VALUES (0,2,Now())'); 
    $pdo->exec('INSERT INTO soFoo (first,last,whenadded) VALUES (0,3,Now())'); 

    foreach($pdo->query('SELECT * FROM soFoo', PDO::FETCH_ASSOC) as $row) { 
     echo join(' | ', $row), "\n"; 
    } 

कौन सा (वर्तमान में) प्रिंट

1 | 0 | 1 | 2012-03-23 16:00:18 
2 | 0 | 2 | 2012-03-23 16:00:18 
3 | 0 | 3 | 2012-03-23 16:00:18 

और यहाँ है (लगभग) एक ही स्क्रिप्ट एक टाइमस्टैम्प क्षेत्र और डिफ़ॉल्ट CURRENT_TIMESTAMP का उपयोग कर:

<?php 
    $pdo = new PDO('mysql:host=localhost;dbname=test;charset=utf8', 'localonly', 'localonly'); 
    $pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); 
    $pdo->setAttribute(PDO::ATTR_EMULATE_PREPARES, false); 

    $pdo->exec(' 
     CREATE TEMPORARY TABLE soFoo (
      id int auto_increment, 
      first int, 
      last int, 
      whenadded TIMESTAMP DEFAULT CURRENT_TIMESTAMP, 
      primary key(id) 
     ) 
    '); 
    $pdo->exec('INSERT INTO soFoo (first,last) VALUES (0,1)'); 
    $pdo->exec('INSERT INTO soFoo (first,last) VALUES (0,2)'); 
    sleep(1); 
    $pdo->exec('INSERT INTO soFoo (first,last) VALUES (0,3)'); 

    foreach($pdo->query('SELECT * FROM soFoo', PDO::FETCH_ASSOC) as $row) { 
     echo join(' | ', $row), "\n"; 
    } 

सुविधाजनक रूप से, टाइमस्टैम्प को उसी उदाहरण के रूप में उसी डेटाटाइम स्ट्रिंग प्रस्तुति में परिवर्तित किया जाता है - कम से कम मेरे PHP/PDO/mysqlnd संस्करण के साथ।

65

अब() सामान्य रूप से SQL कथन में काम करता है और दिनांक और समय देता है। जांचें कि क्या आपके डेटाबेस फ़ील्ड में सही प्रकार है (डेटाटाइम)। अन्यथा, आप कभी PHP तारीख() फ़ंक्शन का उपयोग करें और सम्मिलित कर सकते हैं:

date('Y-m-d H:i:s') 

लेकिन मैं इस की सिफारिश नहीं होगा।

+3

-1 काम करना चाहिए: अब() DATETIME प्रकार के लिए काम नहीं करता है। यह केवल TIMESTAMP के लिए काम करता है। तो मैं इसके लिए PHP का उपयोग करने की सलाह देता हूं (DATETIME प्रकार का उपयोग करते समय)। –

+21

@IvoPereira वास्तव में, 'अब()' 'DATETIME' के लिए काम करता है। टाइमस्टैम्प उत्पन्न करने के लिए PHP का उपयोग करना एक खराब समाधान नहीं है। लेकिन php और MySQL सर्वर चलाने वाले सर्वरों के बीच टाइमज़ोन सिंक होने की आवश्यकता है। –

+0

असल में यह वर्तमान दिनांक, समय या दोनों के लिए इष्टतम दृष्टिकोण है। –

1

मेरे लिए ये काम ठीक दोनों ...

<?php 
    $db = mysql_connect('localhost','user','pass'); 
    mysql_select_db('test_db'); 

    $stmt = "INSERT INTO `test` (`first`,`last`,`whenadded`) VALUES ". 
      "('{$first}','{$last}','NOW())"; 
    $rslt = mysql_query($stmt); 

    $stmt = "INSERT INTO `users` (`first`,`last`,`whenadded`) VALUES ". 
      "('{$first}', '{$last}', CURRENT_TIMESTAMP)"; 
    $rslt = mysql_query($stmt); 

?> 

साइड नोट: mysql_query() सबसे अच्छा तरीका है PHP के वर्तमान संस्करण में MySQL से कनेक्ट करने के लिए नहीं है।

+0

सभी को धन्यवाद! मुझे बेवकूफ गलती मिली .. डिबगिंग में मैंने क्वेरी के गलत संस्करण पर टिप्पणी की। ओह। बीटीडब्ल्यू, अगर mysql_query नहीं है तो क्वेरी निष्पादित करने का पसंदीदा तरीका क्या है। – user1260310

6

एकमात्र कारण मैं सोच सकता हूं कि आप इसे 'now()' स्ट्रिंग के रूप में जोड़ रहे हैं, फ़ंक्शन कॉल now() पर नहीं।
या जो कुछ भी टाइपो।

SELECT NOW(); 

यह देखने के लिए कि क्या यह सही मूल्य देता है?

mysql_query("INSERT INTO users (first, last, whenadded) VALUES ('$first', '$last', now())");

नोट पिछले कोष्ठकों कि:

13

आप mysql_query आदेश बंद करने के लिए भूल गया था।

1

SYSDATE() के बारे में क्या?

<?php 
    $db = mysql_connect('localhost','user','pass'); 
    mysql_select_db('test_db'); 

    $stmt = "INSERT INTO `test` (`first`,`last`,`whenadded`) VALUES ". 
      "('{$first}','{$last}','SYSDATE())"; 
    $rslt = mysql_query($stmt); 
?> 

अब के बारे में अधिक जानकारी के लिए Difference between NOW(), SYSDATE() & CURRENT_DATE() in MySQL पर देखो() और SYSDATE()।

2

अब()

मेरे लिए काम किया। लेकिन मेरा फ़ील्ड प्रकार दिनांक केवल और आपका डेटाटाइम है। मुझे यकीन नहीं है कि यह मामला

+0

यह निश्चित रूप से MySQL में सभी दिनांक प्रकार कॉलम के लिए काम करेगा, मैं पिछले तीन वर्षों से इसका उपयोग कर रहा हूं – Michael