সতর্কতা: একটি অ-সংখ্যাসূচক মান


122

সম্প্রতি পিএইচপি 7.1 এ আপডেট হয়েছে এবং নিম্নলিখিত ত্রুটি পাওয়া শুরু করুন

সতর্কতা: 29-এর লাইনে একটি অ-সংখ্যাসূচক মান

29 লাইনের মতো দেখতে এখানে

$sub_total += ($item['quantity'] * $product['price']);

লোকালহোস্টে সমস্ত কাজ ঠিকঠাক ..

এটি কীভাবে মোকাবেলা করতে হয় তার কোনও ধারণা বা এটি কী?


4
var_dump($item['quantity'], $product['price'])
u_mulder

2
পিএইচপি 7-তে একটি নতুন সতর্কতা মনে হচ্ছে (যেমন আপনি সচেতন)। php.net/manual/en/migration71.other-changes.php আপনি ত্রুটি পেলে এই ভেরিয়েবলগুলির মান থাকে? আমি মনে করি আপনি এটিকে 0 এ শুরু করে এড়াতে পারবেন
tjfo

1
@ মিশেলহানন আপনি কোথায় উত্তরটি উল্লেখ করছেন? সিনট্যাক্স ত্রুটিটি কী?
এফকেইন্টারনেট

1
_ সাব_টোটাল + = ((প্রেরণ) $ আইটেম ['পরিমাণ'] * (ইনট) $ পণ্য ['দাম']);
আমি সবচেয়ে বোকা ব্যক্তি

আমি লিগ্যাসি ফর্ম্যাটটি এর মতো ব্যবহার করি a = a + b; বা str = str। "<a href='".str2."'> এ্যাস্পার্ড </a> "; বা $ this-> storeItems = $ this-> storeItems। $ Str;
সাবের তাবতাবই ইয়াজদী

উত্তর:


105

দেখে মনে হচ্ছে পিএইচপি 7.1-এ, একটি সংখ্যাসূচক মানটির সম্মুখীন হলে একটি সতর্কতা নির্গত হবে। এই লিঙ্কটি দেখুন ।

আপনি যে সতর্কতা বিজ্ঞপ্তিটি পাচ্ছেন তার সাথে সম্পর্কিত অংশটি এখানে:

অপারেটরগুলি সংখ্যা বা তাদের অ্যাসাইনমেন্ট সমতুল্য প্রত্যাশা করে অবৈধ স্ট্রিংগুলি জোর করে যখন নতুন E_WARNING এবং E_NOTICE ত্রুটিগুলি চালু করা হয়েছিল। স্ট্রিংটি যখন একটি সংখ্যাসূচক মান দিয়ে শুরু হয় তবে এতে অ-সংখ্যাসূচক অক্ষর থাকে এবং একটি স্ট্রিংয়ের সংখ্যাসূচক মান না থাকলে একটি E_NNICE নির্গত হয়।

আমি অনুমান করছি যে কোনও $ আইটেম ['পরিমাণ'] বা $ পণ্য ['মূল্য'] তে কোনও সংখ্যাসূচক মান থাকে না, তাই তাদের গুণিত করার চেষ্টা করার আগে তারা তা করে তা নিশ্চিত করুন। Like সাব_টোটোটাল গণনা করার আগে কিছুটা শর্তসাপেক্ষ ব্যবহার করুন, যেমন:

<?php

if (is_numeric($item['quantity']) && is_numeric($product['price'])) {
  $sub_total += ($item['quantity'] * $product['price']);
} else {
  // do some error handling...
}

2
আমার এই সমস্যাটি ছিল কারণ আমি এখনও পিএইচপি-তে স্থানান্তরিত হলাম এএসপিতে আমার কয়েকটি প্লাস লক্ষণ ছিল। Ctrl + f এবং + অক্ষর সন্ধান করুন।
এমএইচ

এই সতর্কতাটি php.ini এর মাধ্যমে বন্ধ করার কোনও উপায় আছে কি?
বেনিরোজ

3
ধন্যবাদ। আমি একটি উত্তরাধিকারী সিমফনি ১.৪ প্রকল্পে কাজ করছি, এবং মনে হচ্ছে ইচ্ছাকৃতভাবে এমন কয়েকটি জায়গা ঘটেছে যা ব্যথা হয়েছে। এটি সত্যই php.ini তে একটি পতাকা হওয়া উচিত যা আপনাকে এই স্তরের কঠোরতা বন্ধ করতে দেয়।
বেনিরোজ

9
বিকল্পভাবে আপনি ব্যবহার করতে পারেন$sub_total += ((int)$item['quantity'] * (int)$product['price']);
আমি

2
সত্যি কথা বলতে গেলে, আমি এটিকে বন্ধ করব না, এটির অন্যতম কার্যকর সতর্কতা যা আপনাকে একটি বাগ খুঁজে পেতে পরিচালিত করতে পারে - আমাদের ক্ষেত্রে, এমন একটি যা বছরের পর বছর ধরে ছিল এবং লক্ষ্য করা যায় নি। ড্যানিয়েল যেমন বলেছিলেন, এটি কেবল তখনই প্রদর্শিত হয় যখন আপনি অংকিত একটি স্ট্রিংতে গণিত প্রয়োগ করে প্রয়োগ করেন। আমি এমন কোনও মামলা দেখতে ব্যর্থ হই যেখানে এটি পছন্দসই আচরণ হবে। যেমন "ডিফল্ট" * 86400 0 এর সমান হবে এবং এই সতর্কতা ব্যতীত আপনি কোডের মাধ্যমে পদক্ষেপ না নিলে আপনি কখনই জানতে পারবেন না।
স্টিভ চাইল্ডস

230

আপনার কাছে ঠিক সমস্যাটিই ছিল না তবে লোকেদের অনুসন্ধান করা একই ত্রুটি।

আমি যখন জাভাস্ক্রিপ্টে খুব বেশি সময় ব্যয় করি তখন এটি আমার সাথে ঘটেছিল।

পিএইচপি ফিরে এসে আমি " +" এর পরিবর্তে " " এর সাথে দুটি স্ট্রিং সংহত করেছিলাম .এবং ত্রুটি পেয়েছি।


24
এই জঘন্য জিনিসটি ২০১২ সালে আমাকে বিভ্রান্ত করেছে, LOL। পিএইচপি এর স্ট্রিং কনটেনটেশন পুনর্গঠন করা প্রয়োজন!
ড্যানিয়েল ডট

2
এবং এখানে 2 সপ্তাহ পরে নোডেজ করার পরে এবং পিএইচপি ফিরে আসার পরে আমি আবার এই ত্রুটির মুখোমুখি
হলাম

3
যত তাড়াতাড়ি একটি স্ট্রিং একটি দিয়ে সংক্ষিপ্ত করার চেষ্টা করা হচ্ছে +, এটি ধরে নেওয়া হচ্ছে এটি একটি intমান ... যদিও প্রদত্ত অপারেশনগুলি কোনও সংখ্যক ডেটা-টাইপের নয়।
মার্টিন জিটলার

1
হাহাহা, আমার সাথেও একই ঘটনা ঘটেছে, আমি জেএসে খুব বেশি সময় ব্যয় করি এবং যখন পিএইচপি করার বিষয়টি আসে তখন আমি জেএস কোডটি ব্যবহার করার চেষ্টা করি। কিন্তু পিএইচপি ইন্টারপ্রেটার আমাকে এটি করতে দেয় না।
হেমন্ত শঙ্খলা

1
হে ভগবান. আমি প্রায় পুরো ঘন্টা ধরে গুগল করছি কেবল +তার পরিবর্তে আমি ব্যবহার করেছি তা খুঁজে বের করতে .। ধন্যবাদ!
মার্ভিনপু

52

আপনি কোনও নতুন যুক্তি ছাড়াই সমস্যাটি সমাধান করতে পারেন কেবল জিনিসটিকে সংখ্যায় ফেলে which

$sub_total += ((int)$item['quantity'] * (int)$product['price']);

(ড্যানিয়েল শ্রোয়েডারের উত্তর সমতুল্য নয় কারণ $ সাব_টোটালটি যদি অ-সংখ্যাসূচক মানগুলির মুখোমুখি হয় তবে সেটটি সেট করা থাকে না example উদাহরণস্বরূপ, আপনি যদি _ সাব_োটোটাল মুদ্রণ করেন তবে আপনি একটি খালি স্ট্রিং পাবেন যা সম্ভবত একটি চালানে ভুল। ing সাব_টোটেলটি একটি পূর্ণসংখ্যা make


4
এটা একটা খারাপ অভ্যাস আপনাকে আপনার ইনপুটগুলি ফিল্টার করতে হবে
সিরো ভারগাস

3
এটি সেরা উত্তর বলে মনে হচ্ছে। এবং আপনি জানেন যে এই মানগুলি ডাটাবেস থেকে আসছে, আপনার পালানোর দরকার নেই।
এমএইচ

3
@ সিরো ভার্গাস: এটি প্রয়োগের উপর নির্ভর করে। অনেক ক্ষেত্রে আপনি চান একটি অনির্ধারিত পূর্ণসংখ্যা শূন্য হিসাবে ব্যাখ্যা করা। যাইহোক এটি PHP7.0 আচরণের সমতুল্য এবং কোডটির পুনর্লিখনের প্রয়োজন হয় না। (গৃহীত উত্তরের জন্য পুনরায় লেখার দরকার পড়ে।)
রোল্যান্ড সেউহস

@ রোল্যান্ডসিউহস আমি নিশ্চিত নই যে আমি অনুসরণ করছি, যখন দুটি স্ট্রিংয়ের গুণমান করা হবে, '24' * '10' পিএইচপি-তে 240 উত্পাদন করবে, '24' * নাল 0 উত্পাদন করবে, তবে '24' * 'বিড়াল' উল্লিখিত ত্রুটি নিক্ষেপ করবে উপরের কারণ 'বিড়াল' একটি অ-সাংখ্যিক মান। আপনি কোনও বিড়ালকে 'বিড়াল' কাস্ট করতে পারেন, তবে এটি আপনাকে অর্থবহ উপমোটাল দেয় না won't আমার সমাধান হিসাবে, এটি পরিমাণ এবং মূল্য সংখ্যাসঙ্গিক কিনা তা নির্ধারণের জন্য কাজ করে। যদি তারা '24' এবং '10' স্ট্রিং হয় তবে এটি পাস হয়ে যায়, তবে উভয়টি যদি একটি অ-সংখ্যাযুক্ত স্ট্রিং হয় তবে এটি ব্যর্থ হয়। সাব-টোটাল কীভাবে মোকাবেলা করা আসলে আমার লক্ষ্য ছিল না, দুঃখিত যদি এটি সেভাবে চলে আসে।
ড্যানিয়েলস্ক্রয়েডারদেভ

3
***** দামটি (ভাসা) হওয়া উচিত!
ভাভিন রানা

24

আমার ক্ষেত্রে এটি +অন্য ভাষার মতো আমার ব্যবহৃত হয়েছিল বলেই হয়েছিল কিন্তু পিএইচপি স্ট্রিংগুলিতে কনটেনটেশন অপারেটর .


5

এটি আমার সাথে বিশেষত পিএইচপিএমআইএডমিনে ঘটছিল। তাই আরো নির্দিষ্টভাবে উত্তর দিতে এই , আমি নিম্নলিখিত যা করেছে:

ফাইলটিতে:

C:\ampps\phpMyAdmin\libraries\DisplayResults.class.php

আমি এটি পরিবর্তন করেছি:

// Move to the next page or to the last one
$endpos = $_SESSION['tmpval']['pos']
    + $_SESSION['tmpval']['max_rows'];

এটি:

$endpos = 0;
if (!empty($_SESSION['tmpval']['pos']) && is_numeric($_SESSION['tmpval']['pos'])) {
    $endpos += $_SESSION['tmpval']['pos'];
}
if (!empty($_SESSION['tmpval']['max_rows']) && is_numeric($_SESSION['tmpval']['max_rows'])) {
    $endpos += $_SESSION['tmpval']['max_rows'];
}

আশা করি সেভের কারও কিছু ঝামেলা ...


4

আমার এই পৃষ্ঠাটি আমার পেজিনেশনটি এগিয়ে এবং পিছনের লিঙ্কটি সহ ছিল .... ভেরিয়েবল $ পৃষ্ঠা + 1 এর সামনে কেবল সেট (ইনট) সেট করুন এবং এটি কার্যকর ...

<?php 
$Page = (isset($_GET['Page']) ? $_GET['Page'] : '');
if ((int)$Page+1<=$PostPagination) {
?>
<li> <a href="Index.php?Page=<?php echo $Page+1; ?>"> &raquo;</a></li>
<?php }
?>

3

আমি পিএইচপি 7.3 সহ phpmyadmin এ সমস্যার মুখোমুখি হয়েছি। ধন্যবাদ @ কোডারাম, আমি লাইব্রেরি / ডিসপ্লেরেসাল্টস.ক্লাস.এফপি লাইন 855 থেকে পরিবর্তন করেছি

// Move to the next page or to the last one
$endpos = $_SESSION['tmpval']['pos']
    + $_SESSION['tmpval']['max_rows'];

মধ্যে

// Move to the next page or to the last one
$endpos = (int)$_SESSION['tmpval']['pos']
    + (int)$_SESSION['tmpval']['max_rows'];

সংশোধন করা হয়েছে।


3

হ্যালো, আমার ক্ষেত্রে (ওয়ার্ডপ্রেস) এবং PHP7.4 ব্যবহার করে আমি সংখ্যার মান ইস্যু সম্পর্কে একটি সতর্কতা পেয়েছি। সুতরাং আমি নিম্নলিখিত হিসাবে পুরানো কোড পরিবর্তন করেছি:

থেকে:

$val = $oldval + $val;

প্রতি:

$val = ((int)$oldval + (int)$val);

এখন সতর্কতা অদৃশ্য হয়ে গেছে :)


2

আপনি যদি কিছু ভেরিয়েবলের সাথে বর্ধন না করে থাকেন তবে পরীক্ষা করুন যে এর মানটি '' এর মতো একটি ফাঁকা স্ট্রিং।

উদাহরণ:

$total = '';
$integers = range(1, 5);

foreach($integers as $integer) {
    $total += $integer;
}

সুপার, এটি অন্যান্য উত্তরগুলির বেশিরভাগ ক্ষেত্রে মিস হয়েছে।
ট্রেন্ডফিশার

1

এটা চেষ্টা কর.

$sub_total = 0;

এবং আপনার লুপের মধ্যে এখন আপনি এটি ব্যবহার করতে পারেন

$sub_total += ($item['quantity'] * $product['price']);

এটি আপনার সমস্যার সমাধান করা উচিত।


1

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

উদাহরণ পিএইচপি

<?php
$subtotal = 0; //Warning fixed
$shippingtotal = 0; //Warning fixed

$price = array($row3['price']);
$shipping = array($row3['shipping']);
$values1 = array_sum($price);
$values2 = array_sum($shipping);
(float)$subtotal += $values1; // float is irrelevant $subtotal creates warning
(float)$shippingtotal += $values2; // float is irrelevant $shippingtotal creates warning
?>

1
$sn = 0;//increment the serial number, then add the sn to job
for($x = 0; $x<20; $x++)
{
$sn++;
$added_date = "10/10/10";
$job_title = "new job";
$salary = $sn*1000;
$cd = "27/10/2017";//the closing date
$ins = "some institution";//the institution for the vacancy 
$notes = "some notes here";//any notes about the jobs

$sn_div = "<div class='sn_div'>".$sn."</div>";
$ad_div = "<div class='ad_div'>".$added_date."</div>";
$job_div = "<div class='job_div'>".$job_title."</div>";
$salary_div = "<div class='salary_div'>".$salary."</div>";
$cd_div = "<div class='cd_div'>".$cd."</div>";//cd means closing date
$ins_div = "<div class='ins_div'>".$ins."</div>";//ins means institution
$notes_div = "<div class='notes_div'>".$notes."</div>";


/*erroneous line*/$job_no = "job"+$sn;//to create the job rows
$$job_no = "<div class='job_wrapper'>".$sn_div.$ad_div.$job_div.$salary_div.$cd_div.$ins_div.$notes_div."</div>";

echo $$job_no;//and then echo each job

}

এটাই আমার কাছে কোড যা লুপ করেছে এবং নতুন এইচটিএমএল ডিভ উপাদান তৈরি করেছে। কোডটি দুর্দান্তভাবে কাজ করেছে এবং উপাদানগুলি তৈরি হয়েছিল, তবে আমি ত্রুটি_ব্লগে একই সতর্কতা পেয়েছি।

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

/*erroneous line*/$job_no = "job"&&$sn;//this is the new variable that will create the job rows

কোডটি আগের মতো কাজ করে তবে এবার কোনও সতর্কতা ছাড়াই। আশা করি এই উদাহরণটি কারও কাজে লাগবে।


1

ওয়ার্ডপ্রেসে এই ত্রুটিটি সমাধান করুন

সতর্কতা: সি: u এক্সএএমপিপি \ এইচটিডোকস \ অ্যাড -২ \ ডাব্লুপি-তে অন্তর্ভুক্ত রয়েছে একটি অ-সংখ্যাীয় মান

এখানে সহজ সমাধান!

  1. একটি ফাইল সনাক্ত wp-includes\SimplePie\Parse\Date.php
  2. একটি লাইন খুঁজে। 694
  3. আপনি কোডটি দেখান $second = round($match[6] + $match[7] / pow(10, strlen($match[7])));
  4. এবং এটি 3 পরিবর্তন করুন) এই লাইনে $second = round((int)$match[6] + (int)$match[7] / pow(10, strlen($match[7])));

1
$sub_total_price = 0; 

foreach($booking_list as $key=>$value) {
        $sub_total_price += ($price * $quantity); 
}

echo $sub_total_price;

এটি 100% কাজ করছে :)


1

এটি সাধারণত ঘটে যখন আপনি + চিহ্ন দিয়ে স্ট্রিং করেন। পিএইচপি-তে আপনি বিন্দু চিহ্ন (।) ব্যবহার করে সংক্ষিপ্তকরণ তৈরি করতে পারেন তাই কখনও কখনও আমি ঘটনাক্রমে পিএইচপিতে দুটি স্ট্রিংয়ের মধ্যে + চিহ্ন রাখি এবং এটি আমাকে এই ত্রুটিটি দেখায়, যেহেতু আপনি কেবল + সাইন ইন সংখ্যা ব্যবহার করতে পারেন।



0

যদি আপনার কোডটিতে অ-সংখ্যাসূচক মানটির মুখোমুখি হয় তবে নীচে চেষ্টা করুন। নীচের কোডটি ফ্লোটে রূপান্তরিত হয়।

$PlannedAmount = ''; // empty string ''

if(!is_numeric($PlannedAmount)) {
           $PlannedAmount = floatval($PlannedAmount);
 }

 echo $PlannedAmount; //output = 0

0

পিএইচপি-তে যদি আপনি কনট্যাক্টেশন জন্য + ব্যবহার করেন তবে আপনি এই ত্রুটিটি শেষ করবেন। পিএইচপি + এ একটি গাণিতিক অপারেটর। https://www.php.net/manual/en/language.operators.arithmetic.php

অপারেটরের ভুল ব্যবহার:

            "<label for='content'>Content:</label>"+
            "<textarea class='form-control col-xs-12' rows='7'cols='100' id='content' name='content'>"+$initcontent+"</textarea>'"+                 
            "</div>";

ব্যবহার সংমিশ্রনের জন্য

$output = "<div class='from-group'>".
            "<label for='content'>Content:</label>".
            "<textarea class='form-control col-xs-12' rows='7'cols='100' id='content' name='content'>".$initcontent."</textarea>'".                 
            "</div>";
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.