चेतावनी: एक गैर-संख्यात्मक मूल्य का सामना करना पड़ा


122

हाल ही में PHP 7.1 के लिए अद्यतन किया गया है और निम्नलिखित त्रुटि हो रही है

चेतावनी: लाइन पर 29 में एक गैर-संख्यात्मक मूल्य का सामना करना पड़ा

यहाँ लाइन 29 क्या दिखती है

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

लोकलहोस्ट पर सब ठीक काम करता है ।।

किसी भी विचार इस से निपटने के लिए या यह क्या है?


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

2
PHP 7 में एक नई चेतावनी की तरह दिखता है (जैसा कि आप जानते हैं)। php.net/manual/en/migration71.other-changes.php जब आपको त्रुटि मिलती है तो उन चर का मान है? मुझे लगता है कि आप को 0 पर उन्हें आरंभ से यह बच सकते हैं
tjfo

1
@MichaelHanon जवाब आप का उल्लेख कर रहे हैं, जहां है? वाक्यविन्यास त्रुटि क्या है?
FKEinternet

1
$ सब_टोटल + = ((इंट) $ आइटम ['मात्रा'] * (इंट) $ उत्पाद ['मूल्य']);
मैं

मैं इस तरह की विरासत प्रारूप का उपयोग = ए + बी; या str = str। "<a href='".str2."'> asd </a>"; या $ यह-> storeItems = $ this-> storeItems। $ str;
कृपाण तबातबाई यज़ीदी

जवाबों:


105

ऐसा लगता है कि PHP 7.1 में, एक गैर-संख्यात्मक मान होने पर चेतावनी को उत्सर्जित किया जाएगा। इस लिंक को देखें ।

यहां प्रासंगिक हिस्सा है जो आपको मिल रहे चेतावनी नोटिस से संबंधित है:

नई E_WARNING और E_NOTICE त्रुटियां तब पेश की गई हैं जब अवैध स्ट्रिंग्स को संख्याओं या उनके असाइनमेंट समकक्षों की अपेक्षा करने वाले ऑपरेटरों का उपयोग करते हुए किया जाता है। एक E_NOTICE तब उत्सर्जित होती है जब स्ट्रिंग एक संख्यात्मक मान से शुरू होती है, लेकिन इसमें गैर-संख्यात्मक वर्ण अनुगामी होते हैं, और E_WARNING तब उत्सर्जित होती है जब स्ट्रिंग में एक संख्यात्मक मान नहीं होता है।

मैं अनुमान लगा रहा हूं कि $ आइटम ['मात्रा'] या $ उत्पाद ['मूल्य'] में संख्यात्मक मूल्य नहीं है, इसलिए सुनिश्चित करें कि वे उन्हें गुणा करने की कोशिश करने से पहले करते हैं। शायद $ sub_total की गणना करने से पहले किसी प्रकार के सशर्त का उपयोग करें, जैसे:

<?php

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

2
मेरे पास यह मुद्दा था, क्योंकि मैं अभी भी एस्प में कुछ प्लस संकेत था जिसे मैं PHP में स्थानांतरित कर रहा था। Ctrl + f और वर्णों के लिए देखें।
MH

क्या php.ini के माध्यम से इस चेतावनी को बंद करने का कोई तरीका है?
बेनीरोज

3
धन्यवाद। मैं एक विरासत सिम्फनी 1.4 परियोजना पर काम कर रहा हूं, और ऐसा लगता है कि कुछ जगहों पर ऐसा जानबूझकर होता है, जो एक दर्द रहा है। यह वास्तव में php.ini में एक ध्वज होना चाहिए जो आपको इस स्तर की सख्ती को बंद करने की अनुमति देता है।
बेनीरोज

9
वैकल्पिक रूप से आप का उपयोग कर सकते हैं$sub_total += ((int)$item['quantity'] * (int)$product['price']);
मैं

2
निष्पक्ष होने के लिए, मैं इसे बंद नहीं करूंगा, इसकी एक और उपयोगी चेतावनी है जो वास्तव में आपको बग ढूंढने के लिए प्रेरित कर सकती है - हमारे मामले में, एक जो वर्षों से जगह पर था और ध्यान नहीं दिया गया था। जैसा कि डैनियल ने कहा, यह केवल तभी दिखाई देता है जब आप गणित को एक गैर संख्यात्मक स्ट्रिंग पर लागू करने और लागू करने की कोशिश करते हैं। मैं एक ऐसे मामले को देखने में विफल हूं जहां यह वांछित व्यवहार होगा। यानी "डिफ़ॉल्ट" * 86400 0 के बराबर होगा और इस चेतावनी के बिना, आपको कभी भी पता नहीं चलेगा कि आप कोड के माध्यम से कदम नहीं उठाते हैं।
स्टीव चिल्ड्स

230

आपके द्वारा खोजे गए लोगों के लिए ठीक वैसा ही मुद्दा नहीं है, बल्कि वही त्रुटि है।

मेरे साथ यह तब हुआ जब मैंने जावास्क्रिप्ट पर बहुत अधिक समय बिताया।

PHP में वापस आकर मैंने " +" के बजाय " " के साथ दो तारों को एकत्र किया .और उस त्रुटि को प्राप्त किया।


24
इस लानत भरी बात ने मुझे 2019, LOL में फँसा दिया। PHP के स्ट्रिंग संघनन का पुनर्गठन करने की आवश्यकता है!
डेनियल

2
और यहाँ 2 सप्ताह बाद नोडज करने और PHP में वापस आने के बाद मुझे फिर से इस त्रुटि का सामना करना पड़ा
18

3
जैसे ही एक स्ट्रिंग को एक के साथ समेटने का प्रयास किया जा रहा है +, यह माना जा रहा है कि यह एक intमूल्य है ... जबकि दिए गए ऑपरेंड किसी भी संख्यात्मक डेटा-प्रकार के नहीं हैं।
मार्टिन ज़ेटलर

1
हाहा, मेरे साथ भी ऐसा ही हुआ, मैं JS पर बहुत समय बिताता हूं और जब PHP की बात आती है तो मैं JS कोड का उपयोग करने की कोशिश करता हूं। लेकिन PHP दुभाषिया मुझे ऐसा नहीं करने देगा।
हेमंत सांखला

1
हे भगवान। मैं लगभग पूरे एक घंटे के लिए गुगली कर रहा हूं ताकि यह पता लगाया जा सके कि मैंने +इसके बजाय उपयोग किया है .। धन्यवाद!
मार्विनपु जू

52

आप किसी भी नए तर्क के बिना समस्या को हल कर सकते हैं, केवल उस चीज़ को संख्या में डालकर, जो चेतावनी को रोकती है और PHP 7.0 और उससे नीचे के व्यवहार के बराबर है:

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

(डैनियल श्रोएडर का उत्तर समकक्ष नहीं है क्योंकि गैर-संख्यात्मक मानों का सामना करने पर $ sub_total परेशान नहीं होगा। उदाहरण के लिए, यदि आप $ sub_total का प्रिंट आउट लेते हैं, तो आपको एक रिक्त स्ट्रिंग मिलेगी, जो कि शायद एक इनवॉइस में गलत है। - by आप यह सुनिश्चित करते हैं कि $ सब_टोटल पूर्णांक है।


4
यह एक बुरा अभ्यास है। आपको अपने इनपुट फ़िल्टर करने की आवश्यकता है
सिरो वर्गास

3
यह सबसे अच्छा जवाब लगता है। और आप सभी जानते हैं कि ये मान डेटाबेस से आ रहे हैं, आपको भागने की आवश्यकता नहीं हो सकती है।
MH

3
@Ciro Vargas: यह आवेदन पर निर्भर करता है। कई मामलों में आप चाहते हैं कि एक अपरिभाषित पूर्णांक को शून्य के रूप में व्याख्या किया जाए। वैसे भी यह PHP7.0 व्यवहार के बराबर है और इसे कोड को फिर से लिखने की आवश्यकता नहीं है। (स्वीकृत उत्तर के लिए फिर से लिखना पड़ता है।)
रोलैंड सेह्स

@ रोलैंड्स यह सुनिश्चित नहीं है कि मैं अनुसरण करता हूं, जब दो तारों को गुणा करते हुए, '24' * '10' PHP में 240 का उत्पादन करेगा, '24' * शून्य से 0 का उत्पादन होगा, लेकिन '24' * 'कैट' उल्लिखित त्रुटि को फेंक देगा। ऊपर क्योंकि 'बिल्ली' एक गैर-संख्यात्मक मूल्य है। आप 'कैट' को एक इंट में डाल सकते हैं, लेकिन यह आपको एक सार्थक उप-योग नहीं देगा। मेरे समाधान के लिए, यह निर्धारित करने के लिए काम करता है कि क्या मात्रा और मूल्य संख्यात्मक हैं। यदि वे '24' और '10' तार हैं, तो यह गुजरता है, लेकिन यदि कोई गैर-संख्यात्मक स्ट्रिंग है, तो यह विफल हो जाता है। कैसे सब_टोटल के साथ निपटा जाता है वास्तव में मेरा उद्देश्य नहीं था, माफ करना अगर वह इस तरह से आया।
डैनियलश्रोएडरडेव

3
***** मूल्य होना चाहिए (फ्लोट) कि डाल दिया जाना चाहिए!
भाविन राणा

25

मेरे मामले में यह मेरी वजह से +दूसरी भाषा के रूप में इस्तेमाल किया गया था, लेकिन PHP में तार संघनन ऑपरेटर है .


5

यह मेरे लिए विशेष रूप से PHPMyAdmin पर हो रहा था। तो इसका विशेष रूप से उत्तर देने के लिए , मैंने निम्न कार्य किया:

फाइल में:

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 चर के सामने सेट (int) और यह ...

<?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

मुझे PHP 7.3 के साथ phpmyadmin में समस्या का सामना करना पड़ा। धन्यवाद @coderama, मैंने पुस्तकालयों / DisplayResults.class.php लाइन को 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

<?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

}

यह वह कोड है जो मैंने लूप किया था और नए html div एलिमेंट्स बनाए थे। कोड ठीक काम किया और तत्वों का गठन किया गया था, लेकिन मुझे error_log में एक ही चेतावनी मिली।

उपयोगी अन्य उत्तरों को पढ़ने के बाद, मुझे लगा कि मैं एक स्ट्रिंग और एक संख्या को गलत रेखा में समेट रहा हूं। इसलिए मैंने उस लाइन के कोड को बदल दिया

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

अब कोड पहले की तरह काम करता है लेकिन इस बार कोई चेतावनी नहीं है। आशा है कि यह उदाहरण किसी के लिए उपयोगी होगा।


1

वर्डप्रेस पर इस त्रुटि को हल करें

चेतावनी: C: \ XAMPP \ htdocs \ aad-2 \ wp- में शामिल एक गैर-संख्यात्मक मान 69- लाइन पर \ SimplePie \ Parse \ Date.php शामिल है

यहाँ सरल समाधान!

  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

ऐसा आमतौर पर तब होता है जब आप कैट-कैट स्ट्रिंग्स + साइन के साथ करते हैं। PHP में आप डॉट साइन (।) का उपयोग करके कॉन्सेप्ट बना सकते हैं इसलिए कभी-कभी मैं गलती से PHP में दो स्ट्रिंग्स के बीच + साइन लगा देता हूं, और यह मुझे यह त्रुटि दिखाती है, क्योंकि आप केवल संख्याओं में + साइन का उपयोग कर सकते हैं।



0

यदि आपके कोड में अंकित गैर-संख्यात्मक मान एक से नीचे की कोशिश करें। नीचे का कोड फ्लोट में बदल जाता है।

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

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

 echo $PlannedAmount; //output = 0

0

PHP में अगर आप + का उपयोग करते हैं, तो आप इस त्रुटि के साथ समाप्त हो जाएंगे। Php + में एक अंकगणितीय ऑपरेटर है। 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>";
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.