"বিজ্ঞপ্তি: অপরিজ্ঞাত পরিবর্তনশীল", "বিজ্ঞপ্তি: অপরিজ্ঞাত সূচক", এবং "বিজ্ঞপ্তি: অপরিজ্ঞাত অফসেট" পিএইচপি ব্যবহার করে


1173

আমি একটি পিএইচপি স্ক্রিপ্ট চালিয়ে যাচ্ছি এবং ত্রুটিগুলি গ্রহণ করা চালিয়ে যাচ্ছি:

বিজ্ঞপ্তি: অপরিজ্ঞাত পরিবর্তনশীল: সি: in wamp \ www \ mypath \ index.php 10-এ my_variable_name

বিজ্ঞপ্তি: অপরিবর্তিত সূচক: my_index সি: 11 লাইনটিতে \ wamp \ www \ mypath \ index.php

10 এবং 11 লাইনটি দেখতে এমন দেখাচ্ছে:

echo "My variable value is: " . $my_variable_name;
echo "My index value is: " . $my_array["my_index"];

এই ত্রুটি বার্তাগুলির অর্থ কী?

হঠাৎ কেন এগুলি উপস্থিত হয়? আমি এই স্ক্রিপ্টটি কয়েক বছর ধরে ব্যবহার করেছি এবং আমার কোনও সমস্যা হয়নি।

আমি এগুলি কীভাবে ঠিক করব?


এটি বারবার সমস্যাটি ব্যাখ্যা করার পরিবর্তে লোকটিকে সদৃশ হিসাবে লিঙ্ক করার জন্য এটি একটি সাধারণ রেফারেন্স প্রশ্ন । আমি এটি প্রয়োজনীয় বলে মনে করি কারণ এই ইস্যুতে বেশিরভাগ বাস্তব-জগতের উত্তরগুলি খুব নির্দিষ্ট।

সম্পর্কিত মেটা আলোচনা:



3
ভেরিয়েবলটি আরম্ভ করা যায় নি। আপনি কি কোনও পোস্ট থেকে পরিবর্তনশীল সূচনা করছেন বা পাবেন বা কোনও অ্যারে? যদি এটি হয় তবে আপনার সেই অ্যারেতে কোনও ক্ষেত্র থাকতে পারে না। যে আপনার অ্যাক্সেস।
আনিস সিলওয়াল

3
@ পেক্কা 웃 - আমি সম্পাদনাটি "এবং" বিজ্ঞপ্তি: অপরিজ্ঞাত অফসেট "" যুক্ত করে লক্ষ্য করেছি - "পিএইচপি:" অপরিজ্ঞাত ভেরিয়েবল "," অপরিজ্ঞাত সূচক "," অপরিজ্ঞাত অফসেট "বিজ্ঞপ্তিগুলি" ব্যবহার করেও কি এটি আরও অর্থবোধ করে না? " পিএইচপি আউট, যেহেতু এটি "পিএইচপি" হিসাবে ট্যাগ করা হয়েছে Plus প্লাস, ইউআরএলটি কেটে যায় and-notice-undefকেবলমাত্র একটি পরামর্শ যাতে ইউআরএলটি কাটা না যায় Maybe সম্ভবত (অনেকগুলি) উদ্ধৃতিও সরিয়ে দেওয়া Or বাPHP: “Undefined variable/index/offset” notices
ফানকি ফোর্টি নিনার

2
@ ফ্রেড আমার ধারণা, উভয় প্রকারের জন্য একটি যুক্তি তৈরি করা যেতে পারে। এই সুযোগটি যে নবজাতকরা তাদের অনুসন্ধান অনুসন্ধানে "বিজ্ঞপ্তি:" সহ পুরো লাইনটি প্রবেশ করবে, যা আমি নিশ্চিত যে এই প্রশ্নের প্রধান ট্র্যাফিক জেনারেটর। যদি বার্তাগুলি পুরোপুরি থাকে তবে অনুসন্ধান ইঞ্জিনগুলিতে দৃশ্যমানতার উন্নতি হওয়ার সম্ভাবনা রয়েছে
পেক্কা

2
@ পেপকা 웃 আমি বুঝতে পেরেছি। আমি কেবল এটিই বলেছিলাম যে আগে ইউআরএলটি কাটা হয়নি এবং এখন তা হয় and-notice-undef। এটি ছিল মাত্র কয়েকটি (কয়েকটি) পরামর্শ (গুলি)। এটি কেবল নিজেকেই পুনরাবৃত্তি করে Notice: Undefined
ফানকি চল্লিশ নাইনার

উত্তর:


1066

বিজ্ঞপ্তি: অপরিজ্ঞাত পরিবর্তনশীল

পিএইচপি ম্যানুয়াল এর বিশাল জ্ঞান থেকে :

অবিচ্ছিন্ন ভেরিয়েবলের ডিফল্ট মানের উপর নির্ভর করা একই ফাইলের ক্ষেত্রে একই ফাইলকে অন্য একটি ফাইল অন্তর্ভুক্ত করার ক্ষেত্রে সমস্যাযুক্ত। এটি রেজিস্টার_ গ্লোবালগুলি চালু থাকা সহ একটি বড় সুরক্ষা ঝুঁকিওইনিটায়সাইজড ভেরিয়েবলগুলির সাথে কাজ করার ক্ষেত্রে E_NOTICE স্তরের ত্রুটি জারি করা হয়, তবে অবিচ্ছিন্ন অ্যারেতে উপাদান যুক্ত করার ক্ষেত্রে নয়। ইতিমধ্যে ভেরিয়েবলটি আরম্ভ করা হয়েছে কিনা তা সনাক্ত করতে আইসেট () ভাষা নির্মাণ ব্যবহার করা যেতে পারে। অতিরিক্ত এবং আরও আদর্শ হ'ল খালি এর সমাধান ( যেহেতু ভেরিয়েবলটি আরম্ভ করা না হয় তবে এটি কোনও সতর্কতা বা ত্রুটি বার্তা উত্পন্ন করে না।

পিএইচপি ডকুমেন্টেশন থেকে :

ভেরিয়েবলের অস্তিত্ব না থাকলে কোনও সতর্কতা উত্পন্ন হয় না। তার মানে খালি () মূলত ! Isset ($ var) এর সংক্ষিপ্ত সমতুল্য || $ var == মিথ্যা

এর অর্থ আপনি শুধুমাত্র ব্যবহার করতে পারে empty()কিনা তা নির্ধারণ করতে পরিবর্তনশীল সেট করা থাকে, এবং এ ছাড়াও এটি নিম্নলিখিত বিরুদ্ধে পরিবর্তনশীল রুদ্ধ করার প্রচেষ্টায় 0, 0.0, "", "0", null, falseবা []

উদাহরণ:

$o = [];
@$var = ["",0,null,1,2,3,$foo,$o['myIndex']];
array_walk($var, function($v) {
    echo (!isset($v) || $v == false) ? 'true ' : 'false';
    echo ' ' . (empty($v) ? 'true' : 'false');
    echo "\n";
});

3v4l.org অনলাইন পিএইচপি সম্পাদকটিতে উপরের স্নিপেটটি পরীক্ষা করুন

যদিও পিএইচপি-র কোনও পরিবর্তনশীল ঘোষণার প্রয়োজন হয় না, এটি এমন কিছু সুরক্ষা দুর্বলতা বা বাগগুলি এড়াতে সুপারিশ করে যেখানে স্ক্রিপ্টে পরে ব্যবহার করা হবে এমন কোনও ভেরিয়েবলের মান দিতে ভুলে যেতে পারে। অঘোষিত ভেরিয়েবলের ক্ষেত্রে পিএইচপি যা করে তা হ'ল খুব নিম্ন স্তরের ত্রুটি, E_NOTICEএটি একটি ডিফল্ট হিসাবে রিপোর্টও করা হয় না, তবে ম্যানুয়ালটি বিকাশের সময় অনুমতি দেওয়ার পরামর্শ দেয়

সমস্যাটি মোকাবেলার উপায়:

  1. প্রস্তাবিত: আপনার ভেরিয়েবলগুলি ঘোষণা করুন, উদাহরণস্বরূপ আপনি যখন একটি অপরিবর্তিত ভেরিয়েবলের সাথে একটি স্ট্রিং যুক্ত করার চেষ্টা করেন। অথবা এগুলি উল্লেখ করার আগে তাদের ঘোষিত হয়েছে কিনা তা পরীক্ষা করতে isset()/ ব্যবহার !empty()করতে:

    //Initializing variable
    $value = ""; //Initialization value; Examples
                 //"" When you want to append stuff later
                 //0  When you want to add numbers later
    //isset()
    $value = isset($_POST['value']) ? $_POST['value'] : '';
    //empty()
    $value = !empty($_POST['value']) ? $_POST['value'] : '';
    

    এটি পিএইচপি 7.0 হিসাবে অনেক ক্লিনার হয়ে গেছে, এখন আপনি নাল coalesce অপারেটরটি ব্যবহার করতে পারেন :

    // Null coalesce operator - No need to explicitly initialize the variable.
    $value = $_POST['value'] ?? '';
    
  2. E_NOTICE এর জন্য একটি কাস্টম ত্রুটি হ্যান্ডলার সেট করুন এবং স্ট্যান্ডার্ড আউটপুট থেকে দূরে বার্তাগুলি পুনঃনির্দেশ করুন (সম্ভবত কোনও লগ ফাইলে):

    set_error_handler('myHandlerForMinorErrors', E_NOTICE | E_STRICT)
  3. E_NOTICE প্রতিবেদন করা থেকে অক্ষম করুন। ন্যায়সঙ্গত বাদ দেওয়ার দ্রুত উপায় E_NOTICEহ'ল:

    error_reporting( error_reporting() & ~E_NOTICE )
  4. @ অপারেটরের মাধ্যমে ত্রুটিটি দমন করুন ।

দ্রষ্টব্য: কেবলমাত্র 1 পয়েন্টটি প্রয়োগ করার জন্য এটি দৃ strongly়ভাবে প্রস্তাবিত।

বিজ্ঞপ্তি: অপরিজ্ঞাত সূচক / অপরিজ্ঞাত অফসেট

আপনি যখন (বা পিএইচপি) কোনও অ্যারের অপরিবর্তিত সূচকটি অ্যাক্সেস করার চেষ্টা করবেন তখন এই নোটিশটি উপস্থিত হয়।

সমস্যাটি মোকাবেলার উপায়:

  1. সূচিটি অ্যাক্সেস করার আগে উপস্থিত রয়েছে কিনা তা পরীক্ষা করে দেখুন। এর জন্য আপনি ব্যবহার করতে পারেন isset()বা array_key_exists():

    //isset()
    $value = isset($array['my_index']) ? $array['my_index'] : '';
    //array_key_exists()
    $value = array_key_exists('my_index', $array) ? $array['my_index'] : '';
    
  2. ভাষা কন্সট্রাক্ট list()এটি তৈরি করতে পারে যখন এটি উপস্থিত নেই এমন একটি অ্যারে সূচকটি অ্যাক্সেস করার চেষ্টা করে:

    list($a, $b) = array(0 => 'a');
    //or
    list($one, $two) = explode(',', 'test string');
    

দুটি অ্যারে উপাদান অ্যাক্সেস করতে দুটি ভেরিয়েবল ব্যবহার করা হয়, তবে কেবলমাত্র একটি অ্যারে উপাদান, সূচক রয়েছে 0, সুতরাং এটি উত্পন্ন করবে:

বিজ্ঞপ্তি: অপরিজ্ঞাত অফসেট: 1

$_POST/ $_GET/ $_SESSIONপরিবর্তনশীল

উপরের নোটিশগুলি প্রায়শই প্রদর্শিত হয় সাথে কাজ করার সময় $_POST, $_GETবা $_SESSION। এর জন্য $_POSTএবং $_GETআপনাকে কেবল খতিয়ে দেখতে হবে যে সূচিগুলি ব্যবহারের আগে রয়েছে কি না। কারণ $_SESSIONআপনাকে নিশ্চিত করতে হবে যে আপনি অধিবেশনটি শুরু করেছেন session_start()এবং সূচকটিও বিদ্যমান।

আরও মনে রাখবেন যে সমস্ত 3 টি ভেরিয়েবল সুপারগ্লোবাল এবং বড় হাতের।

সম্পর্কিত:


7
@ dieselpower44 বেশ কয়েকটি চিন্তাভাবনা: "শাট-আপ অপারেটর" ( @) এর কিছু কার্যকারিতা রয়েছে। এছাড়াও, যেহেতু এটি একটি নির্দিষ্ট ক্ষেত্রের মধ্যে সমস্ত ত্রুটিগুলি দমন করে, তাই যত্ন ব্যতীত এটি ব্যবহার করা বার্তাগুলি মাস্ক করতে পারে যা আপনি দেখতে চান।
আইএমএসওপি

6
ইস্যুগুলি গোপন করা কোনও সমস্যা সমাধানের উপায় নয়। আইটেম # 2 ... # 4 কেবলমাত্র উত্পাদন সার্ভারে ব্যবহার করা যেতে পারে, সাধারণভাবে নয়।
সালমান এ

1
যখন কাস্টম ত্রুটি হ্যান্ডলার ব্যবহার করা হয় তখন কী বার্তাটি ইনলাইন (হ্যান্ডলারে নয়) বন্ধ করা সম্ভব? $var = @$_GET['nonexisting'];তবুও নোটিশের কারণ রয়েছে ..
Alph.Dev

18
$value = isset($_POST['value']) ? $_POST['value'] : '';4 ব্যবহারের পরিবর্তে কেন 1 ব্যবহারের পরামর্শ দেওয়া হচ্ছে $value = @$_POST['value'];?
forsvunnet

@ টিউজিস্টপিক্সেল এই 4 টি উপায় স্বাধীন, এটি 4-পদক্ষেপের গাইড নয়। সুতরাং আপনি যদি উপায় 4 ব্যবহার করতে বেছে নিয়েছেন, তার অর্থ আপনি প্রথম 3 টি উপায়ে প্রয়োগ করেন নি, তাই আপনি এখনও কোনও ত্রুটি দমন করেন নি।
আইকান ইয়াট

141

এগুলি চেষ্টা করে দেখুন

Q1: এই বিজ্ঞপ্তির অর্থ means বর্ণটি স্ক্রিপ্টের বর্তমান স্কোপে সংজ্ঞায়িত করা হয়নি।

প্রশ্ন 2: সন্দেহজনক ভেরিয়েবল ভালভাবে কাজ করার আগে খালি () শর্তসমূহের ব্যবহার করুন

// recommended solution for recent PHP versions
$user_name = $_SESSION['user_name'] ?? '';

// pre-7 PHP versions
$user_name = '';
if (!empty($_SESSION['user_name'])) {
     $user_name = $_SESSION['user_name'];
}

বা, একটি দ্রুত এবং নোংরা সমাধান হিসাবে:

// not the best solution, but works
// in your php setting use, it helps hiding site wide notices
error_reporting(E_ALL ^ E_NOTICE);

সেশন সম্পর্কে নোট:

  • সেশন ব্যবহার করার সময়, সেশনগুলি ব্যবহার করে session_start();সমস্ত ফাইলের অভ্যন্তরে স্থাপন করা আবশ্যক।

  • http://php.net/manual/en/features.sessions.php


যদি কনফিগারেশন ফাইল E_NOTICEথেকে ব্যবহার করা হয় php.ini, তবেerror_reporting = (E_ALL & ~E_NOTICE)
ahmd0


উপরের উত্তর থেকে, আমি আইসেট চেষ্টা করেছি, অ্যারে_কি_এক্সজিস্ট কিন্তু সেগুলি কার্যকর হয়নি। আমি আপনার উত্তরটি চেষ্টা করেছিলাম, .empty (), এবং এটি কার্যকর হয়। আপনাকে অনেক ধন্যবাদ!
ewef

63

ত্রুটি প্রদর্শন @অপারেটর

অনাকাঙ্ক্ষিত এবং অপ্রয়োজনীয় নোটিশগুলির জন্য, একজন ডেডিকেটেড @অপারেটরটিকে অপরিবর্তিত ভেরিয়েবল / সূচক বার্তাগুলি » আড়াল to করতে ব্যবহার করতে পারে ।

$var = @($_GET["optional_param"]);
  • এটি সাধারণত নিরুৎসাহিত হয়। নতুনরা এটিকে অতিরিক্তভাবে ব্যবহার করার প্রবণতা রাখে।
  • অ্যাপ্লিকেশন লজিকের মধ্যে গভীর কোডের জন্য এটি অত্যন্ত অনুপযুক্ত (অঘোষিত ভেরিয়েবলগুলি উপেক্ষা করুন যেখানে আপনার উচিত নয়), যেমন ফাংশন পরামিতিগুলির জন্য বা লুপগুলিতে।
  • তবে এর চেয়ে ওপরে isset?:বা ??অতি-দাবিত্যাগ রয়েছে। বিজ্ঞপ্তিগুলি এখনও লগ পেতে পারে। এবং কেউ এর @সাথে বিজ্ঞপ্তিগুলি পুনরুত্থিত করতে পারে :set_error_handler("var_dump");
    • সংযোজনীয়ভাবে if (isset($_POST["shubmit"]))আপনার প্রাথমিক কোডে অভ্যাসটি ব্যবহার বা সুপারিশ করা উচিত নয় ।
    • নতুনরা এই জাতীয় টাইপগুলি স্পট করবে না। এটি কেবলমাত্র খুব ক্ষেত্রেই আপনাকে পিএইচপিএস বিজ্ঞপ্তি থেকে বঞ্চিত করে। কার্যকারিতা যাচাই করার পরে যুক্ত করুন @বা issetকেবলমাত্র ।
    • প্রথমে কারণটি ঠিক করুন। নোটিশ নয়।

  • @মূলত $_GET/ $_POSTইনপুট পরামিতিগুলির জন্য গ্রহণযোগ্য , বিশেষত যদি তারা alচ্ছিক হয়

এবং যেহেতু এটি এ জাতীয় বেশিরভাগ প্রশ্নের অন্তর্ভুক্ত করে, আসুন সর্বাধিক সাধারণ কারণগুলিতে প্রসারিত করুন:

$_GET/ $_POST/ অপরিবর্তিত $_REQUESTইনপুট

  • অপরিজ্ঞাত সূচক / অফসেটের মুখোমুখি হওয়ার সময় আপনি প্রথমে যা করেন তা টাইপসের জন্য পরীক্ষা করা হয়:
    $count = $_GET["whatnow?"];

    • এটি কি প্রত্যাশিত মূল নাম এবং প্রতিটি পৃষ্ঠার অনুরোধে উপস্থিত ?
    • পরিবর্তনশীল নাম এবং অ্যারে সূচকগুলি পিএইচপি-তে কেস-সংবেদনশীল।
  • দ্বিতীয়ত, যদি নোটিশের কোনও সুস্পষ্ট কারণ না থাকে তবে তাদের নিরাময়কারী সামগ্রীর জন্য সমস্ত ইনপুট অ্যারে ব্যবহার var_dumpবা print_rযাচাই করতে :

    var_dump($_GET);
    var_dump($_POST);
    //print_r($_REQUEST);
    

    আপনার স্ক্রিপ্টটি ডান বা কোনও প্যারামিটারের সাথে যুক্ত ছিল কিনা তা উভয়ই প্রকাশ করবে।

  • বিকল্প বা অতিরিক্তভাবে আপনার ব্রাউজার ডেভলগুলি ( F12) ব্যবহার করুন এবং অনুরোধ এবং পরামিতিগুলির জন্য নেটওয়ার্ক ট্যাবটি পরীক্ষা করুন:

    ব্রাউজার বিকাশকারী সরঞ্জাম / নেটওয়ার্ক ট্যাব

    পোস্ট প্যারামিটার এবং জিইটি ইনপুট পৃথকভাবে দেখানো হবে।

  • জন্য $_GETপরামিতি এছাড়াও আপনি উঁকি করতে পারেন QUERY_STRINGমধ্যে

    print_r($_SERVER);

    পিএইচপি -র অ-মানক প্যারামিটার নামগুলিকে সুপারগ্লোবালগুলিতে একত্রিত করার কিছু বিধি রয়েছে । অ্যাপাচি কিছু পুনর্লিখনও করতে পারে। আপনি সরবরাহিত কাঁচা $_COOKIESএবং অন্যান্য এইচটিটিপি অনুরোধ শিরোনামগুলি সেভাবে দেখতে পারেন।

  • GET পরামিতিগুলির জন্য আপনার ব্রাউজারের ঠিকানা বারটি আরও স্পষ্টভাবে দেখুন :

    http://example.org/script.php?id=5&sort=desc

    name=valueপরে জোড়া ?প্রশ্ন চিহ্ন আপনার প্রশ্নের (Get) পরামিতি। সুতরাং এই ইউআরএল কেবল সম্ভাব্য উত্পাদন করতে পারে $_GET["id"]এবং $_GET["sort"]

  • অবশেষে আপনার <form>এবং<input> ঘোষণাগুলি পরীক্ষা করুন , যদি আপনি কোনও প্যারামিটার আশা করেন তবে কিছুই পান না।

    • প্রতিটি প্রয়োজনীয় ইনপুট একটি আছে তা নিশ্চিত করুন <input name=FOO>
    • id=বা title=অ্যাট্রিবিউট চলা হয় না।
    • একটি method=POSTফর্ম আবশ্যক $_POST
    • যেহেতু একটি method=GET(বা এটিকে ছেড়ে) $_GETভেরিয়েবলের ফল দেয় ।
    • কোনও ফর্মের পক্ষে action=script.php?get=paramthe _GET এবং অবশিষ্ট method=POSTক্ষেত্রগুলি পাশাপাশি $ _POST এ সরবরাহ করা সম্ভব।
    • আধুনিক পিএইচপি কনফিগারেশনগুলির সাথে (≥ 5.6) এটি আবার ব্যবহার করা সম্ভব (ফ্যাশনেবল নয়) হয়ে গেছে $_REQUEST['vars'], যা জিইটি এবং পোষ্ট প্যারামগুলিকে মেশ করে।
  • আপনি যদি মোড_উইরাইট ব্যবহার করছেন, তবে আপনার অনুপস্থিত পরামিতিগুলি নির্ধারণের access.logপাশাপাশি উভয়টি পরীক্ষা করা উচিত RewriteLog

$_FILES

$_COOKIE

  • $_COOKIEঅ্যারে পরে জনবহুল না হয় setcookie(), কিন্তু শুধুমাত্র কোন ফলোআপ HTTP অনুরোধ করেন।
  • অতিরিক্তভাবে তাদের মেয়াদ শেষ হয়ে গেলে, তারা সাবডোমেনগুলি বা স্বতন্ত্র পাথের প্রতিবন্ধক হতে পারে এবং ব্যবহারকারী এবং ব্রাউজার কেবল এগুলি প্রত্যাখ্যান বা মুছতে পারে।

2
পারফরম্যান্স প্রভাব কী তা যদি আপনি জানতে আগ্রহী হন তবে এই নিবন্ধটি এটির ভালভাবে সংক্ষেপে জানায় , derickrethans.nl/…
গজুস

@ গজুসকুইজিনাস ২০০৯ সাল থেকে বেশ কয়েকটি পরিবর্তন হয়েছে, বিশেষত পিএইচপি.এন. / চেঞ্জলগ ৫.৫ পিপি ৫৫.৪.০ ফলাফলটি মারাত্মকভাবে পরিবর্তন করে (দেখুন "জেন্ড ইঞ্জিন, পারফরম্যান্স" এবং "(নীরবতা অপারেটর")।
মারিও

ধন্যবাদ @ মারিও, আকর্ষণীয়। এখন, কেউ যদি এই দু'টি বেঞ্চমার্ক করার পক্ষে যথেষ্ট ভাল ছিল ... 3v4l.org/CYVOn/perf#tabs 3v4l.org/FLp3D/perf#tabs এই পরীক্ষা অনুসারে, অভিন্ন বলে মনে হচ্ছে (স্কেল পরিবর্তনগুলি লক্ষ্য করুন)।
গাজুস

47

সাধারণত "খারাপ প্রোগ্রামিং", এবং এখন বা পরে ভুল হওয়ার সম্ভাবনার কারণে।

  1. যদি এটি কোনও ভুল হয় তবে প্রথমে ভেরিয়েবলের জন্য একটি যথাযথ অ্যাসাইনমেন্ট করুন: $ বর্ণনাম = 0;
  2. যদি এটি সত্যই কখনও কখনও সংজ্ঞায়িত হয় তবে এটির if (isset($varname))আগে পরীক্ষা করুন:
  3. যদি এটি ভুল বানান বলে থাকে তবে কেবল এটি সংশোধন করুন
  4. এমনকি আপনার পিএইচপি-সেটিংসে সতর্কতাগুলির পালাও

5
সতর্কতা বন্ধ করবেন না দয়া করে। কঠোর ভাষায়, তাদের প্রায়শই অর্থ হয় "একটি বাগ থাকতে পারে, আপনি আরও ভালভাবে এই লাইনটি দুটিবার পরীক্ষা করে দেখুন" - পিএইচপি হিসাবে অনুমতিপ্রসূত ভাষায়, তাদের প্রায়শই অর্থ হয় "এই কোডটি বকাঝকা এবং প্রস্তাবিতভাবে বাগের সাথে ছাঁটাইযুক্ত; আমি চেষ্টা করার চেষ্টা করব এটির কিছুটা ধারণা কিন্তু আপনি এটি যথাযথভাবে ঠিক করুন "।

5
যদিও আমি প্রথম তিনটি পয়েন্টের সাথে একমত, # 4 কেবল ভুল। কোনও সমস্যা লুকিয়ে রাখলে তা দূরে যাবে না এবং এটি রাস্তায় আরও সমস্যা তৈরি করতে পারে।
ভ্যালেন্টিন ফ্ল্যাচসেল

1
@ ফ্রি একেবারে সত্য, তবে কিছু পরিস্থিতিতে (কেনা স্ক্রিপ্ট, শূন্য প্রযুক্তিগত জ্ঞান, এটি আগামীকালই চালিত হওয়া দরকার ...) এটি নালী-টেপ সমাধান - সত্যই খারাপ, যা সর্বদা জোর দেওয়া প্রয়োজন, তবে একটি বিকল্প
পেক্কা

নালী-টেপ ভাল ... কখনও কখনও। PHতিহাসিকভাবে সতর্কতাগুলি স্ট্যান্ডার্ড পিএইচপি-সেটিংসে পরিণত হয়েছে, তবে ত্রুটিযুক্ত সেটিংস আরও কঠোর হয়ে উঠেছে। খুব খারাপ লোকেরা পুরানো সেটিংসে ফিরে যায়, যাতে গ্রাহকদের বিরক্ত না করে।
এরিক

41

এর অর্থ হল আপনি কোনও ভেরিয়েবল পরীক্ষা করছেন, মূল্যায়ন করছেন বা মুদ্রণ করছেন যা আপনি এখনও কিছু বরাদ্দ করেননি। এর অর্থ আপনার হয় একটি টাইপো রয়েছে, বা আপনার ভেরিয়েবলটি প্রথমে কিছুতে আরম্ভ করা হয়েছিল তা পরীক্ষা করা উচিত। আপনার যুক্তিযুক্ত পাথগুলি পরীক্ষা করুন, এটি এক পথে সেট করা হতে পারে তবে অন্য পথে নয়।


34

আমি বিজ্ঞপ্তিটি অক্ষম করতে চাইনি কারণ এটি সহায়ক, তবে খুব বেশি টাইপ করা এড়াতে চেয়েছিল।

আমার সমাধানটি এই ফাংশনটি ছিল:

function ifexists($varname)
{
  return(isset($$varname)?$varname:null);
}

সুতরাং আমি যদি $ নামটি উল্লেখ করতে চাই এবং উপস্থিত থাকলে প্রতিধ্বনি করি, আমি কেবল লিখি:

<?=ifexists('name')?>

অ্যারে উপাদানগুলির জন্য:

function ifexistsidx($var,$index)
{
  return(isset($var[$index])?$var[$index]:null);
}

পৃষ্ঠায় যদি আমি $ _REQQUEST ['নাম'] উল্লেখ করতে চাই:

<?=ifexistsidx($_REQUEST,'name')?>

2
আপনার ifexists () ফাংশন পিএইচপি 5.3 এ আমার জন্য কাজ করে না। আহ্বানকারী এর ভেরিয়েবল ফাংশন এর স্থানীয় সুযোগ উপলভ্য নয় (দেখুন চলক সুযোগ যদি না তারা,) superglobals বা আপনার সাথে বেহালা $ GLOBALS , তাই $foo = "BABAR"; ifexists('foo');সাধারণ আগমন নাল মধ্যে হবে। (ইটালিক্স
পিএইচপিএন

এখন আপনি "হ্যালো থেকে" পাবেন ... কী কথা? মাত্র মানটি পরীক্ষা করুনif( !empty($user) and !empty($location) ) echo "hello $user ..."
gcb

27

ইনপুট স্ট্রিং পাওয়ার সর্বোত্তম উপায় হ'ল:

$value = filter_input(INPUT_POST, 'value');

এই ওয়ান-লাইনার প্রায় সমান:

if (!isset($_POST['value'])) {
    $value = null;
} elseif (is_array($_POST['value'])) {
    $value = false;
} else {
    $value = $_POST['value'];
}

আপনি যদি একেবারে স্ট্রিংয়ের মান চান তবে:

$value = (string)filter_input(INPUT_POST, 'value');

25

এর কারণ ভেরিয়েবল '_ user_location' সংজ্ঞায়িত হচ্ছে না। আপনি যদি '$ user_location' ভেরিয়েবলের ঘোষনা করছেন এমন কোনও লুপ ব্যবহার করছেন তবে আপনার অবশ্যই অন্য একটি লুপ থাকতে হবে এবং এটির সংজ্ঞা দিতে হবে। উদাহরণ স্বরূপ:

$a=10;
if($a==5) { $user_location='Paris';} else { }
echo $user_location;

উপরের কোডটি ত্রুটি তৈরি করবে যেমন ইফ লুপটি সন্তুষ্ট নয় এবং অন্য লুপে '$ ব্যবহারকারীর অবস্থান' সংজ্ঞায়িত হয়নি। তবুও পিএইচপিকে ভেরিয়েবলটি প্রতিধ্বনি করতে বলা হয়েছিল। সুতরাং কোডটি সংশোধন করতে আপনাকে নিম্নলিখিতগুলি করতে হবে:

$a=10;
if($a==5) { $user_location='Paris';} else { $user_location='SOMETHING OR BLANK'; }
echo $user_location;

25

"" এর উত্তরে হঠাৎ কেন এগুলি উপস্থিত হয়? আমি এই স্ক্রিপ্টটি কয়েক বছর ধরে ব্যবহার করেছি এবং আমার কোনও সমস্যা হয়নি "

"সমস্ত ত্রুটিগুলি দেখান, তবে 'নোটিশ' এবং 'অবহিত' নয়" এর ডিফল্ট "ত্রুটির প্রতিবেদনের অধীনে বেশিরভাগ সাইটগুলির পক্ষে কাজ করা খুব সাধারণ। এটি php.ini এ সেট করা হবে এবং সার্ভারের সমস্ত সাইটে প্রয়োগ করা হবে। এর অর্থ হল যে উদাহরণগুলিতে ব্যবহৃত "বিজ্ঞপ্তিগুলি" দমন করা হবে (লুকানো) এবং অন্যান্য ত্রুটিগুলি, যা আরও সমালোচিত বলে বিবেচিত হয়, তা প্রদর্শিত / রেকর্ড করা হবে।

অন্যান্য সমালোচনামূলক সেটিংসটি হ'ল ত্রুটিগুলি আড়াল করা যায় (যেমন display_errors"অফ" বা "সিসলগ" সেট করা হয়)।

এই ক্ষেত্রে যা ঘটবে তা হ'ল হয় error_reportingপরিবর্তনগুলিও নোটিশ প্রদর্শন করতে (উদাহরণ অনুসারে) পরিবর্তন করা হয়েছিল এবং / অথবা সেটিংসটি display_errorsস্ক্রিনে পরিবর্তন করা হয়েছিল (তাদের দমন / লগ করার বিপরীতে)।

কেন তারা পরিবর্তন হয়েছে?

সুস্পষ্ট / সরল উত্তরটি হ'ল যে কেউ এই সেটিংগুলিকে php.ini এ সামঞ্জস্য করেছেন, বা পিএইচপি-র একটি আপগ্রেড সংস্করণ এখন আগের থেকে আলাদা একটি php.ini ব্যবহার করছে। এটি দেখতে প্রথম স্থান।

তবে এই সেটিংসগুলিতে ওভাররাইড করাও সম্ভব

  • .htconf (ওয়েব সার্ভারের কনফিগারেশন, vhosts এবং সাব-কনফিগারেশন সহ) *
  • .htaccess
  • পিএইচপি কোড নিজেই

এবং এর যে কোনওটিও পরিবর্তন করা যেতে পারে।

এছাড়াও আরও একটি জটিলতা রয়েছে যে ওয়েব সার্ভার কনফিগারেশন .htaccess নির্দেশাবলী সক্ষম / অক্ষম করতে পারে, সুতরাং আপনার যদি .htaccess এর নির্দেশিকা থাকে যা হঠাৎ করে কাজ শুরু / বন্ধ করে দেয় তবে আপনার জন্য এটি পরীক্ষা করা দরকার।

(.htconf / .htaccess ধরে নিলে আপনি অ্যাপাচি হিসাবে চলছেন। কমান্ড লাইনটি চললে এটি প্রয়োগ হয় না; যদি আইআইএস বা অন্যান্য ওয়েবসার্ভার চালানো হয় তবে আপনাকে সেই অনুযায়ী কনফিগারগুলি পরীক্ষা করে দেখতে হবে)

সারসংক্ষেপ

  • Php.ini- এ চেক error_reportingএবং display_errorsপিএইচপি নির্দেশিকা পরিবর্তিত হয়নি, বা আপনি আগের থেকে আলাদা কোনও php.ini ব্যবহার করছেন না।
  • .Htconf (বা vhosts ইত্যাদি) এ চেক error_reportingএবং display_errorsপিএইচপি নির্দেশিকা পরিবর্তন হয়নি
  • .Htaccess এ চেক error_reportingএবং display_errorsপিএইচপি নির্দেশিকা পরিবর্তন হয়নি
  • আপনার যদি .htaccess নির্দেশনা দেয় তবে তাদের এখনও .htconf ফাইলে অনুমতি দেওয়া হয়েছে কিনা তা পরীক্ষা করে দেখুন
  • অবশেষে আপনার কোড পরীক্ষা করুন; সম্ভবত একটি সম্পর্কযুক্ত লাইব্রেরি; কিনা তা দেখতে error_reportingএবং display_errorsপিএইচপি নির্দেশনা সেখানে স্থাপন করা হয়েছে।


16

আমি এই ত্রুটিটিকে অভিশাপ দিয়েছি, তবে আপনাকে ব্যবহারকারীর ইনপুট থেকে বাঁচতে মনে করিয়ে দেওয়া সহায়ক হতে পারে।

উদাহরণস্বরূপ, আপনি যদি এটি চালাক, শর্টহ্যান্ড কোড বলে মনে করেন:

// Echo whatever the hell this is
<?=$_POST['something']?>

...আবার চিন্তা কর! আরও ভাল সমাধান হ'ল:

// If this is set, echo a filtered version
<?=isset($_POST['something']) ? html($_POST['something']) : ''?>

(আমি html()অক্ষরগুলি থেকে বাঁচতে একটি কাস্টম ফাংশন ব্যবহার করি , আপনার মাইলেজটি ভিন্ন হতে পারে)


15

পিএইচপি 7.0 এ এখন নুল কোলেসিং অপারেটর ব্যবহার করা সম্ভব:

echo "My index value is: " . ($my_array["my_index"] ?? '');

সমান:

echo "My index value is: " . (isset($my_array["my_index"]) ? $my_array["my_index"] : '');

পিএইচপি ম্যানুয়াল পিএইচপি 7.0


বিবৃতি যদি এটিতেও কাজ করে fine if (is_array($my_array['idontexist'] ?? '')) { dosomething(); }
একটি কোডার

আপনার কোডটি আসলে একটি দুর্দান্ত উপেক্ষিত বাগ: ?? - কেবলমাত্র isset()যদি আপনি পাস করেন তবে তা পরীক্ষা করে দেখুন is_array()- এটি একটি বুলিয়ান, অপ্রত্যাশিত আচরণ অনুসরণ করবে।
এলপিয়েল

14

আমি সর্বকালের নিজস্ব দরকারী ফাংশন অস্তিত্ব ব্যবহার করি () যা স্বয়ংক্রিয়ভাবে ভেরিয়েবলগুলি ঘোষণা করে।

আপনার কোডটি হবে -

$greeting = "Hello, ".exst($user_name, 'Visitor')." from ".exst($user_location);


/** 
 * Function exst() - Checks if the variable has been set 
 * (copy/paste it in any place of your code)
 * 
 * If the variable is set and not empty returns the variable (no transformation)
 * If the variable is not set or empty, returns the $default value
 *
 * @param  mixed $var
 * @param  mixed $default
 * 
 * @return mixed 
 */

function exst( & $var, $default = "")
{
    $t = "";
    if ( !isset($var)  || !$var ) {
        if (isset($default) && $default != "") $t = $default;
    }
    else  {  
        $t = $var;
    }
    if (is_string($t)) $t = trim($t);
    return $t;
}

14

খুব সাধারণ ভাষায়
ভুলটি হ'ল আপনি এমন একটি ভেরিয়েবল ব্যবহার করছেন $user_locationযা আপনার দ্বারা সংজ্ঞায়িত করা হয়নি এবং এর কোনও মূল্য নেই তাই আমি আপনাকে প্রস্তাব দিচ্ছি যে দয়া করে এই পরিবর্তনশীলটি ব্যবহার করার আগে এটি ঘোষণা করুন , উদাহরণস্বরূপ:


$user_location = '';
অথবা
$user_location = 'Los Angles';
এটি খুব সাধারণ ত্রুটি যার মুখোমুখি হতে পারেন S সুতরাং চিন্তা করবেন না কেবল ভেরিয়েবলটি ঘোষণা করুন এবং কোডিং উপভোগ করুন


8

কেন সহজ জিনিস রাখা না?

<?php
error_reporting(E_ALL); // making sure all notices are on

function idxVal(&$var, $default = null) {
         return empty($var) ? $var = $default : $var;
  }

echo idxVal($arr['test']);         // returns null without any notice
echo idxVal($arr['hey ho'], 'yo'); // returns yo and assigns it to array index, nice

?>

8

ইহা কি জন্য ঘটিতেছে?

সময়ের সাথে সাথে, পিএইচপি আরও সুরক্ষা-কেন্দ্রিক ভাষাতে পরিণত হয়েছে। ডিফল্ট হিসাবে বন্ধ করা হত সেটিংস এখন ডিফল্ট দ্বারা চালু করা হয়। এর একটি নিখুঁত উদাহরণ E_STRICT, যা পিএইচপি 5.4.0 হিসাবে ডিফল্টরূপে চালু হয়েছিল ।

তদ্ব্যতীত, পিএইচপি ডকুমেন্টেশন অনুসারে, ডিফল্টরূপে, E_NOTICEphp.ini এ অক্ষম করা হয়। পিএইচপি ডক্স এটি ডিবাগিংয়ের উদ্দেশ্যে চালু করার পরামর্শ দেয় । যাইহোক, আমি যখন উবুন্টু সংগ্রহশালা থেকে এবং বিটনামির উইন্ডোজ স্ট্যাক থেকে পিএইচপি ডাউনলোড করি তখন আমি অন্য কিছু দেখি।

; Common Values:
;   E_ALL (Show all errors, warnings and notices including coding standards.)
;   E_ALL & ~E_NOTICE  (Show all errors, except for notices)
;   E_ALL & ~E_NOTICE & ~E_STRICT  (Show all errors, except for notices and coding standards warnings.)
;   E_COMPILE_ERROR|E_RECOVERABLE_ERROR|E_ERROR|E_CORE_ERROR  (Show only errors)
; Default Value: E_ALL & ~E_NOTICE & ~E_STRICT & ~E_DEPRECATED
; Development Value: E_ALL
; Production Value: E_ALL & ~E_DEPRECATED & ~E_STRICT
; http://php.net/error-reporting
error_reporting = E_ALL & ~E_DEPRECATED & ~E_STRICT

লক্ষ্য করুন যে error_reportingউত্পাদিত মানটি ডিফল্টরূপে সেট করা আছে, ডিফল্টরূপে "ডিফল্ট" মান নয়। এটি কিছুটা বিভ্রান্তিকর এবং php.ini এর বাইরে নথিভুক্ত নয়, তাই আমি অন্যান্য বিতরণে এটি বৈধতা দিয়েছি না

আপনার প্রশ্নের উত্তর দিতে, তবে, এই ত্রুটিটি এখন পপ আপ হয় যখন এটি আগে পপ আপ হয় নি কারণ:

  1. আপনি পিএইচপি ইনস্টল করেছেন এবং নতুন ডিফল্ট সেটিংস কিছুটা দুর্বল নথিভুক্ত তবে বাদ দিবেন না E_NOTICE

  2. E_NOTICEঅপরিবর্তিত ভেরিয়েবল এবং অপরিজ্ঞাত সূচকগুলির মতো সতর্কতাগুলি আপনার কোডটিকে আরও পরিষ্কার এবং নিরাপদ করতে সহায়তা করে। আমি আপনাকে বলতে পারি যে, বছর আগে, E_NOTICEসক্ষম রাখার ফলে আমাকে আমার ভেরিয়েবলগুলি ঘোষণা করতে বাধ্য করা হয়েছিল। এটি সি শিখতে অনেক বেশি সহজ করে দিয়েছে, ভেরিয়েবলগুলি ঘোষণা করে না যে এটি একটি উপদ্রব থেকে অনেক বড়।

আমি এটি সম্পর্কে কি করতে পারি?

  1. E_NOTICE"ডিফল্ট মান" অনুলিপি করে E_ALL & ~E_NOTICE & ~E_STRICT & ~E_DEPRECATEDএবং সমতুল্য সাইন ইন করার পরে এটি বর্তমানে কোনও পরিস্থিতিবিহীন যা দিয়ে এটি প্রতিস্থাপন করে বন্ধ করুন error_reporting =। সিজিআই বা এফপিএম ব্যবহার করে অ্যাপাচি, বা পিএইচপি পুনরায় চালু করুন। নিশ্চিত করুন যে আপনি "ডান" php.ini সম্পাদনা করছেন। সঠিকটি হ'ল আপনি অ্যাপাচি, পিএইচপি-এফপিএম চালিয়ে যদি পিএইচপি বা পিএইচপি-এফপিএম, পিএইচপি-এফপিএম চালাচ্ছেন, সিজিআই পিএইচপি-সিজিআই চালাচ্ছেন, ইত্যাদি। এটি প্রস্তাবিত পদ্ধতি নয়, তবে যদি আপনার লিগ্যাসি কোড থাকে তবে সম্পাদনা করা অত্যন্ত কঠিন হতে হবে, তবে এটি আপনার সেরা বাজি হতে পারে।

  2. E_NOTICEফাইল বা ফোল্ডার স্তরটি বন্ধ করুন। আপনার যদি কিছু লিগ্যাসি কোড থাকে তবে এটি অন্যথায় অন্যথায় "সঠিক" উপায়ে করতে চাইলে এটি পছন্দনীয়। এটি করার জন্য, আপনার অ্যাপাচি 2, এনজিনেক্স বা আপনার পছন্দের সার্ভারটি যা-ই হোক না কেন consult অ্যাপাচে, আপনি php_valueভিতরে ব্যবহার করবে <Directory>

  3. আপনার কোডটি পরিষ্কার হওয়ার জন্য পুনরায় লিখুন। যদি আপনাকে উত্পাদনের পরিবেশে যাওয়ার সময় এটি করার দরকার হয় বা কেউ আপনার ত্রুটিগুলি দেখতে না চায় তবে নিশ্চিত করুন যে আপনি কোনও ত্রুটির প্রদর্শন অক্ষম করছেন এবং কেবল আপনার ত্রুটিগুলি লগইন করছেন (দেখুন display_errorsএবং log_errorsphp.ini এবং আপনার সার্ভার সেটিংসে) ।

বিকল্প 3 এ প্রসারিত করতে: এটি আদর্শ। আপনি যদি এই রুটে যেতে পারেন তবে আপনার উচিত। আপনি যদি প্রাথমিকভাবে এই রুটটি না নিয়ে যান তবে আপনার কোডটিকে বিকাশের পরিবেশে পরীক্ষা করে অবশেষে এই রুটটি সরানোর কথা বিবেচনা করুন। আপনি যখন এদিকে আসছেন তখন এ থেকে মুক্তি পান ~E_STRICTএবং ~E_DEPRECATEDভবিষ্যতে কী ভুল হতে পারে তা দেখুন। আপনি প্রচুর অপরিচিত ত্রুটি দেখতে যাচ্ছেন, তবে ভবিষ্যতে যখন আপনাকে পিএইচপি আপগ্রেড করতে হবে তখন কোনও অপ্রীতিকর সমস্যা থেকে বিরত রাখতে চলেছে।

ত্রুটিগুলি অর্থ কী?

Undefined variable: my_variable_name- এটি ঘটে যখন ব্যবহারের আগে কোনও ভেরিয়েবল সংজ্ঞায়িত করা হয় নি। পিএইচপি স্ক্রিপ্ট কার্যকর করা হয়, এটি অভ্যন্তরীণভাবে কেবল একটি নাল মান ধরে। যাইহোক, কোন দৃশ্যে কোনও পরিবর্তনকের সংজ্ঞা দেওয়ার আগে আপনাকে পরীক্ষা করতে হবে? শেষ পর্যন্ত, এটি "স্লোপি কোড" এর পক্ষে যুক্তি। বিকাশকারী হিসাবে, আমি আপনাকে বলতে পারি যে আমি এটি পছন্দ করি যখন আমি একটি ওপেন সোর্স প্রকল্প দেখি যেখানে ভেরিয়েবলগুলি তাদের স্কোপগুলিতে উচ্চতর হিসাবে সংজ্ঞায়িত করা যায় কারণ তাদের সংজ্ঞা দেওয়া যায়। ভবিষ্যতে কোন ভেরিয়েবলগুলি পপ আপ হতে চলেছে তা বলা সহজ করে তোলে এবং কোডটি পড়া / শিখতে আরও সহজ করে তোলে।

function foo()
{
    $my_variable_name = '';

    //....

    if ($my_variable_name) {
        // perform some logic
    }
}

Undefined index: my_index- আপনি যখন একটি অ্যারেতে কোনও মান অ্যাক্সেস করার চেষ্টা করেন এবং এটি বিদ্যমান না তখন এটি ঘটে। এই ত্রুটি প্রতিরোধ করতে, শর্তসাপেক্ষ চেক করুন।

// verbose way - generally better
if (isset($my_array['my_index'])) {
    echo "My index value is: " . $my_array['my_index'];
}

// non-verbose ternary example - I use this sometimes for small rules.
$my_index_val = isset($my_array['my_index'])?$my_array['my_index']:'(undefined)';
echo "My index value is: " . $my_index_val;   

অন্য বিকল্পটি হ'ল আপনার ফাংশনের শীর্ষে একটি ফাঁকা অ্যারে ঘোষণা করা। এই সবসময় সম্ভব হয় না।

$my_array = array(
    'my_index' => ''
);

//...

$my_array['my_index'] = 'new string';

(অতিরিক্ত টিপ)

  • যখন আমি এই এবং অন্যান্য সমস্যার মুখোমুখি হচ্ছিলাম , আমি নেটবিয়ান আইডিই (বিনামূল্যে) ব্যবহার করেছি এবং এটি আমাকে বেশ কয়েকটি সতর্কতা এবং নোটিশ দিয়েছে। তাদের মধ্যে কয়েকটি খুব সহায়ক টিপস সরবরাহ করে। এটি কোনও প্রয়োজন নয় এবং আমি বড় প্রকল্পগুলি বাদ দিয়ে আর আইডিই ব্যবহার করি না। আমি vimআজকাল একজন ব্যক্তি বেশি :)।

6

অপরিজ্ঞাত সূচীর অর্থ একটি অ্যারেতে যেমন আপনি অনুপলব্ধ অ্যারে সূচকটির জন্য অনুরোধ করেছেন in

<?php 

$newArray[] = {1,2,3,4,5};
print_r($newArray[5]);

?>

অপরিজ্ঞাত ভেরিয়েবলের অর্থ আপনি সম্পূর্ণরূপে বিদ্যমান বিদ্যমান ভেরিয়েবল ব্যবহার করেছেন বা উদাহরণ হিসাবে উদাহরণ হিসাবে যা সংজ্ঞায়িত বা আরম্ভ করা হয়নি

<?php print_r($myvar); ?>

অপরিজ্ঞাত অফসেটের অর্থ অ্যারেতে আপনি অ-বিদ্যমান চাবি চেয়েছিলেন। এবং এর সমাধান হ'ল ব্যবহারের আগে পরীক্ষা করা

php> echo array_key_exists(1, $myarray);

4

প্রশ্নের এই অংশ সম্পর্কে:

হঠাৎ কেন এগুলি উপস্থিত হয়? আমি এই স্ক্রিপ্টটি কয়েক বছর ধরে ব্যবহার করেছি এবং আমার কোনও সমস্যা হয়নি।

কোনও নির্দিষ্ট উত্তর নেই তবে সেটিংস কেন 'হঠাৎ' পরিবর্তন করতে পারে তার কয়েকটি সম্ভাব্য ব্যাখ্যা এখানে রয়েছে:

  1. আপনি পিএইচপিটিকে একটি নতুন সংস্করণে আপগ্রেড করেছেন যা ত্রুটি_বর্ধনা, প্রদর্শন_সীমা বা অন্যান্য প্রাসঙ্গিক সেটিংসের জন্য অন্যান্য ডিফল্ট থাকতে পারে।

  2. আপনি কিছু কোড সরিয়েছেন বা প্রবর্তন করেছেন (সম্ভবত কোনও নির্ভরতার মধ্যে) যা রানটাইম ব্যবহারের সময় প্রাসঙ্গিক সেটিংস সেট করে ini_set()বা error_reporting()( কোডগুলিতে এগুলির জন্য অনুসন্ধান করুন)

  3. আপনি ওয়েবসারভার কনফিগারেশন পরিবর্তন করেছেন (এখানে অ্যাপাচি ধরে নিচ্ছেন): .htaccessফাইল এবং vhost কনফিগারেশনগুলি পিএইচপি সেটিংসও ম্যানিপুলেট করতে পারে।

  4. সাধারণত নোটিশগুলি প্রদর্শিত / প্রতিবেদন করা হয় না ( পিএইচপি ম্যানুয়াল দেখুন ) সুতরাং এটি সম্ভব যে সার্ভারটি স্থাপন করার সময়, php.ini ফাইলটি কোনও কারণে লোড করা যায়নি (ফাইলের অনুমতি ??) এবং আপনি ডিফল্ট সেটিংসে ছিলেন । পরবর্তীতে, 'বাগ' সমাধান করা হয়েছে (দুর্ঘটনাক্রমে) এবং এখন এটি নোটিশগুলি দেখানোর জন্য ত্রুটি_বন্দরের সেট সহ সঠিক php.ini ফাইলটি লোড করতে পারে।


3

ক্লাসগুলির সাথে কাজ করার ক্ষেত্রে আপনাকে অবশ্যই সদস্য ভেরিয়েবলগুলি ব্যবহার করে তা নিশ্চিত করতে হবে $this:

class Person
{
    protected $firstName;
    protected $lastName;

    public function setFullName($first, $last)
    {
        // Correct
        $this->firstName = $first;

        // Incorrect
        $lastName = $last;

        // Incorrect
        $this->$lastName = $last;
    }
}

3

অপরিজ্ঞাত সূচকের নোটিশ কেন ফেলে দেওয়া হবে তার অন্য কারণটি হ'ল এটি একটি কলামটি ডাটাবেস ক্যোয়ারী থেকে বাদ দেওয়া হয়েছিল।

অর্থাৎ,

$query = "SELECT col1 FROM table WHERE col_x = ?";

তারপরে একটি লুপের মধ্যে আরও কলাম / সারি অ্যাক্সেস করার চেষ্টা করছে।

অর্থাৎ,

print_r($row['col1']);
print_r($row['col2']); // undefined index thrown

বা একটি whileলুপ:

while( $row = fetching_function($query) ) {

    echo $row['col1'];
    echo "<br>";
    echo $row['col2']; // undefined index thrown
    echo "<br>";
    echo $row['col3']; // undefined index thrown

}

অন্য কিছু যা লক্ষ করা দরকার তা হ'ল * এনআইএক্স ওএস এবং ম্যাক ওএস এক্সে জিনিসগুলি সংবেদনশীল।

স্ট্যাকের ফলঅনউইং প্রশ্নোত্তর পরামর্শ নিন:


3

টেরিনারি ব্যবহার করা সহজ, পঠনযোগ্য এবং পরিষ্কার:

প্রাক পিএইচপি 7
অন্য ভেরিয়েবলের মানটি যদি সেট করা থাকে তবে একটি ভেরিয়েবল বরাদ্দ করুন, অন্যথায় বরাদ্দ করুনnull(বা আপনার যে কোনও ডিফল্ট মান প্রয়োজন):

$newVariable = isset($thePotentialData) ? $thePotentialData : null;

পিএইচপি 7+ নাল কোলেসিং অপারেটর
ব্যবহার ব্যতীত একই । এটি অন্তর্নির্মিত হওয়ার সাথে সাথে আর কল করার দরকার নেই এবং ভেরিয়েবলটির মানটি যাচাই করা হচ্ছে বলে প্রত্যাশিত হিসাবে ফিরে আসার দরকার নেই: isset()

$newVariable = $thePotentialData ?? null;

উভয়ই ওপি প্রশ্ন থেকে বিজ্ঞপ্তিগুলি বন্ধ করবে এবং উভয়ই এর সঠিক সমতুল্য:

if (isset($thePotentialData)) {
    $newVariable = $thePotentialData;
} else {
    $newVariable = null;
}

 
যদি আপনার কোনও নতুন ভেরিয়েবল সেট করার প্রয়োজন না হয় তবে আপনি সরাসরি টের্নারের ফেরত মান যেমন echoফাংশন আর্গুমেন্ট ইত্যাদি ব্যবহার করতে পারেন :

ইকো:

echo 'Your name is: ' . isset($name) ? $name : 'You did not provide one';

ফাংশন:

$foreName = getForeName(isset($userId) ? $userId : null);

function getForeName($userId)
{
    if ($userId === null) {
        // Etc
    }
}

উপরেরগুলি সেশন ইত্যাদির সাথে অ্যারেগুলির সাথে ঠিক একইভাবে কাজ করবে, যেমন ভেরিয়েবলটি পরীক্ষা করা হচ্ছে এমনটি প্রতিস্থাপন করে:
$_SESSION['checkMe']
বা তবে আপনার প্রয়োজনীয় স্তরগুলি অনেকগুলি গভীর, যেমন:
$clients['personal']['address']['postcode']


 

দমন:

@আপনার ত্রুটি প্রতিবেদন করার স্তরের সাথে পিএইচপি বিজ্ঞপ্তিগুলি দমন করা বা হ্রাস করা সম্ভব , তবে এটি সমস্যার সমাধান করে না , এটি কেবল ত্রুটি লগতে রিপোর্ট করা বন্ধ করে দেয়। এর অর্থ হ'ল আপনার কোডটি এখনও এমন একটি ভেরিয়েবল ব্যবহার করার চেষ্টা করেছিল যা সেট করা হয়নি যা অনুপস্থিত মানটি কতটা গুরুত্বপূর্ণ তা নির্ভর করে something

আপনার সত্যিকার অর্থে এই সমস্যাটি পরীক্ষা করা এবং এটি যথাযথভাবে পরিচালনা করা উচিত, হয় অন্যরকম বার্তা সরবরাহ করা, বা সুনির্দিষ্ট অবস্থাটি সনাক্ত করার জন্য কেবল অন্য সমস্ত কিছুর জন্য একটি শূন্যমূল্য ফিরিয়ে দেওয়া।

যদি আপনি কেবল খেয়াল করেন যে নোটিশটি ত্রুটি লগের মধ্যে না থেকেছে তবে একটি বিকল্প হিসাবে আপনি কেবল ত্রুটি লগকে উপেক্ষা করতে পারেন।


1

এইচটিএমএল ফর্ম জমা দেওয়ার পরে ভেরিয়েবলের একটি সাধারণ কারণ হ'ল ফর্ম উপাদানটি কোনও <form>ট্যাগের মধ্যে নেই:

উদাহরণ: এলিমেন্টটি এর মধ্যে নেই <form>

<form action="example.php" method="post">
    <p>
        <input type="text" name="name" />
        <input type="submit" value="Submit" />
    </p>
</form>

<select name="choice">
    <option value="choice1">choice 1</option>
    <option value="choice2">choice 2</option>
    <option value="choice3">choice 3</option>
    <option value="choice4">choice 4</option>
</select>

উদাহরণ: উপাদান এখন অন্তর্ভুক্ত <form>

<form action="example.php" method="post">
    <select name="choice">
        <option value="choice1">choice 1</option>
        <option value="choice2">choice 2</option>
        <option value="choice3">choice 3</option>
        <option value="choice4">choice 4</option>
    </select>
    <p>
        <input type="text" name="name" />
        <input type="submit" value="Submit" />
    </p>
</form>

0

সম্ভবত আপনি পুরানো পিএইচপি সংস্করণ ব্যবহার করেছিলেন এবং এখন পর্যন্ত পিএইচপি আপগ্রেড করা কারণ এটি বছরের পর বছর ধরে কোনও ত্রুটি ছাড়াই কাজ করছে। পিএইচপি 4 পর্যন্ত কোনও ত্রুটি ছিল না যদি আপনি এটির সংজ্ঞা না দিয়ে ভেরিয়েবল ব্যবহার করছেন তবে পিএইচপি 5 এর পরে এটি প্রশ্নের মধ্যে উল্লিখিত কোডগুলির জন্য ত্রুটি ছুঁড়ে দেয়।


0

ফাইলগুলির সাথে কাজ করার সময়, একটি সঠিক এনটাইটাইপ এবং একটি পোস্ট পদ্ধতি আবশ্যক, যা ফর্মের মধ্যে অন্তর্ভুক্ত না করা থাকলে একটি অনির্ধারিত সূচক নোটিশকে ট্রিগার করবে।

ম্যানুয়ালটিতে নিম্নলিখিত বুনিয়াদি বাক্য গঠন রয়েছে:

এইচটিএমএল

<!-- The data encoding type, enctype, MUST be specified as below -->
<form enctype="multipart/form-data" action="__URL__" method="POST">
    <!-- MAX_FILE_SIZE must precede the file input field -->
    <input type="hidden" name="MAX_FILE_SIZE" value="30000" />
    <!-- Name of input element determines name in $_FILES array -->
    Send this file: <input name="userfile" type="file" />
    <input type="submit" value="Send File" />
</form>

পিএইচপি

<?php
// In PHP versions earlier than 4.1.0, $HTTP_POST_FILES should be used instead
// of $_FILES.

$uploaddir = '/var/www/uploads/';
$uploadfile = $uploaddir . basename($_FILES['userfile']['name']);

echo '<pre>';
if (move_uploaded_file($_FILES['userfile']['tmp_name'], $uploadfile)) {
    echo "File is valid, and was successfully uploaded.\n";
} else {
    echo "Possible file upload attack!\n";
}

echo 'Here is some more debugging info:';
print_r($_FILES);

print "</pre>";

?>

রেফারেন্স:


0

আমি এ সম্পর্কে একটি প্রশ্ন জিজ্ঞাসা করেছি এবং বার্তাটি সহ আমাকে এই পোস্টে উল্লেখ করা হয়েছে:

এই প্রশ্নের ইতিমধ্যে এখানে একটি উত্তর আছে:

"বিজ্ঞপ্তি: অপরিজ্ঞাত পরিবর্তনশীল", "বিজ্ঞপ্তি: অপরিজ্ঞাত সূচক", এবং "বিজ্ঞপ্তি: অপরিজ্ঞাত অফসেট" পিএইচপি ব্যবহার করে

আমি আমার প্রশ্ন এবং সমাধান এখানে ভাগ করে নিচ্ছি:

এটি ত্রুটি:

এখানে চিত্র বর্ণনা লিখুন

154 লাইন সমস্যা। 154 লাইনে এটি আমার রয়েছে:

153    foreach($cities as $key => $city){
154        if(($city != 'London') && ($city != 'Madrid') && ($citiesCounterArray[$key] >= 1)){

আমি মনে করি সমস্যাটি হ'ল আমি লিখছি যদি ভেরিয়েবলের জন্য শর্ত থাকে $cityতবে এটি মূল নয় তবে মান $key => $city। প্রথমত, আপনি যদি নিশ্চিত করতে পারেন যে এটি যদি সতর্কতার কারণ হয়? দ্বিতীয়ত, যদি সমস্যা হয় তবে আমি কেন মানটির উপর ভিত্তি করে একটি শর্ত লিখতে পারি না? শর্তটি লেখার জন্য কীটি কী থাকা উচিত?

আপডেট 1: সমস্যাটি হ'ল এক্সিকিউট করার সময় $citiesCounterArray[$key], কখনও কখনও $keyকোনও কীটির সাথে মিল থাকে যা $citiesCounterArrayঅ্যারেতে উপস্থিত নেই , তবে এটি আমার লুপের ডেটার ভিত্তিতে সর্বদা হয় না। আমার যা দরকার তা হল একটি শর্ত সেট করা যাতে $keyঅ্যারেটিতে উপস্থিত থাকে তবে কোডটি চালান, অন্যথায় এটি এড়িয়ে যান।

আপডেট 2: আমি এটি ব্যবহার করে এটি ঠিক করেছি array_key_exists():

foreach($cities as $key => $city){
    if(array_key_exists($key, $citiesCounterArray)){
        if(($city != 'London') && ($city != 'Madrid') && ($citiesCounterArray[$key] >= 1)){

0

এই ত্রুটিগুলি ঘটে যখনই আমরা সেট না করে এমন একটি পরিবর্তনশীল ব্যবহার করি।

এগুলি মোকাবেলার সর্বোত্তম উপায় হ'ল উন্নয়নের সময় ত্রুটি প্রতিবেদন করা।

এতে ত্রুটি প্রতিবেদন সেট করতে:

ini_set('error_reporting', 'on');
ini_set('display_errors', 'on');
error_reporting(E_ALL);

উত্পাদন সার্ভারগুলিতে, ত্রুটি প্রতিবেদন বন্ধ রয়েছে, অতএব, আমরা এই ত্রুটিগুলি পাই না।

বিকাশ সার্ভারে তবে আমরা ত্রুটি প্রতিবেদন সেট করতে পারি।

এই ত্রুটি থেকে মুক্তি পেতে আমরা নিম্নলিখিত উদাহরণটি দেখতে পাই:

if ($my == 9) {
 $test = 'yes';  // Will produce error as $my is not 9.
}
echo $test;

আমরা ভেরিয়েবলগুলি NULLতাদের মান নির্ধারণের আগে বা সেগুলি ব্যবহারের আগে শুরু করতে পারি।

সুতরাং, আমরা কোডটি এইভাবে সংশোধন করতে পারি:

$test = NULL;
if ($my == 9) {
 $test = 'yes';  // Will produce error as $my is not 9.
}
echo $test;

এটি কোনও প্রোগ্রামের যুক্তিকে বিরক্ত করবে না এবং $testমান না থাকলেও নোটিশ তৈরি করবে না ।

সুতরাং, মূলত, বিকাশের জন্য ত্রুটি প্রতিবেদন সেট করা সর্বদা ভাল।

এবং সমস্ত ত্রুটি ঠিক করুন।

এবং উত্পাদনের সময়, ত্রুটি প্রতিবেদন বন্ধ করা উচিত।


-1

এই বিজ্ঞপ্তিগুলি হ'ল কারণ আপনার ব্যবহৃত ভেরিয়েবলটি নেই definedএবং my_indexকীটি $my_arrayভেরিয়েবলের মধ্যে উপস্থিত ছিল না ।

এই বিজ্ঞপ্তিগুলি প্রতিবার ট্রিগার করা হয়েছিল, কারণ আপনার codeসঠিক নয়, তবে সম্ভবত আপনার বিজ্ঞপ্তিগুলির প্রতিবেদন ছিল না।

বাগগুলি সমাধান করুন:

$my_variable_name = "Variable name"; // defining variable
echo "My variable value is: " . $my_variable_name;

if(isset($my_array["my_index"])){
    echo "My index value is: " . $my_array["my_index"]; // check if my_index is set 
}

এটি পাওয়ার আরও একটি উপায়:

ini_set("error_reporting", false)

-2

পিএইচপি-তে আপনার ভেরিয়েবলটি সংজ্ঞায়িত করতে মুষ্টির প্রয়োজন হয় তার পরে আপনি এটি ব্যবহার করতে পারেন।
আমরা ভেরিয়েবলটি খুব দক্ষ উপায়ে সংজ্ঞায়িত বা না তা পরীক্ষা করতে পারি!

//If you only want to check variable has value and value has true and false value.
//But variable must be defined first.

if($my_variable_name){

}

//If you want to check variable is define or undefine
//Isset() does not check that variable has true or false value
//But it check null value of variable
if(isset($my_variable_name)){

}

সরল ব্যাখ্যা

//It will work with :- true,false,NULL
$defineVarialbe = false;
if($defineVarialbe){
    echo "true";
}else{
    echo "false";
}

//It will check variable is define or not and variable has null value.
if(isset($unDefineVarialbe)){
    echo "true";
}else{
    echo "false";
}
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.