একটি অ-সুগঠিত সংখ্যাসূচক মানের মুখোমুখি


120

আমার একটি ফর্ম রয়েছে যা একটি পিএইচপি স্ক্রিপ্টে দুটি তারিখ (শুরু এবং শেষ) পাস করে যা সেগুলিকে একটি ডিবিতে যুক্ত করবে will এটি যাচাই করতে আমার সমস্যা হচ্ছে। আমি নিম্নলিখিত ত্রুটিগুলি পেতে থাকি

একটি অ-সুগঠিত সংখ্যাসূচক মানের মুখোমুখি

এটি যখন আমি নিম্নলিখিত ব্যবহার করি This

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

তবে যখন আমি অনেক সাইটের পরামর্শ অনুসারে স্ট্রোটটাইম () ফাংশনটি ব্যবহার করি তখন আমি ইউনিক্স টাইমস্ট্যাম্পের তারিখটি 1/1/1970 পাই get কোনও ধারণা কীভাবে আমি সঠিক তারিখ পেতে পারি?


5
আপনার যা আছে তা পোস্ট করতে হবে $_GET['start_date']
জনপি

1
আমি ধরে নিলাম আপনার $_GET['start_date']কোনও টাইমস্ট্যাম্প নয় যা dateদ্বিতীয় যুক্তি হিসাবে ফাংশন দ্বারা প্রত্যাশিত
নেমোডেন

ডিসিহাপলিনের দ্বিতীয় উত্তরটি এই ক্ষেত্রে আরও উপযুক্ত
cw24

আমি যোগদান করিনি এমন কোনও টেবিলটি থেকে নির্বাচন করার চেষ্টা করার সময় আমি এটি পেয়েছিলাম ..
কনার লইচ

উত্তর:


225

কারণ আপনি তারিখ ফাংশনের দ্বিতীয় আর্গুমেন্ট হিসাবে একটি স্ট্রিং পার করছেন, যা একটি পূর্ণসংখ্যা হওয়া উচিত।

স্ট্রিং তারিখ (স্ট্রিং $ ফর্ম্যাট [, int $ টাইমস্ট্যাম্প = সময় ()])

স্ট্রোটোটাইম চেষ্টা করুন যা কোনও ইউনিক্স টাইমস্ট্যাম্পে (পূর্ণসংখ্যার) কোনও ইংরেজি পাঠ্য তারিখের বর্ণনা সম্পর্কে পার্স করবে :

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

1
ক্লাসের কনস্ট্রাক্টরে আমি একই ত্রুটি পেয়েছি, আমি ডিবাগ করছিলাম এবং সেই কনস্ট্রাক্টরের সমস্যাটি হ'ল আমি প্যারামিটার এবং পূর্ণসংখ্যা হিসাবে পেয়ে যাচ্ছিpublic function __construct(int $someId....)
মার্কোস ডি পাওলো

পিএইচপি-তে প্যারামিটার টাইপিং আরও 'আদর্শ' হয়ে ওঠার সাথে সাথে, @ মারকোসডিপাইওলো যা উল্লেখ করেছেন তা অবশ্যই আরও ঘন ঘন দেখা যাবে। একটি মৃত প্রত্যয় হ'ল স্ট্যাক ট্রেসটি প্যারামিটারের ঘোষণার লাইনে নির্দেশ করবে যা ভুলভাবে টাইপ করা হচ্ছে।
পার্টটাইম্টার্টেল

আমি আজও বুঝতে পারছি না এখানে @ পার্টটাইম টার্টল্ট
মার্কোস ডি পাওলো

@ মারকোসডিপায়োলো যে ধরণের প্যারামিটারগুলি আপনি সেই কনস্ট্রাক্টরে পাস করেছেন তা অবশ্যই ফাংশন সংজ্ঞাতে ইঙ্গিতযুক্ত প্রকারগুলির সাথে মেলাতে হবে। স্ট্রিং দ্বারা প্রতিনিধিত্ব করা "4" একটি পূর্ণসংখ্যা দ্বারা প্রতিনিধিত্ব করা 4 থেকে পৃথক। সুতরাং হয় ফাংশন সংজ্ঞা মেনে চলুন বা কঠোর প্রকারগুলি বন্ধ করুন, যদি আপনার সত্যিকারের 'অনুরূপ' মানগুলি সংহত করতে হয়, উদাহরণস্বরূপ "4" পূর্ণসংখ্যায় স্ট্রিং 4
পার্টটাইম্টার্টল

9

কেবলমাত্র আপনি এই সমস্যাটি strtotime()ফাংশন ব্যবহার করে সমাধান করতে পারেন ।

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

7

$_GET['start_date']সংখ্যাগত নয় এটি আমার বাজি, তবে একটি তারিখের ফর্ম্যাটটি সমর্থন করে না strtotimeস্ট্রোটোটাইমের জন্য আপনাকে তারিখটি একটি কার্যক্ষম বিন্যাসে পুনরায় ফর্ম্যাট করতে হবে বা বিস্ফোরণ / এমকেটাইমের সংমিশ্রণ ব্যবহার করতে হবে ।

আপনি বর্তমানে যে ফর্ম্যাটটি পান তা পোস্ট করার জন্য আপনি যদি দয়াবান হন তবে আমি আপনাকে একটি উদাহরণ যোগ করতে পারি।


Ingালাই সমস্যাটি সমাধান করবে না যেহেতু পিএইচপি পদ্ধতিতে পাস করার পরে এটি স্বয়ংক্রিয়ভাবে কাস্ট হবে।
পি 26'11

5

আমি এই একই পরিস্থিতিতে দৌড়েছি (আমার ক্ষেত্রে একটি কাস্টম পিএইচপি ক্ষেত্রে একটি দ্রুপাল ভিউতে তারিখের মান সহ), এবং আমার জন্য যা কাজ করেছে তা মানকে পূর্ণসংখ্যায় রূপান্তর করতে স্ট্রোটোটাইমের পরিবর্তে অন্তর্নির্মিত ছিল - কারণ এটি মূলত একটি টাইমস্ট্যাম্প ছিল , কিন্তু একটি পূর্ণসংখ্যার চেয়ে স্ট্রিং আকারে। অবশ্যই এটি সবার জন্য হবে না, তবে এটি চেষ্টা করার মতো হতে পারে।


5

এই ত্রুটিটি ঘটে যখন আপনি ভেরিয়েবলগুলির সাথে গণনা সম্পাদন করেন যা সংখ্যার সাথে মিলিত অক্ষর (অক্ষর) ব্যবহার করে, উদাহরণস্বরূপ 24kb, 886ab ...

নিম্নলিখিত ফাংশনে আমার ত্রুটি ছিল

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

আপনাকে তারিখ_দেফফল_টাইমজোন_সেট () ব্যবহার করে সময় অঞ্চল নির্ধারণ করতে হবে।


0

আমার ক্ষেত্রে এটি sem_get এর মূল বিষয় ছিল

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

$ কীটি একটি আন্তঃ হওয়া উচিত, অন্যথায় আপনি নিম্নলিখিত ত্রুটিটি পাবেন:

পিএইচপি বিজ্ঞপ্তি: একটি অ-সুগঠিত সংখ্যাসূচক মান ভুগছে


0

যদি $ _GET ['start_date'] একটি স্ট্রিং হয় তবে এটি সংখ্যায় ডিল করতে পূর্ণসংখ্যায় বা ডাবলকে রূপান্তর করুন।

$int = (int) $_GET['start_date']; //Integer
$double = (double) $_GET['start_date']; //It takes in floating value with 2 digits
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.