คำเตือน: พบค่าที่ไม่ใช่ตัวเลข


124

อัปเดตล่าสุดเป็น PHP 7.1 และเริ่มได้รับข้อผิดพลาดดังต่อไปนี้

คำเตือน: พบค่าที่ไม่ใช่ตัวเลขในบรรทัดที่ 29

นี่คือลักษณะของบรรทัดที่ 29

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

บน localhost ทำงานได้ดีทั้งหมด ..

มีความคิดอย่างไรในการจัดการกับสิ่งนี้หรือมันคืออะไร?


5
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
$ sub_total + = ((int) $ item ['quantity'] * (int) $ product ['price']);
ฉันเป็นคนโง่ที่สุด

ฉันใช้รูปแบบดั้งเดิมเช่นนี้ a = a + b; หรือ str = str. "<a href='".str2."'> asd </a>"; หรือ $ this-> storeItems = $ this-> storeItems $ str;
saber tabatabaee yazdi

คำตอบ:


106

ดูเหมือนว่าใน PHP 7.1 จะมีการแสดงคำเตือนหากพบค่าที่ไม่ใช่ตัวเลข ดูลิงค์นี้.

นี่คือส่วนที่เกี่ยวข้องซึ่งเกี่ยวข้องกับประกาศคำเตือนที่คุณได้รับ:

ข้อผิดพลาด E_WARNING และ E_NOTICE ใหม่ได้รับการนำมาใช้เมื่อมีการบังคับสตริงที่ไม่ถูกต้องโดยใช้ตัวดำเนินการที่คาดว่าจะเป็นตัวเลขหรือเทียบเท่าการกำหนด E_NOTICE ถูกปล่อยออกมาเมื่อสตริงเริ่มต้นด้วยค่าตัวเลข แต่มีอักขระที่ไม่ใช่ตัวเลขต่อท้ายและ E_WARNING จะถูกปล่อยออกมาเมื่อสตริงไม่มีค่าตัวเลข

ฉันเดาว่า$ item ['quantity']หรือ$ product ['price']ไม่มีค่าตัวเลขดังนั้นตรวจสอบให้แน่ใจก่อนที่จะลองคูณ อาจใช้เงื่อนไขบางประเภทก่อนคำนวณ $ sub_total ดังนี้:

<?php

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

2
ฉันมีปัญหานี้เนื่องจากฉันยังมีเครื่องหมายบวกสองสามอย่างใน asp ฉันกำลังโอนไปยัง PHP Ctrl + f แล้วมองหาอักขระ +
MH

มีวิธีปิดคำเตือนนี้ผ่าน php.ini หรือไม่?
BeniRose

3
ขอบคุณ. ฉันกำลังทำโครงการ Symfony 1.4 แบบเดิมและดูเหมือนว่าจะมีไม่กี่แห่งที่เกิดขึ้นโดยเจตนาซึ่งเป็นความเจ็บปวด นี่ควรเป็นแฟล็กใน php.ini ที่ให้คุณปิดความเข้มงวดระดับนี้ได้
BeniRose

10
หรือคุณสามารถใช้$sub_total += ((int)$item['quantity'] * (int)$product['price']);
ฉันเป็นคนโง่ที่สุด

2
เพื่อความเป็นธรรมฉันจะไม่ปิดสิ่งนี้ซึ่งเป็นหนึ่งในคำเตือนที่มีประโยชน์มากกว่าที่สามารถนำคุณไปสู่การค้นหาจุดบกพร่องในกรณีของเราคำเตือนที่เกิดขึ้นมาหลายปีแล้วและไม่ได้สังเกตเห็น ดังที่ Daniel กล่าวไว้จะปรากฏก็ต่อเมื่อคุณลองใช้คณิตศาสตร์กับสตริงที่ไม่ใช่ตัวเลข ฉันไม่เห็นกรณีที่จะเป็นพฤติกรรมที่ต้องการ เช่น "ค่าเริ่มต้น" * 86400 จะเท่ากับ 0 และหากไม่มีคำเตือนนี้คุณจะไม่มีทางรู้เว้นแต่ว่าคุณจะก้าวผ่านรหัส
Steve Childs

232

ไม่ใช่ปัญหาที่คุณพบ แต่เป็นข้อผิดพลาดเดียวกันสำหรับผู้ที่ค้นหา

สิ่งนี้เกิดขึ้นกับฉันเมื่อฉันใช้เวลากับ JavaScript มากเกินไป

กลับมาที่ PHP ฉันเชื่อมต่อสองสตริงด้วย " +" แทน " ." และได้รับข้อผิดพลาดนั้น


24
สิ่งที่น่ารังเกียจนี้ทำให้ฉันสะดุดในปี 2019 ฮ่า ๆ การต่อสายอักขระของ PHP ต้องได้รับการปรับโครงสร้างใหม่!
Daniel Dut

2
และที่นี่ 2 สัปดาห์หลังจากทำ nodejs และกลับไปที่ PHP ฉันพบข้อผิดพลาดนี้อีกครั้ง lol
imin

3
ทันทีที่มีการพยายามเชื่อมสตริงเข้ากับ a +จะถือว่าเป็นintค่า ... ในขณะที่ตัวถูกดำเนินการที่ระบุไม่ใช่ประเภทข้อมูลตัวเลขใด ๆ
Martin Zeitler

1
ฮ่า ๆ เกิดขึ้นกับฉันเหมือนกันฉันใช้เวลากับ JS มากเกินไปและเมื่อพูดถึง PHP ฉันพยายามใช้โค้ด JS แต่ล่าม PHP ไม่ยอมให้ฉันทำอย่างนั้น
Hemant Sankhla

1
โอ้พระเจ้า. ฉันได้รับ googling เกือบชั่วโมงทั้งหมดเพียงเพื่อหาผมใช้แทน+ .ขอบคุณ!
marvinpoo

53

คุณสามารถแก้ปัญหาได้โดยไม่ต้องใช้ตรรกะใหม่ ๆ เพียงแค่แคสต์สิ่งนั้นลงในตัวเลขซึ่งจะป้องกันคำเตือนและเทียบเท่ากับพฤติกรรมใน PHP 7.0 และต่ำกว่า:

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

(คำตอบจาก Daniel Schroeder ไม่เทียบเท่าเนื่องจาก $ sub_total จะยังคงไม่ได้ตั้งค่าหากพบค่าที่ไม่ใช่ตัวเลขตัวอย่างเช่นหากคุณพิมพ์ $ sub_total คุณจะได้รับสตริงว่างซึ่งอาจผิดในใบแจ้งหนี้ - โดย การคัดเลือกคุณต้องแน่ใจว่า $ sub_total เป็นจำนวนเต็ม)


4
นั่นเป็นการปฏิบัติที่ไม่ดี คุณต้องกรองอินพุตของคุณ
Ciro Vargas

4
นี่น่าจะเป็นคำตอบที่ดีที่สุด และสำหรับสิ่งที่คุณรู้ว่าค่าเหล่านี้มาจากฐานข้อมูลคุณอาจไม่จำเป็นต้องหลบหนี
MH

3
@Ciro Vargas: ขึ้นอยู่กับการใช้งาน ในหลายกรณีคุณต้องการให้จำนวนเต็มที่ไม่ได้กำหนดตีความเป็นศูนย์ อย่างไรก็ตามสิ่งนี้เทียบเท่ากับพฤติกรรม PHP7.0 และไม่จำเป็นต้องเขียนโค้ดซ้ำ (คำตอบที่ยอมรับไม่จำเป็นต้องเขียนซ้ำ)
Roland Seuhs

@RolandSeuhs ฉันไม่แน่ใจว่าฉันทำตามเมื่อคูณสองสตริง '24' * '10' จะสร้าง 240 ใน PHP '24' * null จะสร้าง 0 แต่ '24' * 'cat' จะทำให้เกิดข้อผิดพลาดที่กล่าวถึง ด้านบนเนื่องจาก "cat" เป็นค่าที่ไม่ใช่ตัวเลข คุณสามารถแคสต์ 'cat' เป็น int ได้ แต่จะไม่ให้ผลรวมย่อยที่มีความหมายเช่นกัน สำหรับวิธีแก้ปัญหาของฉันมันใช้สำหรับกำหนดว่าปริมาณและราคาเป็นตัวเลขหรือไม่ หากเป็นสตริง "24" และ "10" ก็จะผ่านไป แต่ถ้าเป็นสตริงที่ไม่ใช่ตัวเลขก็จะล้มเหลว วิธีจัดการ sub_total ไม่ใช่เป้าหมายของฉันจริงๆขออภัยถ้ามันผิดพลาด
DanielSchroederDev

3
***** ราคาควร (ลอย) ควรใส่!
Bhavin Rana

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

ฉันมีปัญหากับการแบ่งหน้าและลิงก์ย้อนกลับของฉัน .... เพียงแค่ตั้งค่า (int) หน้าตัวแปร $ Page + 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

ฉันพบปัญหาใน phpmyadmin ด้วย PHP 7.3 ขอบคุณ @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

สวัสดี, ในกรณีของฉันโดยใช้ (WordPress) และ PHP7.4 ฉันได้รับคำเตือนเกี่ยวกับปัญหาค่าตัวเลข ดังนั้นฉันจึงเปลี่ยนรหัสเก่าดังนี้:

จาก:

$val = $oldval + $val;

ถึง:

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

ตอนนี้คำเตือนหายไป :)


2

ตรวจสอบว่าคุณไม่ได้เพิ่มตัวแปรบางตัวหรือไม่ที่ค่าของมันเป็นสตริงว่างเช่น ''

ตัวอย่าง:

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

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

สุดยอดนี่เป็นกรณีที่พลาดในคำตอบอื่น ๆ ส่วนใหญ่
Trendfischer

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

}

นั่นคือรหัสที่ฉันมีซึ่งวนซ้ำและสร้างองค์ประกอบ div html ใหม่ รหัสทำงานได้ดีและองค์ประกอบถูกสร้างขึ้น แต่ฉันได้รับคำเตือนเดียวกันใน error_log

หลังจากอ่านคำตอบอื่น ๆ ที่เป็นประโยชน์แล้วฉันพบว่าฉันกำลังสรุปสตริงและตัวเลขในบรรทัดที่ผิดพลาด ผมจึงเปลี่ยนรหัสที่บรรทัดนั้นเป็น

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

ตอนนี้รหัสใช้งานได้เหมือนเดิม แต่ไม่มีคำเตือนในครั้งนี้ หวังว่าตัวอย่างนี้จะเป็นประโยชน์กับใครบางคน


1

แก้ไขข้อผิดพลาดนี้บน WordPress

คำเตือน: ค่าที่ไม่ใช่ตัวเลขที่พบใน C: \ XAMPP \ htdocs \ aad-2 \ wp-includes \ SimplePie \ Parse \ Date.php ในบรรทัด 694

วิธีง่ายๆที่นี่!

  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

มักจะเกิดขึ้นเมื่อคุณต่อสายแมวด้วยเครื่องหมาย + ใน PHP คุณสามารถทำการเชื่อมต่อกันโดยใช้เครื่องหมายจุด (.) ดังนั้นบางครั้งฉันบังเอิญใส่เครื่องหมาย + ระหว่างสองสตริงใน PHP และแสดงข้อผิดพลาดนี้เนื่องจากคุณสามารถใช้หมายเลข + ลงชื่อเข้าใช้ได้เท่านั้น



0

หากพบค่าที่ไม่ใช่ตัวเลขในโค้ดของคุณให้ลองด้านล่าง โค้ดด้านล่างถูกแปลงเป็น float

$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>";
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.