2009-02-28 24 views
8

उपयोगकर्ता अपनी तिथि 3 ड्रॉपडाउन (दिन, महीना, वर्ष) से ​​चुनते हैं। मैं '2008-12-30' जैसी स्ट्रिंग बनाने के लिए उन्हें सर्वर-साइड पर जोड़ दूंगा। फिर मैं यह सुनिश्चित करने के लिए मान्य कैसे कर सकता हूं कि यह दिनांक सही प्रारूप/संख्यात्मक, आदि में था?PHP में एक MYSQL दिनांक को कैसे सत्यापित करें?

+0

क्या आप इसे थोड़ा सा हल कर सकते हैं; यह पूरी तरह से स्पष्ट नहीं है कि आप क्या कर रहे हैं। क्या आप क्वेरी से आने वाली तारीख को सत्यापित करना चाहते हैं, या आप डेटाबेस में डालने से पहले व्यक्तिगत घटकों को सत्यापित करना चाहते हैं? – Rob

+0

मैं तिथि के घटकों को गठबंधन करना चाहता हूं और डेटाबेस के विरुद्ध संयुक्त तिथि को मान्य करना चाहता हूं। –

+1

यह क्यों कम किया गया था? –

उत्तर

6

यदि वे 3 अलग-अलग ड्रॉप-डाउन हैं, तो आपको उन्हें तीन अलग-अलग मानों के रूप में सत्यापित करने की आवश्यकता होगी।

Ie,

  • मान्य है कि वर्ष स्तंभ में संख्यात्मक और के बीच जो कुछ भी साल अपने अनुप्रयोग
  • मान्य में मान्य हैं कि महीने के स्तंभ में संख्यात्मक
  • मान्य है उस दिन स्तंभ संख्यात्मक
  • है
  • सत्यापित करें कि वे चेकडेट()

का उपयोग करके सभी वैध मान हैं या, आप उन्हें केवल अल एल पूर्णांक करने के लिए, उन्हें एक तारीख में एक साथ संयोजित करें, और देखें कि परिणामस्वरूप दिनांक मान्य है या नहीं। यानी,

$time = mktime(0, 0, 0, (int)$_POST['month'], (int)$_POST['day'], (int)$_POST['year']); 

// in this example, valid values are between jan 1 2000 (server time) and now 
// modify as required 
if ($time < mktime(0, 0, 0, 1, 1, 2000) || $time > time()) 
    return 'Invalid!'; 

$mysqltime = date('Y-m-d', $time); 

// now insert $mysqltime into database 

इस विधि के लिए नकारात्मक पक्ष यह है कि यह केवल यूनिक्स टाइमस्टैम्प रेंज यानी 1970 के भीतर दिनांकों 2038 या तो करने के लिए के साथ काम करेंगे है।

+0

आप शायद यह जांचना चाहते हैं कि यह एक पूर्णांक है, न कि यह संख्यात्मक है। is_numeric फ्लोट्स के साथ-साथ पूर्णांक के लिए भी सही है, लेकिन is_int केवल पूर्णांक के लिए जांचता है। – gpojd

+0

is_int() उपयोगकर्ता द्वारा सबमिट किए गए चर, यानी $ _POST में चर, पर काम नहीं कर सकता है, क्योंकि ये हमेशा प्रकार की स्ट्रिंग हैं। हालांकि, आप उन्हें (int) $ _ POST ['var'] का उपयोग करके पूर्णांक में डाल सकते हैं और फिर मूल स्ट्रिंग मान (== का उपयोग करके) की तुलना में इसकी तुलना कर सकते हैं। – thomasrutter

2

आप देख सकते हैं कि दिनांक checkdate का उपयोग कर वैध है। यदि आप यह सुनिश्चित करना चाहते हैं कि मान संख्यात्मक और सही लंबाई हैं, तो आप दिनांक बनाने से पहले is_int ctype_digit और strlen संयोजन के रूप में कुछ सरल कर सकते हैं।

// untested 
if(!ctype_digit)($month) || strlen($month) != 2) { 
    // handle error 
} 
// repeat for $day and $year 
if (checkdate($month, $day, $year) { 
    // do your work 
} 
+0

मैंने thomasrutter की टिप्पणी के आधार पर is_int से ctype_digit से अपना जवाब बदल दिया है कि is_int POST चर को सही तरीके से संभाल नहीं पाएगा। – gpojd

-1

यदि आपके पास तीन ड्रॉपडाउन हैं तो ड्रॉपडाउन से आने वाले मान हमेशा संख्याएं होनी चाहिए क्योंकि आप महीने से जुड़े मानों को नियंत्रित करते हैं (नीचे दिखाए गए)। इसके बाद यह निष्कर्ष निकाला जाएगा कि संयुक्त परिणाम वैध है।

<option value="01">January</option> 

आप इस तरह के रूप में ड्रॉप-डाउन का में सहायता प्रविष्टियों प्रदान प्रदान करते हैं "एक महीने का चयन करें" तो आप उस मान 0 बनाने के लिए और यह सुनिश्चित करें कि मान प्रत्येक ड्रॉप बॉक्स से आने वाले शून्य से अधिक है सकते हैं।

संभावना है कि कोई अन्य मूल्य प्रदान करने के लिए HTML फॉर्म को बदल देगा। यदि यह एक चिंता है तो आप यह सुनिश्चित करने के लिए PHP फ़ंक्शन ctype_digit() का उपयोग कर सकते हैं कि प्रत्येक मान वास्तव में एक संख्यात्मक अंक है।

यदि आपकी चिंता यह है कि तिथि वास्तव में checkdate() फ़ंक्शन का उपयोग करने के लिए मान्य है।

+0

फॉर्मों के उपयोग के बिना एक स्क्रिप्ट में पोस्ट करना संभव है। मैं एक बॉट लिख सकता हूं जो फ़ॉर्म के उपयोग के बिना प्रत्येक फ़ील्ड के लिए आपके फॉर्म में पोस्ट करता है और पोस्ट करता है। –

+0

यह सच है यही कारण है कि ctype_digit() और checkdate() का उपयोग करने का सुझाव समझ में आता है। मैं इस बयान पर अपना जवाब दे रहा था कि आपके पास एक फॉर्म था। यहां तक ​​कि यदि आप एक स्क्रिप्ट का उपयोग करते हैं, तो इस उदाहरण में कई मामले नहीं हैं जिसमें यह रूपों में मानों का उपयोग नहीं करेगा। – Paulo

1

बस एक ही समस्या थी। मैंने एक छोटा सा कार्य लिखा है जो यह जांचता है कि प्रारूप सही है या नहीं, और यदि तिथि असली है:

function valid_mysql_date($str){ 
    $date_parts = explode('-',$str); 
    if (count($date_parts) != 3) return false; 
    if ((strlen($date_parts[0]) != 4) || (!is_numeric($date_parts[0]))) return false; 
    if ((strlen($date_parts[1]) != 2) || (!is_numeric($date_parts[1]))) return false; 
    if ((strlen($date_parts[2]) != 2) || (!is_numeric($date_parts[2]))) return false; 
    if (!checkdate($date_parts[1], $date_parts[2] , $date_parts[0])) return false; 
    return true; 
} 

उम्मीद है कि इससे मदद मिलती है।

+1

चेकडेट(), दोस्त –

+0

मजाकिया है, अब मैं समझने की कोशिश कर रहा हूं कि मेरे साथ क्या गलत है ... :) –

+0

ठीक है अब मैं देख रहा हूं कि मेरा क्या मतलब है, cuz मैं आज भी एक ही समस्या में भाग गया। चेकडेट() तीन मानकों के लिए पूछें। इसलिए यदि आपको तारीख की एक स्ट्रिंग मिल गई है, तो यह आपकी मदद नहीं करता है। मेरे फ़ंक्शन को एक स्ट्रिंग और प्रारूप मिलते हैं और चेकडेट() –

17

मैं व्यक्तिगत रूप से पाया इस अगर दिनांक स्वरूप और वैध के अनुसार दोनों है निर्धारित करने के लिए होने के लिए सही और सुरुचिपूर्ण तरीका:

  • व्यवहार करता है 20111-03-21 अमान्य के रूप में की तरह दिनांक - checkdate()
  • के विपरीत
  • कोई संभावित PHP चेतावनियां (यदि कोई भी पैरामीटर प्रदान किया गया है, स्वाभाविक रूप से) - अधिकांश explode() समाधान
  • लीप लेता है

    /** 
    * Tests if a string is a valid mysql date. 
    * 
    * @param string date to check 
    * @return boolean 
    */ 
    function validateMysqlDate($date) 
    { 
        return preg_match('#^(?P<year>\d{2}|\d{4})([- /.])(?P<month>\d{1,2})\2(?P<day>\d{1,2})$#', $date, $matches) 
          && checkdate($matches['month'],$matches['day'],$matches['year']); 
    } 
    
    : रेगुलर एक्सप्रेशन-केवल समाधान
  • पूरी तरह से mysql DATE स्वरूप के साथ संगत के विपरीत खाते में साल

यहाँ विधि आप उपयोग कर सकते हैं (10.03.21 2010-03-21 के समान है)

+0

हाँ, $ str को $ date में बदला जाना चाहिए ... [फ़ंक्शन संपादित किया गया] – Ricky

+0

धन्यवाद, किसी भी तरह से मैं उत्पादन में उपयोग करता हूं, सही है, गलती के लिए खेद है। – raveren

+0

अच्छा! यह सहायक है –

4

मैं इस समारोह का उपयोग कर रहा:

<?php 
function validateMysqlDate($date){ 
    if (preg_match("/^(\d{4})-(\d{2})-(\d{2}) ([01][0-9]|2[0-3]):([0-5][0-9]):([0-5][0-9])$/", $date, $matches)) { 
     if (checkdate($matches[2], $matches[3], $matches[1])) { 
      return true; 
     } 
    } 
    return false; 
} 

// check it: 
    $a = validateMysqlDate('2012-12-09 09:04:00'); 
    $b = validateMysqlDate('20122-12-09 09:04:00'); 
    $c = validateMysqlDate('2012-12_09 09:04:00'); 
    $d = validateMysqlDate(''); 
    var_dump($a); 
    var_dump($b); 
    var_dump($c); 
    var_dump($d); 
?> 

$ एक सच है, दूसरों को झूठे हैं - और था टी सही है

रावेरेन (उपरोक्त) के फ़ंक्शन टाइमस्टैम्प के साथ मान्य तिथियां शामिल नहीं करेंगे !!! $ एक रिटर्न झूठी वहाँ! और बीटीडब्ल्यू: चेकडेट() $ b के लिए सच हो जाएगा हालांकि यह मान्य mysql डेटाटाइम

+0

धन्यवाद, आपके फ़ंक्शन ने मेरी सहायता की :) –

+0

यह * गलत * अवैध रूप से '10.03 को अमान्य कर देगा।21 00: 00: 00' और समय के बिना तारीख स्ट्रिंग को मान्य नहीं करेगा * - जिसे ओपी ने पूछा था। – raveren

संबंधित मुद्दे