রেফারেন্স - পিএইচপি-তে এই ত্রুটিটির অর্থ কী?


1137

এটা কি?

পিএইচপি প্রোগ্রাম করার সময় আপনি যে সতর্কতা, ত্রুটি এবং নোটিশগুলির মুখোমুখি হতে পারেন সে সম্পর্কে এটি বেশ কয়েকটি উত্তর এবং সেগুলি কীভাবে ঠিক করবেন সে সম্পর্কে কোনও ক্লু নেই। এটি একটি সম্প্রদায় উইকিও তাই প্রত্যেককে এই তালিকায় যোগ এবং পরিচালনা বজায় রাখার জন্য আমন্ত্রিত করা হয়।

কেন?

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

আমার এখানে কি করা উচিত?

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

আপনি যদি অবদান রাখতে চান তবে দয়া করে আপনার "প্রিয়" ত্রুটি বার্তা, সতর্কতা বা নোটিশ, প্রতি উত্তরের একটি, একটি সংক্ষিপ্ত বিবরণ যুক্ত করুন (এমনকি এটি কেবল তাদের ম্যানুয়াল পৃষ্ঠায় শর্তাবলী তুলে ধরেছে), একটি সম্ভাব্য সমাধান বা ডিবাগিং পদ্ধতির এবং বিদ্যমান প্রশ্নোত্তরের একটি তালিকা যা মূল্যবান। এছাড়াও, কোনও বিদ্যমান উত্তর উন্নত করতে নির্দ্বিধায়।

ক্রমতালিকা

এছাড়াও, দেখুন:


7
এছাড়াও, মন্তব্যগুলি থেকে আলোচনার বাইরে যাওয়ার জন্য, দয়া করে এই মেটা প্রশ্নটিতে যান
আর্লজ



উত্তর:


275

সতর্কতা: শিরোনামের তথ্য পরিবর্তন করতে পারে না - শিরোনাম ইতিমধ্যে প্রেরিত

ঘটে যখন আপনার স্ক্রিপ্ট ক্লায়েন্টে এইচটিটিপি শিরোনাম প্রেরণের চেষ্টা করে তবে ইতিমধ্যে এর আগে আউটপুট ছিল, ফলস্বরূপ শিরোনামটি ক্লায়েন্টকে ইতিমধ্যে প্রেরণ করা হয়েছিল।

এটি একটি E_WARNINGএবং এটি স্ক্রিপ্টটি থামাবে না।

একটি সাধারণ উদাহরণটি হ'ল এটির মতো একটি টেম্পলেট ফাইল:

<html>
    <?php session_start(); ?>
    <head><title>My Page</title>
</html>
...

session_start()ফাংশন ক্লায়েন্ট অধিবেশন কুকির সাথে হেডার পাঠাতে চেষ্টা করবে। কিন্তু পিএইচপি ইতিমধ্যে শিরোনাম পাঠিয়েছে যখন এটি <html>আউটপুট প্রবাহে উপাদানটি লিখেছিল । আপনি session_start()শীর্ষে যেতে হবে।

কোডটি সতর্কবার্তা ট্রিগার করার আগে লাইনগুলি পেরিয়ে আপনি এটি সমাধান করতে পারেন এবং এটি কোথায় আউটপুট দেয় তা যাচাই করতে পারেন। সেই কোডের আগে যে কোনও শিরোনাম প্রেরণ কোডটি সরান।

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

আপনার ফাইলটিতে যদি একাধিক <?php ... ?>কোড ব্লক থাকে তবে তাদের মধ্যে কোনও ফাঁকা স্থান থাকা উচিত নয়। (দ্রষ্টব্য: আপনার যদি স্বয়ংক্রিয়ভাবে তৈরি করা কোড থাকে তবে আপনার একাধিক ব্লক থাকতে পারে)

এছাড়াও আপনার কোডটিতে কোনও বাইট অর্ডার চিহ্ন নেই তা নিশ্চিত করুন, উদাহরণস্বরূপ যখন স্ক্রিপ্টটির এনকোডিংটি বিওএম সহ ইউটিএফ -8 থাকে।

সম্পর্কিত প্রশ্নাবলী:


2
আপনি যদি ওয়ার্ডপ্রেস ব্যবহার করছেন তবে থিম ফাইলগুলি পরীক্ষা করুন। আমি যখন কোনও সাইটকে ওয়ার্ডপ্রেসের নতুন সংস্করণে আপগ্রেড করেছি তখন আমি থিমটি আপডেট করতে পারিনি কারণ বেশ কয়েক বছরে এটি আপডেট হয়নি। এই সমস্যা ক্রপ আপ। দেখা গেল যে ফাংশন.এফপি ফাইলের একাধিক <<? ?> এর মধ্যে ফাঁক দিয়ে ব্লক করুন block
রায় লেবান

2
@ রায়লেবান "যদি আপনার ফাইলটিতে এটির একাধিক ব্লক থাকে ..." তবে এর অর্থ কী তা আমি নিশ্চিত নই। "ব্লক" কী? একটি ব্লকে কি <?php ?>"ব্লকের একাধিক ব্লক" থাকবে <?php ?> <?php ?>?
অ্যান্ড্রু ফক্স

2
যদি সম্ভব হয় তবে PHP.ini কনফিগারেশন ফাইলটিতে 'আউটপুট বাফারিং' বৈশিষ্ট্যটি চালু করুন t এটি এই সমস্যাটি স্ল্যাভ করার জন্য ব্যবহৃত হয় t এটি এইচটিএমএল ফাইলটি আউটপুট বাফারে সংরক্ষণ হয় এবং স্ক্রিপ্ট বন্ধ হওয়ার পরে ক্লায়েন্টকে প্রেরণ করা হয়, তাই যদি দুটি শিরোনামগুলি বিভিন্ন স্থানে জারি করা হয় তবে পুরানো শিরোনামটি নতুন শিরোনাম প্রতিস্থাপন করা হবে।
নিধিন ডেভিড

191

মারাত্মক ত্রুটি: অ-অবজেক্টে ... সদস্য ফাংশনে কল করুন

কোডের সাথে সংঘবদ্ধ হয় xyz->method()যেখানে xyzকোনও বস্তু নয় এবং তাই এটি কল করা methodযায় না।

এটি একটি মারাত্মক ত্রুটি যা স্ক্রিপ্টটি থামিয়ে দেবে (সামনের সামঞ্জস্যতার বিজ্ঞপ্তি: এটি পিএইচপি 7 দিয়ে শুরু করে একটি ক্যাচযোগ্য ত্রুটি হয়ে যাবে)।

প্রায়শই এটি একটি চিহ্ন যে কোডটিতে ত্রুটির শর্তগুলির জন্য চেকগুলি অনুপস্থিত রয়েছে। যাচাই করুন যে কোনও বস্তু আসলে তার পদ্ধতিগুলি বলার আগে একটি বস্তু।

একটি সাধারণ উদাহরণ হবে

// ... some code using PDO
$statement = $pdo->prepare('invalid query', ...);
$statement->execute(...);

উপরের উদাহরণে, ক্যোয়ারী প্রস্তুত করা যাবে না এবং prepare()বরাদ্দ falseকরা হবে $statementexecute()পদ্ধতিটি কল করার চেষ্টা করার পরে মারাত্মক ত্রুটি হবে কারণ falseএটি একটি "অ-অবজেক্ট" কারণ মানটি বুলিয়ান।

আপনার ফাংশন কেন কোনও বস্তুর পরিবর্তে বুলেটিয়ান ফিরিয়ে দিয়েছে তা নির্ধারণ করুন। উদাহরণস্বরূপ, $pdoঘটে যাওয়া শেষ ত্রুটির জন্য অবজেক্টটি পরীক্ষা করুন । এটি কীভাবে ডিবাগ করা যায় তার বিশদটি নির্দিষ্ট ফাংশন / অবজেক্ট / শ্রেণীর ক্ষেত্রে কীভাবে ত্রুটিগুলি পরিচালনা করা হয় তার উপর নির্ভর করবে।

এমনকি ->prepareযদি এটিও ব্যর্থ হয় তবে আপনার $pdoডাটাবেস হ্যান্ডেল অবজেক্টটি বর্তমান স্কোপে প্রবেশ করবে না । এটি কোথায় সংজ্ঞায়িত হয়েছে তা সন্ধান করুন। তারপরে এটি প্যারামিটার হিসাবে পাস করুন, এটিকে সম্পত্তি হিসাবে সঞ্চয় করুন, বা এটি বিশ্বব্যাপী সুযোগের মাধ্যমে ভাগ করুন।

আর একটি সমস্যা শর্তাধীন একটি অবজেক্ট তৈরি করা এবং সেই শর্তাধীন ব্লকের বাইরে কোনও পদ্ধতিতে কল করার চেষ্টা করা হতে পারে। উদাহরণ স্বরূপ

if ($someCondition) {
    $myObj = new MyObj();
}
// ...
$myObj->someMethod();

শর্তাধীন ব্লকের বাইরে পদ্ধতিটি চালানোর চেষ্টা করে, আপনার অবজেক্টটি সংজ্ঞায়িত করা হতে পারে না।

সম্পর্কিত প্রশ্নাবলী:


115

কিছুই দেখা যায় না। পৃষ্ঠাটি খালি এবং সাদা।

মৃত্যুর হোয়াইট পেজ বা মৃত্যুর হোয়াইট স্ক্রিন হিসাবেও পরিচিত । ত্রুটি প্রতিবেদন বন্ধ করা এবং মারাত্মক ত্রুটি (প্রায়শই সিনট্যাক্স ত্রুটি) ঘটে গেলে এটি ঘটে।

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

কখনও কখনও ত্রুটির প্রদর্শন সাময়িকভাবে সক্ষম করা আরও সহজ হতে পারে। সাদা পৃষ্ঠাটি ত্রুটি বার্তা প্রদর্শন করবে। সাবধানতা অবলম্বন করুন কারণ এই ত্রুটিগুলি ওয়েবসাইটে দেখার জন্য সবার কাছে দৃশ্যমান।

নিম্নলিখিত পিএইচপি কোডটি স্ক্রিপ্টের শীর্ষে যুক্ত করে এটি সহজেই করা যায়:

ini_set('display_errors', 1); error_reporting(~0);

কোড ত্রুটিগুলির প্রদর্শন চালু করে এবং সর্বোচ্চ স্তরে রিপোর্টিং সেট করবে।

যেহেতু ini_set()রানটাইম এ কার্যকর করা হয় এটি পার্সিং / সিনট্যাক্স ত্রুটিতে কোনও প্রভাব ফেলেনি। সেই ত্রুটিগুলি লগতে উপস্থিত হবে। আপনি যদি আউটপুটগুলিতেও সেগুলি প্রদর্শন করতে চান (যেমন একটি ব্রাউজারে) আপনাকে অবশ্যই display_startup_errorsনির্দেশিকা সেট করতে হবে true। এটি হয় php.iniবা একটি .htaccessবা অন্য কোনও পদ্ধতি দ্বারা করুন যা রানটাইমের আগে কনফিগারেশনকে প্রভাবিত করে

আপনি সেট একই পদ্ধতি ব্যবহার করতে পারেন log_errors এবং error_log আপনার নিজের লগ ফাইল অবস্থান চয়ন করতে নির্দেশনা।

লগটি দেখতে বা প্রদর্শনটি ব্যবহার করে আপনি একটি আরও ভাল ত্রুটি বার্তা এবং কোডের লাইন পাবেন যেখানে আপনার স্ক্রিপ্টটি থামতে চলেছে।

সম্পর্কিত প্রশ্নাবলী:

সম্পর্কিত ত্রুটি:


3
error_reporting(~0);কেন না -1? এটিই যা ~0মূল্যায়ন করে এবং ক্রিপ্টিক অনেক কম।
Fabrício ম্যাট

3
আমি মনে করি উভয় একইভাবে রহস্যজনক। ~0আরও সুস্পষ্ট আইএমও: খালি বিট সেটটিকে প্রত্যাখ্যান করুন, অর্থাৎ সমস্ত পতাকা সক্ষম করুন । -1 এর অর্থ দাঁড়ায় না যে সি-তে স্ট্রপোস () এর মতো found পাওয়া যায় না for তবে দাঁড়াবে সমস্ত পতাকা সমেত বিটসেট হিসাবে, কারণ -1 বাইনারি 1111'1111'1111'1111(32 বিটের জন্য) is
nlply

2
ওফস, 1111'1111'1111'1111সত্যই 16 বিট, তবে আমি আশা করি আপনি কী বলতে চাইছেন তা বুঝতে পেরেছেন।
31:36

3
@ ইভানসোল্টসেভ, 5.4 এর আগে সংস্করণগুলির জন্য দুঃখিত, না, E_STRICTঅন্তর্ভুক্ত নয় E_ALLphp.net/manual/en/errorfunc.constants.php এবং নীচে স্ক্রোল করুন E_STRICT
স্পষ্টত

102

বিজ্ঞপ্তি: অপরিজ্ঞাত সূচক

অ্যারেতে উপস্থিত না থাকা কোনও কী দ্বারা অ্যারে অ্যাক্সেস করার চেষ্টা করার পরে ঘটে যায়।

Undefined Indexনোটিশের একটি সাধারণ উদাহরণ হ'ল ( ডেমো )

$data = array('foo' => '42', 'bar');
echo $data['spinach'];
echo $data[1];

উভয় spinachএবং 1অ্যারে বিদ্যমান নেই, একটি E_NOTICEট্রিগার কারণ।

সমাধানটি সূচকটি অ্যাক্সেস করার আগে সূচক বা অফসেট উপস্থিত রয়েছে তা নিশ্চিত করা। এর অর্থ এই হতে পারে যে আপনার সূচকগুলি যখন আশা করা হয় তখন তাদের উপস্থিতি রয়েছে কিনা তা নিশ্চিত করতে আপনার প্রোগ্রামে একটি বাগ ঠিক করতে হবে। অথবা এটা এর অর্থ হতে পারে যে আপনার ইনডেক্স ব্যবহার অস্তিত্ব কিনা পরীক্ষা প্রয়োজন array_key_existsবা isset:

$data = array('foo' => '42', 'bar');
if (array_key_exists('spinach', $data)) {
    echo $data['spinach'];
}
else {
    echo 'No key spinach in the array';
}

আপনার মতো কোড থাকলে:

<?php echo $_POST['message']; ?>
<form method="post" action="">
    <input type="text" name="message">
    ...

তারপর $_POST['message']যখন এই পৃষ্ঠার প্রথমবার লোড সেট করা হবে না এবং আপনি উপরোক্ত ত্রুটি পেতে হবে। কেবলমাত্র যখন ফর্মটি জমা দেওয়া হবে এবং এই কোডটি দ্বিতীয়বার চালানো হবে তখন অ্যারে সূচকটি উপস্থিত থাকবে। আপনি সাধারণত এটি দিয়ে পরীক্ষা করে দেখুন:

if ($_POST)  ..  // if the $_POST array is not empty
// or
if ($_SERVER['REQUEST_METHOD'] == 'POST') ..  // page was requested with POST

সম্পর্কিত প্রশ্নাবলী:


আমি ব্যবহার করার ঝোঁকif(!empty($_POST['message'])){ //do stuff }
kurttpage

85

সতর্কতা: mysql_fetch_array () প্যারামিটার 1 রিসোর্স হিসাবে প্রত্যাশা করবে, বুলিয়ান দেওয়া হয়েছে

প্রথমে এবং সর্বাগ্রে:

দয়া করে mysql_*নতুন কোডে ফাংশন ব্যবহার করবেন না । এগুলি আর রক্ষণাবেক্ষণ করা হয় না এবং সরকারীভাবে হ্রাস করা হয় । দেখুন লাল বক্স ? পরিবর্তে প্রস্তুত বিবৃতি সম্পর্কে জানুন, এবং PDO বা মাইএসকিউএলি ব্যবহার করুন- এই নিবন্ধটি আপনাকে সিদ্ধান্ত নিতে সহায়তা করবে। আপনি যদি PDO চয়ন করেন তবে এখানে একটি ভাল টিউটোরিয়াল রয়েছে


আপনি যখন ফলাফল থেকে ডেটা আনার চেষ্টা করবেন তখন এটি ঘটে mysql_queryতবে ক্যোয়ারী ব্যর্থ হয়েছে।

এটি একটি সতর্কতা এবং স্ক্রিপ্টটি থামাবে না, তবে আপনার প্রোগ্রামটিকে ভুল করে দেবে।

আপনি ফলাফলের দ্বারা ফিরে চেক করতে হবে mysql_queryদ্বারা

$res = mysql_query($sql);
if (!$res) {
   die(mysql_error());
}
// after checking, do the fetch

সম্পর্কিত প্রশ্নাবলী:

সম্পর্কিত ত্রুটি:

mysql*প্যারামিটার হিসাবে কোনও মাইএসকিউএল ফলাফলের উত্স আশা করে এমন অন্যান্য ফাংশন একই কারণে একই ত্রুটি তৈরি করবে।


5
শুধু একটি নোট. যদি mysql_queryযথেষ্ট খারাপ না or dieহয় তবে এর উপরে যুক্ত করা চোটের অপমান যোগ করছে।
মাদারার ঘোস্ট

আমার যে সমস্যার মুখোমুখি হচ্ছে $res = mysql_query($query)তা হ'ল 1 যদি ক্যোয়ারী সফল হয় তবে এটি সত্য বলে বিবেচিত হয়। সুতরাং ফলাফল পাস mysql_query করার mysql_fetch_array() সময় নোটিশ শো।
এমবিয়

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

@ এক্সড্যাজ এটিই আমি যে সমস্যার মুখোমুখি হয়েছি, প্রবেশ করান আপডেট সত্য প্রদান করে তাই আমি এই ত্রুটি থেকে মুক্তি পেতে পারি না mysql_fetch_array() expects parameter 1 to be resource, boolean given in select দয়া করে দেখুন - এই ত্রুটি থেকে মুক্তি পাওয়ার জন্য কোনও পরামর্শ?
এমবিয়

2
@ এমবাই mysql_fetch_array()সিলেক্ট ক্যোয়ারির জন্য, সন্নিবেশ করা এবং আপডেট করার জন্য, আপনাকে ফলাফল সেট আনার দরকার নেই (এবং কোনও ফলাফল সেট আপনাকে আনতে দেয় না)।
xdazz

79

মারাত্মক ত্রুটি: বস্তু প্রসঙ্গে না থাকলে এটি ব্যবহার context

$thisপিএইচপি-তে একটি বিশেষ পরিবর্তনশীল যা নির্ধারিত হতে পারে না। যদি এটি কোনও প্রসঙ্গে অ্যাক্সেস করা হয় যেখানে এটি বিদ্যমান নেই তবে এই মারাত্মক ত্রুটি দেওয়া হয়।

এই ত্রুটি ঘটতে পারে:

  1. যদি কোনও স্থিতিশীল পদ্ধতিটিকে স্ট্যাটিকালি বলা হয়। উদাহরণ:

    class Foo {
       protected $var;
       public function __construct($var) {
           $this->var = $var;
       }
    
       public static function bar () {
           // ^^^^^^
           echo $this->var;
           //   ^^^^^
       }
    }
    
    Foo::bar();
    

    কীভাবে ঠিক করবেন: আপনার কোডটি আবার পর্যালোচনা করুন,$thisকেবল কোনও বস্তুর প্রসঙ্গে ব্যবহার করা যেতে পারে এবং স্থির পদ্ধতিতে কখনও ব্যবহার করা উচিত নয়। এছাড়াও, একটি স্থিতিশীল পদ্ধতি অ স্থির সম্পত্তি অ্যাক্সেস করা উচিত নয়। self::$static_propertyস্থির সম্পত্তি অ্যাক্সেস করতেব্যবহার করুন।

  2. যদি কোনও শ্রেণি পদ্ধতি থেকে কোডগুলি কোনও সাধারণ ক্রিয়ায় বা কেবল বিশ্বব্যাপী সুযোগে অনুলিপি করা হয় এবং$this বিশেষ পরিবর্তনশীল রাখা হয় ।
    কীভাবে ঠিক করবেন: কোডটি পর্যালোচনা করুন এবং $thisএকটি পৃথক বিকল্পের পরিবর্তনশীল দিয়ে প্রতিস্থাপন করুন।

সম্পর্কিত প্রশ্নাবলী:

  1. স্থিতিশীল হিসাবে অ-স্থিতিক পদ্ধতিটিকে কল করুন: পিএইচপি মারাত্মক ত্রুটি: বস্তু প্রসঙ্গে না থাকলে Using এটি ব্যবহার
  2. কোডের ওপরে অনুলিপি করুন: মারাত্মক ত্রুটি: বস্তু প্রসঙ্গে না থাকলে context এটি ব্যবহার করা
  3. স্ট্যাকওভারফ্লোতে প্রশ্নগুলি "অবজেক্ট প্রসঙ্গে না থাকলে সমস্ত" এটি ব্যবহার করছে

2
আপনি কীভাবে এটি ডাব্লু / ক্লোজারগুলি (এমনকি অ স্থির পদ্ধতিতেও) কাজ করে এবং 5.4-এ এটি কীভাবে "স্থির" হয় তাও আপনি উল্লেখ করতে চাইতে পারেন।
কেন্ডাল হপকিন্স

2
@hakre আমি একটি বন্ধের মধ্যে একটি স্থির কল সম্পর্কে কথা বলছিলাম। লাইক $closure = function() { self::method(); }
কেন্ডাল হপকিনস

2
@ কেন্ডালহপকিন্স: এটি একটি পৃথক ত্রুটি: "মারাত্মক ত্রুটি: স্বতন্ত্র অ্যাক্সেস করতে পারে না :: যখন কোনও শ্রেণির সুযোগ সক্রিয় থাকে না" তবে আপনার সাথে "$this স্পোকেন " ট্রিগার করতে পারে "মারাত্মক ত্রুটি: অবজেক্টের প্রসঙ্গে না থাকলে in এটি ব্যবহার করা" :$closure = function() { $this->method(); };
হ্যাক্রে

75

মারাত্মক ত্রুটি: অপরিজ্ঞাত ফাংশন XXX এ কল করুন

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

উদাহরণ 1 - শর্তসাপেক্ষ কার্যকারিতা ঘোষণা

$someCondition = false;
if ($someCondition === true) {
    function fn() {
        return 1;
    }
}
echo fn(); // triggers error

এক্ষেত্রে fn()কখনই ঘোষণা করা হবে না কারণ $someConditionএটি সত্য নয়।

উদাহরণ 2 - কার্য ঘোষণায় ফাংশন

function createFn() 
{
    function fn() {
        return 1;
    }
}
echo fn(); // triggers error

এক্ষেত্রে fnকেবল একবার createFn()ডেকে এলে ঘোষণা করা হবে । নোট করুন যে পরবর্তী কলগুলি createFn()একটি বিদ্যমান ফাংশনটির পুনঃনির্মাণ সম্পর্কে একটি ত্রুটি ট্রিগার করবে।

আপনি এটি পিএইচপি অন্তর্নির্মিত ফাংশনের জন্যও দেখতে পাবেন। অফিসিয়াল ম্যানুয়ালটিতে ফাংশনটি অনুসন্ধান করার চেষ্টা করুন এবং এটি কোন "এক্সটেনশন" (পিএইচপি মডিউল) এর সাথে সম্পর্কিত এবং পিএইচপি-র কোন সংস্করণ সমর্থন করে তা পরীক্ষা করুন।

অনুপস্থিত এক্সটেনশনের ক্ষেত্রে, সেই এক্সটেনশনটি ইনস্টল করুন এবং এটি php.ini এ সক্ষম করুন। থেকে পিএইচপি ইনস্টলেশন সংক্রান্ত নির্দেশাবলী এক্সটেনশান আপনার ফাংশন প্রদর্শিত জন্য ম্যানুয়াল পড়ুন। এছাড়াও আপনি সক্ষম বা আপনার প্যাকেজ ম্যানেজার ব্যবহার করে এক্সটেনশনটি ইনস্টল করার (যেমন সক্ষম হতে পারে aptডেবিয়ান বা উবুন্টু এ, yumRed Hat অথবা সেন্টওএস মধ্যে), অথবা নিয়ন্ত্রণ প্যানেল একটি শেয়ার্ড হোস্টিং পরিবেশে।

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

নিখোঁজ থাকার ক্ষেত্রে, ফাংশনটি কল করার আগে ফাংশন ডিক্লেয়ারিং ফাইলটি অন্তর্ভুক্ত করার বিষয়টি নিশ্চিত করুন।

টাইপোর ক্ষেত্রে টাইপো ঠিক করুন fix

সম্পর্কিত প্রশ্নাবলী:


73

পার্স ত্রুটি: সিনট্যাক্স ত্রুটি, অপ্রত্যাশিত T_XXX

ঘটে যখন আপনি অপ্রত্যাশিত জায়গায়, ভারসাম্যহীন (অতিরিক্ত অতিরিক্ত) প্রথম বন্ধনী, php.ini এ এটি সক্রিয় না করে সংক্ষিপ্ত ট্যাগ ব্যবহার এবং আরও অনেক কিছুতে T_XXXটোকেন করার পরে ঘটে।

সম্পর্কিত প্রশ্নাবলী:

আরও সহায়তার জন্য দেখুন:

  • http://phpcodechecker.com/ - যা আপনার সিনট্যাক্সের সমস্যাগুলির জন্য আরও কিছু সহায়ক ব্যাখ্যা সরবরাহ করে।

70

মারাত্মক ত্রুটি: লেখার প্রসঙ্গে ফাংশন রিটার্ন মান ব্যবহার করতে পারে না

এটি সরাসরি ঘটে যখন সরাসরি কোনও ফাংশন ব্যবহার করে empty

উদাহরণ:

if (empty(is_null(null))) {
  echo 'empty';
}

এটি কারণ emptyএকটি ভাষা নির্মাণ এবং কোনও ফাংশন নয়, এটি 5.5 এর আগে পিএইচপি সংস্করণগুলিতে তার যুক্তি হিসাবে অভিব্যক্তি দিয়ে বলা যাবে না। পিএইচপি 5.5 এর আগে, যুক্তিটি empty()অবশ্যই একটি পরিবর্তনশীল হতে হবে তবে পিএইচপি 5.5+ এ একটি স্বেচ্ছাসেবী অভিব্যক্তি (যেমন কোনও ফাংশনের রিটার্ন মান) অনুমোদিত value

emptyএর নাম থাকা সত্ত্বেও, কোনও ভেরিয়েবল "খালি" কিনা তা আসলে যাচাই করে না। পরিবর্তে, এটি পরীক্ষা করে যে কোনও ভেরিয়েবলের অস্তিত্ব নেই, বা == false। এক্সপ্রেশন ( is_null(null)উদাহরণস্বরূপ) সর্বদা বিদ্যমান বলে মনে করা হবে, সুতরাং এখানে emptyএটি কেবল মিথ্যা সমান কিনা তা পরীক্ষা করা হচ্ছে। আপনি empty()এখানে প্রতিস্থাপন করতে পারেন !, উদাহরণস্বরূপ if (!is_null(null)), বা স্পষ্টভাবে মিথ্যা, উদাহরণস্বরূপ সঙ্গে তুলনা if (is_null(null) == false)

সম্পর্কিত প্রশ্নাবলী:


64

মাইএসকিউএল: আপনার এসকিউএল সিনট্যাক্সে আপনার একটি ত্রুটি রয়েছে; কাছাকাছি ... লাইনে ব্যবহার করার জন্য ডান সিনট্যাক্সের জন্য আপনার মাইএসকিউএল সার্ভার সংস্করণের সাথে সম্পর্কিত ম্যানুয়ালটি পরীক্ষা করুন ...

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

কী করবেন না তার একটি উদাহরণ ("খারাপ ধারণা"):

$query = "UPDATE `posts` SET my_text='{$_POST['text']}' WHERE id={$_GET['id']}";
mysqli_query($db, $query);

এই কোডটি কোনও পৃষ্ঠাতে জমা দেওয়ার জন্য একটি ফর্মের সাথে http://example.com/edit.php?id=10 এর মতো URL সহ অন্তর্ভুক্ত করা যেতে পারে (পোস্টটি এন ° 10 সম্পাদনা করতে)

যদি জমা দেওয়া পাঠ্যটিতে একক উক্তি থাকে তবে কী হবে? $queryএর সাথে শেষ হবে:

$query = "UPDATE `posts` SET my_text='I'm a PHP newbie' WHERE id=10';

এবং যখন এই কোয়েরিটি মাইএসকিউএল এ প্রেরণ করা হবে তখন এটি অভিযোগ করবে যে সিনট্যাক্সটি ভুল, কারণ মাঝখানে একটি অতিরিক্ত একক উদ্ধৃতি রয়েছে।

এই ধরনের ত্রুটিগুলি এড়ানোর জন্য, আপনাকে অবশ্যই কোনও ক্যোয়ারিতে ব্যবহারের আগে ডেটা সর্বদা এড়ানো উচিত।

এসকিউএল ক্যোয়ারিতে ব্যবহারের আগে ডেটা থেকে বেরিয়ে আসাও খুব গুরুত্বপূর্ণ কারণ আপনি যদি তা না করেন তবে আপনার স্ক্রিপ্ট এসকিউএল ইঞ্জেকশনগুলির জন্য উন্মুক্ত হবে। কোনও এসকিউএল ইঞ্জেকশনের ফলে রেকর্ড, কোনও টেবিল বা একটি সম্পূর্ণ ডাটাবেস পরিবর্তন, ক্ষতি বা পরিবর্তন হতে পারে। এটি একটি অত্যন্ত গুরুতর সুরক্ষা সমস্যা!

ডকুমেন্টেশন:



2
@gladoscc "সম্পাদনা" ক্লিক করুন এবং উত্তরটি সংশোধন করুন। আমি সচেতন এটি উন্নত করা যেতে পারে।
জোসলিন

2
অথবা একটি প্রস্তুত স্কয়ার কোয়েরি ব্যবহার করুন।
মতেজ

53

মারাত্মক ত্রুটি: XXX বাইটের অনুমোদিত মেমরির আকার শেষ হয়ে গেছে (XXX বাইট বরাদ্দ দেওয়ার চেষ্টা করা হয়েছে)

আপনার স্ক্রিপ্টটি চালানোর জন্য পর্যাপ্ত মেমরি নেই। পিএইচপি স্মৃতি সীমাতে পৌঁছেছে এবং এটি সম্পাদন বন্ধ করে দেয়। এই ত্রুটিটি মারাত্মক, স্ক্রিপ্টটি বন্ধ হয়ে যায়। মেমরি সীমাটির মান php.iniফাইল বা ini_set('memory_limit', '128 M');স্ক্রিপ্টে ব্যবহার করে কনফিগার করা যেতে পারে (যা এতে বর্ণিত মানকে ওভাররাইট করবে php.ini)। মেমরি সীমাটির উদ্দেশ্য হ'ল কোনও একক পিএইচপি স্ক্রিপ্ট উপলব্ধ সমস্ত উপলব্ধ মেমরিটিকে গাবলম্ব করা এবং পুরো ওয়েব সার্ভারকে নীচে নামানো থেকে বিরত রাখা।

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

আপনার স্ক্রিপ্টটি যখন মেমরি-নিবিড় কাজটি না করছিল তখন যদি এই ত্রুটিটি ঘটে থাকে তবে মেমরি ফাঁস আছে কিনা তা দেখতে আপনার কোড পরীক্ষা করা দরকার। memory_get_usageফাংশন আপনার বন্ধু।

সম্পর্কিত প্রশ্নাবলী:


53

বিশ্লেষণ ত্রুটি: বাক্য গঠন ত্রুটি, অপ্রত্যাশিত T_ENCAPSED_AND_WHITESPACE

এই ত্রুটিটি প্রায়শই একটি সহ একটি বিন্যাস মান উল্লেখ করার চেষ্টা সম্মুখীন হয় উদ্ধৃত কী ডাবল উদ্ধৃত পংক্তি ভিতরে ক্ষেপক যখন সমগ্র জটিল পরিবর্তনশীল কনস্ট্রাক্ট মধ্যে লেখা হয় না {}

ত্রুটি কেস:

এর ফলস্বরূপ Unexpected T_ENCAPSED_AND_WHITESPACE:

echo "This is a double-quoted string with a quoted array key in $array['key']";
//---------------------------------------------------------------------^^^^^

সম্ভাব্য সংশোধনসমূহ:

ডাবল-কোটেড স্ট্রিংয়ে, পিএইচপি অনার্নিত অ্যারে কী স্ট্রিংগুলি ব্যবহার করার অনুমতি দেবে এবং একটি জারি করবে না E_NOTICE। সুতরাং উপরের হিসাবে লেখা যেতে পারে:

echo "This is a double-quoted string with an un-quoted array key in $array[key]";
//------------------------------------------------------------------------^^^^^

সম্পূর্ণ জটিল অ্যারে ভেরিয়েবল এবং কী (গুলি) সংযুক্ত করা যেতে পারে {}, সেই ক্ষেত্রে এগুলি এড়াতে তাদের উদ্ধৃতি দেওয়া উচিতE_NOTICEপিএইচপি ডকুমেন্টেশন জটিল ভেরিয়েবলের জন্য এই সিনট্যাক্সের প্রস্তাব দেয়।

echo "This is a double-quoted string with a quoted array key in {$array['key']}";
//--------------------------------------------------------------^^^^^^^^^^^^^^^
// Or a complex array property of an object:
echo "This is a a double-quoted string with a complex {$object->property->array['key']}";

অবশ্যই, বিকল্প কোনো উপরোক্ত এটা প্রক্ষেপক করার পরিবর্তে অ্যারে পরিবর্তনশীল কনক্যাটেনেট করা:

echo "This is a double-quoted string with an array variable". $array['key'] . " concatenated inside.";
//----------------------------------------------------------^^^^^^^^^^^^^^^^^^^^^

অবগতির জন্য, উপর অধ্যায় দেখুন চলক পার্সিং মধ্যে পিএইচপি স্ট্রিংস ম্যানুয়েল পৃষ্ঠা


45

সতর্কতা: [ফাংশন] : প্রবাহ খুলতে ব্যর্থ: [কারণ]

এটা যখন আপনি একটি ফাইল সাধারণত দ্বারা কল include, requireঅথবা fopenএবং পিএইচপি ফাইল খুঁজে অথবা ফাইল লোড করতে যথেষ্ট নয় অনুমতি থাকতে পারে।

এটি বিভিন্ন কারণে ঘটতে পারে:

  • ফাইলের পথটি ভুল
  • ফাইল পাথ আপেক্ষিক
  • অন্তর্ভুক্ত পথ ভুল
  • অনুমতিগুলি খুব সীমাবদ্ধ
  • সেলিনাক্স কার্যকর রয়েছে
  • এবং আরো অনেক ...

একটি সাধারণ ভুল হ'ল পরম পথ ব্যবহার না করা। এটি পুরো পথ বা যাদুর ধ্রুবকগুলির মতো __DIR__বা সহজে ব্যবহার করে সহজেই সমাধান করা যেতে পারে dirname(__FILE__):

include __DIR__ . '/inc/globals.inc.php';

বা:

require dirname(__FILE__) . '/inc/globals.inc.php';

সঠিক পথটি ব্যবহার করা নিশ্চিত করা এই সমস্যাগুলির সমাধানের এক ধাপ, এটি পিএইচপি নিজেই অ্যাক্সেস রোধকারী ফাইলসাইমির অধিকার বা খোলার ভিত্তিক বিধিনিষেধের সাথেও সম্পর্কিত হতে পারে।

এই সমস্যাটি দ্রুত সমাধানের সর্বোত্তম উপায় হ'ল নীচে সমস্যা সমাধানের চেকলিস্টটি অনুসরণ করা।

সম্পর্কিত প্রশ্নাবলী:

সম্পর্কিত ত্রুটি:


44

বিশ্লেষণ ত্রুটি: বাক্য গঠন ত্রুটি, অপ্রত্যাশিত T_PAAMAYIM_NEKUDOTAYIM

স্কোপ রেজুলেশন অপারেটরকে হিব্রু פעמיים from থেকে "পামায়িম নেকুডোটায়িম" নামেও ডাকা হয় נקודתיים যার অর্থ "ডাবল কোলন"।

আপনি যদি অজান্তেই ::আপনার কোডটি রেখে দেন তবে এই ত্রুটিটি সাধারণত ঘটে ।

সম্পর্কিত প্রশ্নাবলী:

ডকুমেন্টেশন:


এই ত্রুটিটি ট্রিগার করার সবচেয়ে সহজ উপায়টি চলছে a()::b;বা $a=::;
ইসমাইল মিগুয়েল

43

বিজ্ঞপ্তি: অপরিজ্ঞাত স্থির XXX এর ব্যবহার - ধরে নেওয়া 'XXX'

বা, পিএইচপি 7.2 বা তারপরে:

সতর্কতা: অপরিজ্ঞাত স্থির XXX এর ব্যবহার - ধরে নেওয়া 'XXX' (এটি পিএইচপি-র ভবিষ্যতের সংস্করণে ত্রুটি ছুঁড়ে দেবে)

এই বিজ্ঞপ্তিটি ঘটে যখন কোডটিতে একটি টোকেন ব্যবহার করা হয় এবং একটি ধ্রুবক হিসাবে উপস্থিত হয়, তবে সেই নামের দ্বারা ধ্রুবক সংজ্ঞায়িত হয় না।

এই বিজ্ঞপ্তির সর্বাধিক সাধারণ কারণগুলির মধ্যে একটি হ'ল একটি এসোসিয়েটিভ অ্যারে কী হিসাবে ব্যবহৃত স্ট্রিংটির উদ্ধৃতি দিতে ব্যর্থতা।

উদাহরণ স্বরূপ:

// Wrong
echo $array[key];

// Right
echo $array['key'];

আর একটি সাধারণ কারণ হ'ল $একটি ভেরিয়েবল নামের সামনে সাইন ইন (ডলার):

// Wrong
echo varName;

// Right
echo $varName;

অথবা সম্ভবত আপনি অন্য কিছু ধ্রুবক বা কীওয়ার্ড ভুল বানান লিখেছেন:

// Wrong
$foo = fasle;

// Right
$foo = false;

এটি আপনি যখন সেই লাইব্রেরি দ্বারা সংজ্ঞায়িত স্থির অ্যাক্সেস করার চেষ্টা করেন তখন প্রয়োজনীয় পিএইচপি এক্সটেনশন বা লাইব্রেরি অনুপস্থিত থাকার লক্ষণও এটি হতে পারে।

সম্পর্কিত প্রশ্নাবলী:


2
আমি বলব যে সর্বাধিক সাধারণ কারণটি ভুলে যাওয়া a ভেরিয়েবলের সামনে, অ্যারে নয়।
22

42

মারাত্মক ত্রুটি: শ্রেণি [শ্রেণির নাম] পুনরায় ঘোষণা করতে পারে না

মারাত্মক ত্রুটি: [ফাংশন নাম] পুনরায় ঘোষণা করতে পারে না

এর অর্থ হল আপনি পারেন দুবার একই তৈরি function / class নাম ব্যবহার করছি এবং তাদের মধ্যে একজন নামান্তর করতে প্রয়োজন, অথবা এটি কারণ আপনি ব্যবহার করেছেন requireবা includeযেখানে আপনি ব্যবহার করা উচিত require_onceবা include_once

যখন কোনও ক্লাস বা কোনও ক্রিয়াকলাপ পিএইচপি-তে ঘোষণা করা হয়, তা স্থায়ী এবং পরে এটি একটি নতুন মান দিয়ে ঘোষণা করা যায় না।

নিম্নলিখিত কোড বিবেচনা করুন:

class.php

<?php

class MyClass
{
    public function doSomething()
    {
        // do stuff here
    }
}

index.php

<?php

function do_stuff()
{
   require 'class.php';
   $obj = new MyClass;
   $obj->doSomething();
}

do_stuff();
do_stuff();

দ্বিতীয় কলটি do_stuff()উপরে ত্রুটি তৈরি করবে will এতে পরিবর্তন requireকরে require_onceআমরা নিশ্চিত হতে পারি যে সংজ্ঞায়িত ফাইলটি MyClassকেবল একবার লোড হবে এবং ত্রুটি এড়ানো হবে।


3
অটোলয়েডিং এবং PSR-4 বা এমনকি এখন অবহেলিত পিএসআর -0 এর মতো মানদণ্ডগুলি ব্যবহার করে কী কী উল্লেখযোগ্য তা ব্যবহার করা প্রয়োজন / নিজেকে অন্তর্ভুক্ত করা থেকে বিরত রেখে এ থেকে মুক্তি পান (কয়েকটি উদ্ভট প্রান্তের কেস বার করুন)।
ড্যানিয়েলম

39

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

যখন আপনি এমন কোনও ভেরিয়েবল ব্যবহার করার চেষ্টা করেন যা পূর্বে সংজ্ঞায়িত ছিল না।

একটি সাধারণ উদাহরণ হবে

foreach ($items as $item) {
    // do something with item
    $counter++;
}

আপনি যদি $counterআগে সংজ্ঞা না দিয়ে থাকেন তবে উপরের কোডটি নোটিশকে ট্রিগার করবে।

সঠিক উপায়টি হ'ল ভেরিয়েবলটি ব্যবহারের আগে সেট করা, এমনকি এটি যদি খালি স্ট্রিংয়ের মতো হয়

$counter = 0;
foreach ($items as $item) {
    // do something with item
    $counter++;
}

নোটিশ: অনির্ধারিত সম্পত্তি

এই ত্রুটিটির অর্থ একই জিনিস, তবে কোনও সামগ্রীর সম্পত্তি বোঝায়। উপরের উদাহরণটি পুনরায় ব্যবহার করে, এই কোডটি ত্রুটিটিকে ট্রিগার করবে কারণ counterসম্পত্তি সেট করা হয়নি।

$obj = new stdclass;
$obj->property = 2342;
foreach ($items as $item) {
    // do something with item
    $obj->counter++;
}

সম্পর্কিত প্রশ্নাবলী:


35

পার্স ত্রুটি: সিনট্যাক্স ত্রুটি, অপ্রত্যাশিত T_VARIABLE

সম্ভাব্য দৃশ্য

আমার কোডটি কোথায় ভুল হয়েছে তা আমি খুঁজে পাচ্ছি না। আমার সম্পূর্ণ ত্রুটি এখানে:

পার্স ত্রুটি: সিনট্যাক্স ত্রুটি, এক্স লাইনে অপ্রত্যাশিত T_VARIABLE

আমি যা চেষ্টা করছি

$sql = 'SELECT * FROM dealer WHERE id="'$id.'"';

উত্তর

পার্স ত্রুটি: আপনার প্রোগ্রামের সিনট্যাক্সের সমস্যা, যেমন একটি বিবৃতি শেষ হওয়ার পরে একটি অর্ধিকোলন ছেড়ে দেওয়া বা উপরের কেসটির মতো .অপারেটর নিখোঁজ । দোভাষী যখন আপনার কোনও পার্স ত্রুটির মুখোমুখি হয় তখন আপনার প্রোগ্রামটি চালানো বন্ধ করে দেয়।

সাধারণ কথায় এটি একটি বাক্য গঠন ত্রুটি, এর অর্থ হ'ল আপনার কোডে এমন কিছু রয়েছে যা সঠিকভাবে বিশ্লেষণ করা এবং তাই চলতে শুরু করে।

আপনার যা করা উচিত তা হ'ল সতর্কতা যাচাই করে চারপাশের লাইনে যেখানে কোনও সাধারণ ভুলের জন্য ত্রুটি রয়েছে।

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

ভাল পড়া: পার্সার টোকেনের তালিকা

সুতরাং E_PARSEআপনার কমপক্ষে আপনার সক্ষম করার বিষয়টি নিশ্চিত করুন php.ini। উত্পাদন স্ক্রিপ্টগুলিতে পার্স ত্রুটি থাকা উচিত নয়।

কোড করার সময় আমি সর্বদা নিম্নলিখিত বিবৃতিটি যুক্ত করার পরামর্শ দিয়েছিলাম:

error_reporting(E_ALL);

পিএইচপি ত্রুটি প্রতিবেদন

এছাড়াও, একটি আইডিই ব্যবহার করা ভাল ধারণা যা আপনাকে টাইপ করার সময় পার্স ত্রুটিগুলি জানায়। তুমি ব্যবহার করতে পার:

  1. নেটবিয়ানস (সৌন্দর্যের একটি দুর্দান্ত অংশ, বিনামূল্যে সফটওয়্যার) (আমার মতে সেরা)
  2. পিএইচপিস্টোরম (চাচা গর্ডন এটি পছন্দ করেন: পি, অর্থ প্রদানের পরিকল্পনায় মালিকানাধীন এবং ফ্রি সফটওয়্যার রয়েছে)
  3. গ্রহন (সৌন্দর্য এবং জন্তু, বিনামূল্যে সফ্টওয়্যার)

সম্পর্কিত প্রশ্নাবলী:


34

বিজ্ঞপ্তি: একীকরণের স্ট্রিং অফসেট: *

নামটি ইঙ্গিত দিচ্ছে, এ জাতীয় ত্রুটি ঘটে যখন আপনি সম্ভবত পুনঃব্যবস্থার চেষ্টা করছেন বা অ-বিদ্যমান কী সহ কোনও অ্যারের থেকে কোনও মান খুঁজে পেতে পারেন।

আপনাকে বিবেচনা করুন, থেকে প্রতিটি চিঠি দেখানোর চেষ্টা করছেন $string

$string = 'ABCD'; 
for ($i=0, $len = strlen($string); $i <= $len; $i++){
    echo "$string[$i] \n"; 
}

উপরের উদাহরণটি উত্পন্ন করবে ( অনলাইন ডেমো ):

A
B
C
D
Notice: Uninitialized string offset: 4 in XXX on line X

এবং, স্ক্রিপ্টটি প্রতিধ্বনিত হওয়ার সাথে সাথেই Dআপনি ত্রুটিটি পেয়ে যাবেন, কারণ for()লুপের ভিতরে , আপনি পিএইচপি-কে আপনাকে প্রথম থেকে পঞ্চম স্ট্রিং চরিত্রটি দেখাতে বলেছিলেন 'ABCD'যা উপস্থিত রয়েছে, তবে যেহেতু লুপটি গণনা শুরু করে 0এবং প্রতিধ্বনিত হয় Dএটি পৌঁছানোর সময় 4, এটি একটি অফসেট ত্রুটি নিক্ষেপ করবে।

অনুরূপ ত্রুটি:


32

বিজ্ঞপ্তি: অ-অবজেক্ট ত্রুটির সম্পত্তি পাওয়ার চেষ্টা করা হচ্ছে

ঘটে যখন আপনি কোনও বস্তুর কোনও সম্পত্তি অ্যাক্সেস করার চেষ্টা করবেন যখন কোনও অবজেক্ট নেই।

অ-অবজেক্ট নোটিশের জন্য একটি আদর্শ উদাহরণ হবে

$users = json_decode('[{"name": "hakre"}]');
echo $users->name; # Notice: Trying to get property of non-object

এই ক্ষেত্রে, $usersএকটি অ্যারে (সুতরাং কোনও বস্তু নয়) এবং এটির কোনও বৈশিষ্ট্য নেই।

এটি কোনও অ-বিদ্যমান সূচি বা অ্যারের কী অ্যাক্সেস করার অনুরূপ ( বিজ্ঞপ্তি দেখুন: অপরিবর্তিত সূচক )।

এই উদাহরণটি অনেক সরল। প্রায়শই এই জাতীয় নোটিশটি একটি চেক না হওয়া রিটার্ন মানের সংকেত দেয়, যেমন NULLকোনও জিনিস উপস্থিত না থাকলে লাইব্রেরি ফিরে আসে বা কেবল একটি অপ্রত্যাশিত অবজেক্টের মান (যেমন একটি এক্সপথ ফলাফলে, অপ্রত্যাশিত বিন্যাসের সাথে জেএসএন কাঠামো, অপ্রত্যাশিত বিন্যাসের সাথে এক্সএমএল ইত্যাদি) when কিন্তু কোড এই জাতীয় শর্তের জন্য পরীক্ষা করে না।

যেহেতু এই অ-অবজেক্টগুলি প্রায়শই আরও প্রক্রিয়াজাত করা হয়, প্রায়শই একটি অ-অবজেক্টে কোনও অবজেক্ট পদ্ধতিতে কল করার পরে মারাত্মক ত্রুটি ঘটে (দেখুন: মারাত্মক ত্রুটি: কোনও সদস্য ফাংশনে কল করুন ... একটি অ-অবজেক্টে ) লিপি.

এটি ত্রুটি শর্ত এবং / অথবা একটি পরিবর্তনশীল একটি প্রত্যাশা মেলে যাচাই করে সহজেই প্রতিরোধ করা যেতে পারে। এখানে একটি ডোমএক্সপথ উদাহরণ সহ একটি বিজ্ঞপ্তি :

$result  = $xpath->query("//*[@id='detail-sections']/div[1]");
$divText = $result->item(0)->nodeValue; # Notice: Trying to get property of non-object

সমস্যাটি nodeValueপ্রথম আইটেমের সম্পত্তি (ক্ষেত্র) অ্যাক্সেস করছে যখন এটি $resultসংগ্রহে নেই কিনা তা পরীক্ষা করা হয়নি । পরিবর্তে এটি কোড চালিত বস্তুর জন্য ভেরিয়েবল বরাদ্দ করে কোডটিকে আরও স্পষ্ট করে তোলে:

$result  = $xpath->query("//*[@id='detail-sections']/div[1]");
$div     = $result->item(0);
$divText = "-/-";
if (is_object($div)) {
    $divText = $div->nodeValue;
}
echo $divText;

সম্পর্কিত ত্রুটি:


1
json_decodeএখন একটি দৃষ্টান্ত ফেরৎ stdclassডিফল্টরূপে, সুতরাং উদাহরণস্বরূপ কোড হবে আসলে কাজ।
হুগো জিংক

@ হুগোজিংক: এটি আসলে (এবং সর্বদা করত) উদাহরণ হিসাবে একটি অ্যারে ফেরত দেয়: 3v4l.org/SUDe0 - এছাড়াও আপনি কি দয়া করে আপনার লেখার জন্য এমন রেফারেন্স দিতে পারেন যে " json_decodeএখন stdclassডিফল্টরূপে একটি উদাহরণ ফেরত আসে " ? আমি চেঞ্জলগে এটি খুঁজে পাচ্ছি না।
হ্যাক্রে

Json_decode- তে পিএইচপি ম্যানুয়াল পৃষ্ঠা অনুসারে , ডিফল্টরূপে, assocপ্যারামিটারটি মিথ্যাতে সেট করা থাকে। এই প্যারামিটারটি সিদ্ধান্ত নেয় যে ফাংশনটি stdclassকোনও এসোসিয়েটিভ অ্যারের পরিবর্তে একটি ফিরে দেয় ।
হুগো জিংক

json_decode('[{"name": "hakre"}]', true)একটি অ্যারে ফিরিয়ে দেবে, অন্যথায় একটি stdclassঅবজেক্ট
জেন্ডারওয়ার

29

সতর্কতা: ওপেন_বেসেডির সীমাবদ্ধতা কার্যকর

এই সতর্কতাটি ফাইল এবং ডিরেক্টরি অ্যাক্সেস সম্পর্কিত বিভিন্ন ফাংশন সহ উপস্থিত হতে পারে। এটি একটি কনফিগারেশন সমস্যা সম্পর্কে সতর্ক করে।

এটি উপস্থিত হওয়ার পরে এর অর্থ হ'ল কিছু ফাইলে অ্যাক্সেস নিষিদ্ধ করা হয়েছে।

সতর্কতা নিজেই কিছু ভাঙে না, তবে বেশিরভাগ ক্ষেত্রে স্ক্রিপ্ট সঠিকভাবে কাজ করে না যদি ফাইল-অ্যাক্সেস প্রতিরোধ করা হয়।

ফিক্সটি সাধারণত পিএইচপি কনফিগারেশন পরিবর্তন করতে হয় , সম্পর্কিত সেটিংটি বলা হয় open_basedir

কখনও কখনও ভুল ফাইল বা ডিরেক্টরি নাম ব্যবহার করা হয়, ঠিক আছে পরে সঠিকগুলি ব্যবহার করা হয়।

সম্পর্কিত প্রশ্নাবলী:


1
এটি প্রায়শই একটি ভাগ করা হোস্টে ঘটে থাকে, লোকেরা সাধারণত নিজেকে ডিরেক্টরি থেকে লক করে না :-)
ı

28

বিশ্লেষণ ত্রুটি: বাক্যগঠন ত্রুটি, অপ্রত্যাশিত '['

এই ত্রুটিটি দুটি রূপে আসে:

তারতম্য ঘ

$arr = [1, 2, 3];

এই অ্যারে ইনিশিয়ালাইজার সিনট্যাক্সটি কেবল পিএইচপি 5.4 তে চালু হয়েছিল; এটি এর আগে সংস্করণগুলিতে পার্সার ত্রুটি বাড়িয়ে তুলবে। যদি সম্ভব হয় তবে আপনার ইনস্টলেশনটি আপগ্রেড করুন বা পুরানো বাক্য গঠনটি ব্যবহার করুন:

$arr = array(1, 2, 3);

ম্যানুয়াল থেকে এই উদাহরণটি দেখুন ।

তারতম্য 2

$suffix = explode(',', 'foo,bar')[1];

অ্যারে ডিरेফারিং ফাংশন ফলাফলগুলি পিএইচপি 5.4 তেও চালু হয়েছিল। যদি আপগ্রেড করা সম্ভব না হয় তবে আপনাকে একটি (অস্থায়ী) ভেরিয়েবল ব্যবহার করতে হবে:

$parts = explode(',', 'foo,bar');
$suffix = $parts[1];

ম্যানুয়াল থেকে এই উদাহরণটি দেখুন ।


23

সতর্কতা: [ফাংশন] প্যারামিটার 1টি রিসোর্স হিসাবে প্রত্যাশা করবে, বুলিয়ান দেওয়া হয়েছে

( সতর্কতার আরও সাধারণ প্রকরণ : mysql_fetch_array () প্যারামিটার 1 রিসোর্স হিসাবে প্রত্যাশা করে, বুলিয়ান দেওয়া হয়েছে )

সংস্থানগুলি পিএইচপি-তে এক ধরণের (যেমন স্ট্রিং, পূর্ণসংখ্যা বা অবজেক্ট)। একটি উত্স একটি স্বচ্ছ ব্লব যা এর নিজস্ব কোনও সহজাত অর্থপূর্ণ মূল্য নেই। একটি সংস্থান পিএইচপি ফাংশন বা এক্সটেনশনের নির্দিষ্ট সেট দ্বারা নির্দিষ্ট এবং সংজ্ঞায়িত। উদাহরণস্বরূপ, মাইএসকিএল এক্সটেনশন দুটি সংস্থার ধরণের সংজ্ঞা দেয় :

মাইএসকিউএল মডিউলটিতে দুটি রিসোর্স প্রকার ব্যবহৃত হয়েছে। প্রথমটি হ'ল ডেটাবেস সংযোগের জন্য লিঙ্ক সনাক্তকারী, দ্বিতীয়টি কোনও উত্স যা কোয়েরির ফলাফল ধারণ করে।

সিআরএল এক্সটেনশন আরও দুটি উত্সের ধরণের সংজ্ঞা দেয় :

... একটি সিআরএল হ্যান্ডেল এবং একটি সিআরএল মাল্টি হ্যান্ডেল।

যখন var_dumpসম্পাদনা করা হবে তখন মানগুলি এর মতো দেখায়:

$resource = curl_init();
var_dump($resource);

resource(1) of type (curl)

এগুলিই সর্বাধিক সংস্থানসমূহ হ'ল (1), একটি নির্দিষ্ট ধরণের ( (curl)) এর একটি সংখ্যক সনাক্তকারী ( )।

আপনি এই সংস্থানগুলি চারপাশে বহন করেন এবং এগুলিকে বিভিন্ন ফাংশনে প্রেরণ করেন যার জন্য এই জাতীয় সংস্থানটির অর্থ কিছু। সাধারণত এই ফাংশনগুলি ব্যাকগ্রাউন্ডে নির্দিষ্ট ডেটা বরাদ্দ করে এবং একটি সংস্থান কেবল একটি রেফারেন্স যা তারা অভ্যন্তরীণভাবে এই ডেটা ট্র্যাক রাখতে ব্যবহার করে।


" ... প্যারামিটার 1 টি রিসোর্স হিসাবে প্রত্যাশা করে, বুলিয়ান প্রদত্ত " ত্রুটিটি সাধারণত একটি চেক করা অপারেশনের ফলাফল যা কোনও উত্স তৈরি করার কথা ছিল, তবে falseপরিবর্তে ফিরে এসেছিল । উদাহরণস্বরূপ, fopenফাংশনটির এই বর্ণনা রয়েছে:

রিটার্ন মান

সাফল্যে বা FALSEত্রুটিতে একটি ফাইল পয়েন্টার রিসোর্স প্রদান করে ।

সুতরাং এই $fpকোডটিতে হয় হয় একটি resource(x) of type (stream)বা false:

$fp = fopen(...);

আপনি যদি fopenঅপারেশনটি সফল বা ব্যর্থ হয়েছে কিনা এবং তাই $fpবৈধ সংস্থান কিনা falseএবং $fpঅন্য কোনও ফাংশনে যা কোনও উত্স প্রত্যাশা করে তা পরীক্ষা না করে আপনি উপরের ত্রুটিটি পেতে পারেন:

$fp   = fopen(...);
$data = fread($fp, 1024);

Warning: fread() expects parameter 1 to be resource, boolean given

আপনার সর্বদা ফাংশনগুলির রিটার্নের মানটি ত্রুটিযুক্ত করতে হবে যা কোনও সংস্থান বরাদ্দ করার চেষ্টা করছে এবং ব্যর্থ হতে পারে :

$fp = fopen(...);

if (!$fp) {
    trigger_error('Failed to allocate resource');
    exit;
}

$data = fread($fp, 1024);

সম্পর্কিত ত্রুটি:


22

সতর্কতা: অবৈধ স্ট্রিং অফসেট 'XXX' অফসেট

বর্গাকার বন্ধনী সিনট্যাক্সের সাহায্যে আপনি যখন অ্যারে উপাদান অ্যাক্সেস করার চেষ্টা করেন এটি ঘটে তবে আপনি এটি একটি স্ট্রিংয়ে করছেন এবং অ্যারেতে নয়, তাই অপারেশনটি স্পষ্টভাবে বোঝা যায় না

উদাহরণ:

$var = "test";
echo $var["a_key"];

আপনি যদি ভেরিয়েবলটি একটি অ্যারে হওয়া উচিত বলে মনে করেন তবে এটি কোথা থেকে এসেছে এবং সমস্যাটি ঠিক করুন।


20

কোড চালায় না / আমার পিএইচপি কোডের অংশগুলির মতো দেখতে আউটপুট

আপনি যদি আপনার পিএইচপি কোড থেকে কোনও ফলাফল না দেখে থাকেন এবং / অথবা আপনি ওয়েবরেপে আপনার আক্ষরিক পিএইচপি উত্স কোড আউটপুটটির কিছু অংশ দেখতে পান তবে আপনি নিশ্চিত হতে পারেন যে আপনার পিএইচপি আসলে কার্যকর হচ্ছে না। আপনি যদি নিজের ব্রাউজারে উত্স উত্স ব্যবহার করেন তবে আপনি সম্ভবত পুরো পিএইচপি উত্স কোড ফাইলটি দেখতে পাচ্ছেন। যেহেতু পিএইচপি কোডটি <?php ?>ট্যাগগুলিতে এম্বেড থাকে তাই ব্রাউজারটি সেগুলিকে এইচটিএমএল ট্যাগ হিসাবে ব্যাখ্যা করার চেষ্টা করবে এবং ফলাফলটি কিছুটা বিভ্রান্ত দেখায়।

আপনার পিএইচপি স্ক্রিপ্টগুলি চালানোর জন্য আপনার প্রয়োজন:

  • একটি ওয়েব সার্ভার যা আপনার স্ক্রিপ্টটি কার্যকর করে
  • ফাইল এক্সটেনশন .php এ সেট করতে, অন্যথায় ওয়েব সার্ভার এটিকে * হিসাবে ব্যাখ্যা করবে না
  • ওয়েব সার্ভারের মাধ্যমে আপনার .pp ফাইল অ্যাক্সেস করতে

* আপনি যদি এটি পুনরায় কনফিগার না করেন তবে সবকিছু কনফিগার করা যায়।

এই শেষটি বিশেষভাবে গুরুত্বপূর্ণ। কেবলমাত্র ডাবল ক্লিক করে ফাইলটি সম্ভবত এটি আপনার ব্রাউজারে কোনও ঠিকানা ব্যবহার করে খুলবে:

file://C:/path/to/my/file.php

এটি আপনার চলমান কোনও ওয়েব সার্ভারকে সম্পূর্ণভাবে বাইপাস করে দিচ্ছে এবং ফাইলটি ব্যাখ্যা করা হচ্ছে না। আপনার ওয়েব সার্ভারে আপনার ফাইলটির URL টি দেখতে হবে, সম্ভবত এর কিছু:

http://localhost/my/file.php

আপনি <?পরিবর্তে সংক্ষিপ্ত ওপেন ট্যাগ ব্যবহার করছেন <?phpএবং আপনার পিএইচপি কনফিগারেশনটি স্বল্প খোলা ট্যাগ বন্ধ করেছে কিনা তাও আপনি দেখতে চাইতে পারেন may

এছাড়াও দেখুন পিএইচপি কোডটি কার্যকর করা হচ্ছে না, পরিবর্তে পৃষ্ঠায় কোড শো রয়েছে


18

সতর্কতা: mysql_connect (): ব্যবহারকারীর নাম '@' হোস্ট 'এর জন্য অ্যাক্সেস প্রত্যাখ্যান করা হয়েছে

আপনি যখন কোনও মাইএসকিউএল / মারিয়াডিবি সার্ভারের সাথে অবৈধ বা অনুপস্থিত শংসাপত্রগুলির সাথে (ব্যবহারকারীর নাম / পাসওয়ার্ড) সংযোগ করবেন তখন এই সতর্কতাটি দেখা যায়। তাই এই সাধারণত হয় না একটি কোড সমস্যা কিন্তু কোন সার্ভার কনফিগারেশন সমস্যা।

  • mysql_connect("localhost", "user", "pw")উদাহরণগুলির জন্য ম্যানুয়াল পৃষ্ঠাটি দেখুন ।

  • আপনি প্রকৃতপক্ষে একটি $usernameএবং ব্যবহার করেছেন তা পরীক্ষা করুন $password

    • এটি কোনও অস্বাভাবিক বিষয় নয় যে আপনি কোনও পাসওয়ার্ড ব্যবহার না করে অ্যাক্সেস অর্জন করেছেন - সতর্কতা: যখন বলেছিল তখন যা ঘটেছিল (using password: NO)
    • কেবলমাত্র স্থানীয় পরীক্ষার সার্ভার সাধারণত ব্যবহারকারী নাম root, কোনও পাসওয়ার্ড এবং testডাটাবেসের নামের সাথে সংযোগ করতে দেয় ।

    • কমান্ড লাইন ক্লায়েন্ট ব্যবহার করে যদি তারা সত্যই সঠিক হয় তবে আপনি পরীক্ষা করতে পারেন :
      mysql --user="username" --password="password" testdb

    • ব্যবহারকারীর নাম এবং পাসওয়ার্ড কেস সংবেদনশীল এবং সাদা স্থান উপেক্ষা করা হয় না । যদি আপনার পাসওয়ার্ডে মেটা অক্ষর থাকে তবে $সেগুলি এড়িয়ে চলুন বা পাসওয়ার্ডটি একক উদ্ধৃতিতে রেখে দিন

    • বেশিরভাগ ভাগ করা হোস্টিং সরবরাহকারীরা ইউনিক্স ব্যবহারকারীর অ্যাকাউন্টের সাথে মাইএসকিএল অ্যাকাউন্টগুলি পূর্বনির্ধারিত করে (কখনও কখনও কেবল উপসর্গ বা অতিরিক্ত সংখ্যার প্রত্যয়)। কোনও প্যাটার্ন বা ডকুমেন্টেশনের জন্য ডক্স এবং সিপ্যানেল বা পাসওয়ার্ড সেট করার জন্য যা কিছু ইন্টারফেস রয়েছে তা দেখুন।

    • কমান্ড লাইনটি ব্যবহার করে ব্যবহারকারী অ্যাকাউন্ট যুক্ত করার বিষয়ে মাইএসকিউএল ম্যানুয়াল দেখুন । অ্যাডমিন ব্যবহারকারী হিসাবে সংযুক্ত থাকাকালীন আপনি একটি কোয়েরি ইস্যু করতে পারেন:
      CREATE USER 'username'@'localhost' IDENTIFIED BY 'newpassword';

    • অথবা অ্যাকাউন্টের বিবরণ তৈরি করতে, চেক করতে বা সংশোধন করতে প্রশাসক বা ওয়ার্কবেঞ্চ বা অন্য কোনও গ্রাফিকাল সরঞ্জাম ব্যবহার করুন।

    • আপনি যদি নিজের শংসাপত্রগুলি ঠিক করতে না পারেন, তবে ইন্টারনেটকে "দয়া করে সহায়তা করুন" বলার কোনও প্রভাব থাকবে না। কেবলমাত্র আপনার এবং আপনার হোস্টিং সরবরাহকারীর কাছে জিনিসগুলি নির্ধারণ এবং ঠিক করার অনুমতি এবং পর্যাপ্ত অ্যাক্সেস রয়েছে।

  • আপনার সরবরাহকারীর দ্বারা প্রদত্ত হোস্টের নামটি ব্যবহার করে আপনি ডাটাবেস সার্ভারে পৌঁছাতে পারবেন তা যাচাই করুন :
    ping dbserver.hoster.example.net

    • এটি সরাসরি আপনার ওয়েব সার্ভারে একটি এসএসএইচ কনসোল থেকে চেক করুন। আপনার স্থানীয় বিকাশ ক্লায়েন্ট থেকে আপনার ভাগ করা হোস্টিং সার্ভারে পরীক্ষা করা খুব কমই অর্থবহ।

    • প্রায়শই আপনি কেবল সার্ভারের নাম রাখতে চান "localhost", যা উপলব্ধ হলে সাধারণত স্থানীয় নামযুক্ত সকেট ব্যবহার করে। অন্য সময় আপনি ফ্যালব্যাক "127.0.0.1"হিসাবে চেষ্টা করতে পারেন ।

    • আপনার মাইএসকিউএল / মারিয়াডিবি সার্ভারটি অন্য কোনও বন্দরে শোনা উচিত, তারপরে ব্যবহার করুন "servername:3306"

    • যদি এটি ব্যর্থ হয়, তবে সম্ভবত ফায়ারওয়াল সমস্যা আছে। (অফ-টপিক, কোনও প্রোগ্রামিং প্রশ্ন নয় No কোনও দূরবর্তী অনুমান-সহায়তা সম্ভব নয়))

  • উদাহরণস্বরূপ স্থিরDB_USER বা যেমন ব্যবহার করার সময় DB_PASSWORD, তারা প্রকৃতপক্ষে সংজ্ঞায়িত হয়েছে কিনা তা পরীক্ষা করুন ।

    • যদি আপনি একটি "Warning: Access defined for 'DB_USER'@'host'"এবং একটি পান "Notice: use of undefined constant 'DB_PASS'", তবে এটি আপনার সমস্যা।

    • যাচাই করুন যে আপনার xy/db-config.phpউদাহরণটি প্রকৃতপক্ষে অন্তর্ভুক্ত ছিল এবং whetlse।

  • সঠিকভাবে নির্ধারিত GRANTঅনুমতিগুলির জন্য পরীক্ষা করুন ।

    • এটি username+ passwordজোড়া থাকা যথেষ্ট নয় ।

    • প্রতিটি মাইএসকিউএল / মারিয়াডিবি অ্যাকাউন্টে অনুমতি সংযুক্ত সেট থাকতে পারে।

    • এগুলি সীমাবদ্ধ করতে পারে যে কোন ডেটাবেসগুলিতে আপনাকে সংযোগ করার অনুমতি দেওয়া হয়েছে, কোন ক্লায়েন্ট / সার্ভার থেকে সংযোগটি উত্পন্ন হতে পারে এবং কোন প্রশ্নের অনুমতি দেওয়া হচ্ছে।

    • "অ্যাক্সেস অস্বীকৃত" সতর্কতা এভাবে mysql_queryকলগুলির জন্যও দেখাতে পারে , যদি আপনার কাছে SELECTনির্দিষ্ট টেবিল, বা INSERT/ UPDATEএবং আরও সাধারণ DELETEকিছু থেকে অনুমতি না থাকে ।

    • অ্যাডমিন অ্যাকাউন্ট ব্যবহার করে যেমন কমান্ডের সাথে প্রতি কমান্ড লাইন ক্লায়েন্টের সাথে সংযুক্ত থাকাকালীন আপনি অ্যাকাউন্টের অনুমতিগুলি গ্রহণ করতে পারেন:
      GRANT ALL ON yourdb.* TO 'username'@'localhost';

  • যদি সতর্কতাটি প্রথমে প্রদর্শিত হয় Warning: mysql_query(): Access denied for user ''@'localhost'তবে আপনার কাছে একটি php.ini-preconfigured অ্যাকাউন্ট / পাসওয়ার্ডের জুড়ি থাকতে পারে

    • এটি পরীক্ষা করে দেখুন mysql.default_user=এবং mysql.default_password=অর্থবহ মান রয়েছে।

    • প্রায়শই এটি একটি সরবরাহকারী-কনফিগারেশন। সুতরাং অমিলের জন্য তাদের সমর্থনে যোগাযোগ করুন।

  • আপনার ভাগ করা হোস্টিং সরবরাহকারীর ডকুমেন্টেশন সন্ধান করুন:

  • মনে রাখবেন যে আপনি উপলভ্য সংযোগ পুলটিও হ্রাস করতে পারেন । আপনি অনেকগুলি সহবর্তী সংযোগের জন্য অ্যাক্সেস অস্বীকৃত সতর্কতা পেতে পারবেন। (আপনাকে সেটআপটি তদন্ত করতে হবে That's এটি একটি অফ-টপিক সার্ভার কনফিগারেশন সমস্যা, কোনও প্রোগ্রামিং প্রশ্ন নয়))

  • আপনার libmysql ক্লায়েন্ট সংস্করণটি ডাটাবেস সার্ভারের সাথে সামঞ্জস্য হতে পারে না । সাধারণত মাইএসকিউএল এবং মারিয়াডিবি সার্ভারগুলি ড্রাইভারের মধ্যে সংকলিত পিএইচপিগুলির সাথে পৌঁছানো যায়। আপনার যদি কাস্টম সেটআপ, বা একটি পুরানো পিএইচপি সংস্করণ, এবং আরও নতুন ডাটাবেস সার্ভার, বা উল্লেখযোগ্যভাবে পুরানো একটি রয়েছে - তবে সংস্করণটি মেলে না এমন সংযোগগুলি আটকাতে পারে। (না, আপনাকে নিজেরাই তদন্ত করতে হবে Nob কেউ আপনার সেটআপটি অনুমান করতে পারে না)।

আরও তথ্যসূত্র:

বিটিডব্লিউ, আপনি সম্ভবত mysql_*ফাংশন ব্যবহার করতে চান না । আগত লোকেরা প্রায়শই মাইসকিলে চলে যান , যা ততটাই ক্লান্তিকর। পরিবর্তে পিডিও এবং প্রস্তুত বিবৃতি পড়ুন
$db = new PDO("mysql:host=localhost;dbname=testdb", "username", "password");


2
মাইএসকিএল পিএইচপি-ইনআই সেটিংসের মাধ্যমে স্বয়ংক্রিয়ভাবে সংযোগ স্থাপনের অনুমতি দেয়, তারপরে একই ত্রুটি বার্তাটি বিভিন্ন কমান্ডের উপসর্গের সাথে দেওয়া হয়, উদাহরণস্বরূপ "সতর্কতা: মাইএসকিএল_কিউরি (): ব্যবহারকারীর জন্য অ্যাক্সেস প্রত্যাখ্যান করা হয়েছে '@' লোকালহোস্ট '(পাসওয়ার্ড ব্যবহার করে: না)। .. " - শুধু লক্ষ্য করছি।
হ্যাক্রে

হা, সম্পূর্ণরূপে যে সম্পর্কে ভুলে গেছি! (সম্ভবত সর্বশেষে পিএইচপি 3 বা এর সাথে এটি ব্যবহার করা হয়েছে ..)
মারিও

18

বিজ্ঞপ্তি: অ্যারে থেকে স্ট্রিং রূপান্তর

আপনি যদি কোনও অ্যারেটিকে স্ট্রিং হিসাবে বিবেচনা করার চেষ্টা করেন তবে এটি কেবল ঘটে:

$arr = array('foo', 'bar');

echo $arr;  // Notice: Array to string conversion
$str = 'Something, ' . $arr;  // Notice: Array to string conversion

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

echo $arr[0];  // displays foo
$str = 'Something ' . join(', ', $arr); //displays Something, foo, bar

বা অ্যারে লুপ করুন:

foreach($arr as $key => $value) {
    echo "array $key = $value";
    // displays first: array 0 = foo
    // displays next:  array 1 = bar
}

যদি এই নোটিশটি আপনি আশা করেন না এমন কোথাও উপস্থিত হয়, এর অর্থ এমন একটি পরিবর্তনশীল যা আপনি ভেবেছিলেন একটি স্ট্রিং আসলে একটি অ্যারে। তার মানে আপনার কোডে একটি বাগ রয়েছে যা এই ভেরিয়েবলটিকে আপনি যে স্ট্রিংয়ের প্রত্যাশা করছেন তার পরিবর্তে একটি অ্যারে করে তোলে।


12

সতর্কতা: শূন্য দ্বারা বিভাগ

সতর্কতা বার্তা 'বিভাগে শূন্য' নতুন পিএইচপি বিকাশকারীদের মধ্যে সর্বাধিক জিজ্ঞাসিত প্রশ্ন। এই ত্রুটিটি কোনও ব্যতিক্রম ঘটায় না, তাই, কিছু বিকাশকারী মাঝে মাঝে মাঝে ত্রুটি দমন অপারেটরকে @ এক্সপ্রেশনের আগে যোগ করে সতর্কতা দমন করবে। উদাহরণ স্বরূপ:

$value = @(2 / 0);

তবে, কোনও সতর্কতার মতো, সতর্কতার কারণটি সন্ধান করা এবং এটি সমাধান করার পক্ষে সর্বোত্তম পন্থা হবে। সতর্কতার কারণ আপনি যেখানে 0 দ্বারা ভাগ করার চেষ্টা করছেন সেখানে 0, সমান একটি ভেরিয়েবল, বা নির্ধারিত হয়নি এমন একটি ভেরিয়েবল (কারণ NULL == 0) ফলাফলটি 'অপরিজ্ঞাত' হবে বলে সতর্কতার কারণটি আসতে চলেছে।

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

if ( $var1 == 0 ) { // check if var1 equals zero
    $var1 = 1; // var1 equaled zero so change var1 to equal one instead
    $var3 = ($var2 / $var1); // divide var1/var2 ie. 1/1
} else {
    $var3 = ($var2 / $var1); // if var1 does not equal zero, divide
}

সম্পর্কিত প্রশ্নাবলী:


যদি এটি 0 হয় তবে 1 এ সেট করা ত্রুটি বন্ধ করে দেবে তবে আপনি যে দমনটি ব্যবহার করবেন না বলে কথা বলার চেয়ে এটি কি আসলেই ভাল (যা আমি সম্মত)? আমি বেশিরভাগ সময় পরামর্শ দেব এটি সম্ভবত অন্য কোনও বার্তা বা মান ফিরে আসবে।
জেমস

এই উদাহরণস্বরূপ, যদি $var1== 0 হয় তবে আপনি কেবল সেট $var3করতে পারেন $var2। এমনকি এটি না করেও, অন্য কোনওটির প্রয়োজন নেই কারণ উভয় ক্ষেত্রেই অ্যাসাইনমেন্টটি একই রকম, অন্য কোনওটি নয় এবং বাইরে if
জেমস

8

কড়া মানদণ্ড: অ-স্থির পদ্ধতি [<ক্লাস> :: <মেমোডেট>] স্ট্যাটিকালি বলা উচিত নয়

যখন আপনি ক্লাসে অ স্থির পদ্ধতিটিকে স্থির হিসাবে কল করার চেষ্টা করেন তখনই ঘটে থাকে E_STRICTএবং আপনার error_reporting()সেটিংসে পতাকাও রয়েছে ।

উদাহরণ:

class HTML {
   public function br() {
      echo '<br>';
   }
}

HTML::br() অথবা $html::br()

উদাহরণস্বরূপ যুক্ত না করে E_STRICTআপনি এই ত্রুটিটি এড়াতে পারবেনerror_reporting()

error_reporting(E_ALL & ~E_STRICT);

যেহেতু পিএইচপি ৫.৪.০ এবং ততোধিক বিষয়গুলি [ রেফ ] এ E_STRICTঅন্তর্ভুক্ত রয়েছে । তবে এটি পরামর্শজনক নয়। সমাধানটি হ'ল আপনার উদ্দিষ্ট স্ট্যাটিক ফাংশনটিকে আসল হিসাবে সংজ্ঞায়িত করা :E_ALLstatic

public static function br() {
  echo '<br>';
}

বা ফাংশনটি প্রচলিতভাবে কল করুন:

$html = new HTML();
$html->br();

সম্পর্কিত প্রশ্নাবলী :


7

অবচয়যুক্ত: অ্যারে এবং স্ট্রিংগুলি কোঁকড়ানো ধনুর্বন্ধনী সহ অ্যাকসেস সিনট্যাক্সকে হ্রাস করা হয়েছে

স্ট্রিং অফসেট এবং অ্যারে উপাদানগুলি {}পিএইচপি 7.4.0 এর আগে কোঁকড়া ধনুর্বন্ধনী দ্বারা অ্যাক্সেস করা যেতে পারে :

$string = 'abc';
echo $string{0};  // a

$array = [1, 2, 3];
echo $array{0};  // 1

এটি পিএইচপি 7.4.0 থেকে অবহেলা করা হয়েছে এবং একটি সতর্কতা উত্পন্ন করেছে:

অবচয়যুক্ত: অ্যারে এবং স্ট্রিংগুলি কোঁকড়ানো ধনুর্বন্ধনী সহ অ্যাকসেস সিনট্যাক্সকে হ্রাস করা হয়েছে

[]স্ট্রিং অফসেট এবং অ্যারের উপাদানগুলিতে অ্যাক্সেস করতে আপনার অবশ্যই বর্গাকার বন্ধনী ব্যবহার করতে হবে :

$string = 'abc';
echo $string[0];  // a

$array = [1, 2, 3];
echo $array[0];  // 1

এই পরিবর্তন বোঝায় যা RFC পিএইচপি লিংক স্ক্রিপ্ট যা প্রচেষ্টা এই যান্ত্রিকভাবে ঠিক করতে।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.