एक गैर अच्छी तरह से गठित संख्यात्मक मूल्य का सामना करना पड़ा


120

मेरे पास एक फॉर्म है जो एक PHP स्क्रिप्ट में दो तिथियों (शुरू और खत्म) से गुजरता है जो उन्हें एक डीबी में जोड़ देगा। मुझे इसे सत्यापित करने में समस्या आ रही है। मुझे निम्नलिखित त्रुटियाँ मिलती रहती हैं

एक गैर अच्छी तरह से गठित संख्यात्मक मूल्य का सामना करना पड़ा

यह तब है जब मैं निम्नलिखित का उपयोग करता हूं

date("d",$_GET['start_date']);

लेकिन जब मैं उपयोग करता हूं स्ट्रेटोटाइम () फ़ंक्शन का कई साइटों द्वारा सलाह दी जाती है कि मुझे 1/1/1970 की यूनिक्स टाइमस्टैम्प तिथि मिलती है। किसी भी विचार मैं सही तिथि कैसे प्राप्त कर सकता हूं?


5
आपको वह पोस्ट करना होगा $_GET['start_date']जिसमें सम्‍मिलित है।
जॉनपी

1
मुझे लगता है कि आपका टाइमस्टैम्प$_GET['start_date'] नहीं है जो दूसरे तर्क के रूप में कार्य की उम्मीद करता हैdate
नेमोडेन

DChaplin से दूसरा उत्तर इस मामले में अधिक उपयुक्त है
cw24

मुझे यह तब मिला जब मैं उस मेज से चयन करने की कोशिश कर रहा था जिस पर मैं शामिल नहीं हुआ था ..
कॉनर लीच

जवाबों:


225

क्योंकि आप दिनांक फ़ंक्शन के दूसरे तर्क के रूप में एक स्ट्रिंग पास कर रहे हैं, जो पूर्णांक होना चाहिए।

स्ट्रिंग तिथि (स्ट्रिंग $ प्रारूप [, int $ टाइमस्टैम्प = समय ()])

स्ट्रेटोटाइम आज़माएं, जो यूनिक्स टाइमस्टैम्प (पूर्णांक) में किसी भी अंग्रेजी के टेक्स्टुअल डाइमटाइम विवरण के बारे में बताएगा :

date("d", strtotime($_GET['start_date']));

1
मुझे क्लास के कंस्ट्रक्टर में वही त्रुटि मिलती है, मैं डिबगिंग कर रहा था और उस कंस्ट्रक्टर में समस्या मुझे एक पैरामीटर और पूर्णांक के रूप में प्राप्त हो रही हैpublic function __construct(int $someId....)
मार्कोस डी पाओलो

PHP में पैरामीटर टाइपिंग अधिक 'आदर्श' बनने के साथ, @MarcosDiPaolo का उल्लेख किया है जो निश्चित रूप से अधिक बार देखा जाएगा। एक मृत जीवामृत है स्टैक ट्रेस पैरामीटर पैरामीटर घोषणा की रेखा को इंगित करेगा जो गलत तरीके से टाइप किया जा रहा है।
parttimeturtle

मुझे अभी भी समझ में नहीं आया कि यहां कार्रवाई का क्या तरीका है @parttimeturtle
मार्कोस डि पाओलो

@MarcosDiPaolo उस निर्माता से आपके द्वारा पास किए जाने वाले पैरामीटर के प्रकार फ़ंक्शन की परिभाषा में संकेतित किए जाने वाले प्रकारों से मेल खाना चाहिए। एक स्ट्रिंग द्वारा दर्शाया गया "4" एक पूर्णांक द्वारा दर्शाए गए 4 से भिन्न होता है। इसलिए या तो फ़ंक्शन की परिभाषा के अनुरूप या सख्त प्रकारों को बंद करें, यदि आपको वास्तव में 'समान' मानों को समतल करने की आवश्यकता है, उदाहरण के लिए स्ट्रिंग "4" से पूर्णांक 4.
parttimeturtle

9

बस आप strtotime()फ़ंक्शन का उपयोग करके इस समस्या को हल कर सकते हैं ।

date("d", strtotime($_GET['start_date']));

7

$_GET['start_date']संख्यात्मक मेरी शर्त नहीं है, लेकिन एक तारीख प्रारूप द्वारा समर्थित नहीं है strtotime। इसके लिए आपको एक कार्यशील प्रारूप में तारीख को फिर से प्रारूपित करना होगा strtotime के कार्यशील या विस्फोट / mktime के संयोजन का उपयोग ।

यदि आप वर्तमान में प्राप्त प्रारूप को पोस्ट करने के लिए पर्याप्त हैं, तो मैं आपको एक उदाहरण जोड़ सकता हूं।


कास्टिंग समस्या को ठीक नहीं करेगा क्योंकि PHP स्वचालित रूप से इसे डालेगी जब विधि को पास किया जाएगा।
जॉनपी

5

मैं उसी स्थिति में (ड्रुपल दृश्य में कस्टम PHP फ़ील्ड में दिनांक मान के साथ मेरे मामले में) भाग गया, और मेरे लिए जो काम किया, वह मूल्य को पूर्णांक में बदलने के लिए strtotime के बजाय intval का उपयोग कर रहा था - क्योंकि यह मूल रूप से टाइमस्टैम्प था , लेकिन पूर्णांक के बजाय एक स्ट्रिंग के रूप में। जाहिर है कि यह सभी के लिए मामला नहीं होगा, लेकिन यह एक कोशिश के काबिल हो सकता है।


5

यह त्रुटि तब होती है जब आप चर के साथ गणना करते हैं जो संख्याओं (अल्फ़ान्यूमेरिक) के साथ संयुक्त अक्षरों का उपयोग करते हैं, उदाहरण के लिए 24kb, 8868 ...

मुझे निम्न फ़ंक्शन में त्रुटि हुई थी

function get_config_bytes($val) {
    $val = trim($val);
    $last = strtolower($val[strlen($val)-1]);       
    switch($last) {
        case 'g':
            $val *= 1024;
        case 'm':
            $val *= 1024;
        case 'k':
            $val *= 1024;
    }
    return $this->fix_integer_overflow($val);
}

एप्लिकेशन छवियों को अपलोड करता है लेकिन यह काम नहीं करता है, यह निम्नलिखित चेतावनी दिखाता है:

यहां छवि विवरण दर्ज करें

समाधान:intval() समारोह अक्षरांकीय डेटा के साथ एक चर के पूर्णांक मान निकालता है और एक ही मूल्य के साथ एक नया चर बनाता है, लेकिन साथ एक पूर्णांक के लिए परिवर्तित कर intval()कार्य करते हैं। यहाँ कोड है:

function get_config_bytes($val) {
    $val = trim($val);
    $last = strtolower($val[strlen($val)-1]);
    $intval = intval(trim($val));
    switch($last) {
        case 'g':
            $intval *= 1024;
        case 'm':
            $intval *= 1024;
        case 'k':
            $intval *= 1024;
    }
    return $this->fix_integer_overflow($intval);
}


1

यह एक पुराना सवाल है, लेकिन एक और सूक्ष्म तरीका है जिससे यह संदेश हो सकता है। यह डॉक्स में यहाँ बहुत अच्छी तरह से समझाया गया है

इस विज्ञान की कल्पना करें:

try {
  // code that triggers a pdo exception
} catch (Exception $e) {
  throw new MyCustomExceptionHandler($e);
}

और MyCustomExceptionHandlerमोटे तौर पर परिभाषित किया गया है:

class MyCustomExceptionHandler extends Exception {
  public function __construct($e) {
    parent::__construct($e->getMessage(), $e->getCode());
  }
}

यह वास्तव में कस्टम अपवाद हैंडलर में एक नए अपवाद को ट्रिगर करेगा क्योंकि Exceptionवर्ग अपने निर्माता में दूसरे पैरामीटर के लिए एक संख्या की उम्मीद कर रहा है, लेकिन PDOExceptionहो सकता है कि गतिशील रूप से रिटर्न प्रकार बदल गया हो$e->getCode() से स्ट्रिंग ।

इसके लिए एक समाधान यह होगा कि आप कस्टम अपवाद हैंडलर को परिभाषित करें:

class MyCustomExceptionHandler extends Exception {
  public function __construct($e) {
    parent::__construct($e->getMessage());
    $this->code = $e->getCode();
  }
}

1

स्ट्रिंग को पास करना कोई समस्या नहीं है, अगर इसमें केवल अंक होते हैं।

ऐसा होने का एक अन्य कारण यह भी हो सकता है कि आपके पास पहले या बाद में जगह हो। उदाहरण के लिए "1557399276"


0

यदि किसी गणना के समय त्रुटि होती है, तो यह जांचें कि मानों में कोई अल्पविराम (,) नहीं है। मान केवल पूर्णांक / फ्लोट प्रारूप में होना चाहिए।


0

आपको date_default_timezone_set () का उपयोग करके समय क्षेत्र सेट करने की आवश्यकता है।


0

मेरे मामले में यह सेम_गेट की कुंजी थी

sem_get ( int $key [, int $max_acquire = 1 [, int $perm = 0666 [,
          int $auto_release = 1 ]]] 
          ) : resource

$ कुंजी एक इंट होनी चाहिए, अन्यथा आपको निम्न त्रुटि मिलेगी:

PHP सूचना: एक गैर अच्छी तरह से गठित संख्यात्मक मूल्य में सामना करना पड़ा


0

यदि $ _GET ['start_date'] एक स्ट्रिंग है, तो इसे पूर्णांक में बदल दें या संख्यात्मक रूप से निपटने के लिए डबल करें।

$int = (int) $_GET['start_date']; //Integer
$double = (double) $_GET['start_date']; //It takes in floating value with 2 digits
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.