Cảnh báo: Đã gặp phải giá trị không phải số


122

Gần đây đã cập nhật lên PHP 7.1 và bắt đầu gặp lỗi sau

Cảnh báo: Gặp phải giá trị không phải số ở dòng 29

Đây là dòng 29 trông như thế nào

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

Trên localhost tất cả đều hoạt động tốt ..

Bất kỳ ý tưởng làm thế nào để giải quyết vấn đề này hoặc nó là gì?


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

2
Có vẻ như một cảnh báo mới trong PHP 7 (như bạn đã biết). php.net/manual/en/migration71.other-changes.php Khi bạn gặp lỗi, các biến đó có giá trị không? Tôi nghĩ rằng bạn có thể tránh nó bằng cách khởi tạo chúng thành 0.
tjfo

1
@MichaelHanon câu trả lời bạn đang đề cập là đâu? lỗi cú pháp là gì?
FKEinternet

1
$ sub_total + = ((int) $ item ['số lượng'] * (int) $ product ['price']);
Tôi là người ngốc nghếch nhất.

tôi sử dụng định dạng kế thừa như thế này a = a + b; hoặc str = str. "<a href='".str2."'> asd </a>"; hoặc $ this-> storeItems = $ this-> storeItems. $ str;
saber tabatabaee yazdi

Câu trả lời:


105

Có vẻ như trong PHP 7.1, một Cảnh báo sẽ được phát ra nếu gặp phải giá trị không phải số. Xem liên kết này .

Đây là phần có liên quan đến thông báo Cảnh báo mà bạn nhận được:

Lỗi E_WARNING và E_NOTICE mới đã được đưa ra khi các chuỗi không hợp lệ bị ép buộc bằng cách sử dụng các toán tử mong đợi các số hoặc các phép gán tương đương của chúng. Một E_NOTICE được phát ra khi chuỗi bắt đầu bằng một giá trị số nhưng chứa các ký tự không phải số theo sau và một E_WARNING được phát ra khi chuỗi không chứa giá trị số.

Tôi đoán $ item ['số lượng'] hoặc $ product ['price'] không chứa giá trị số, vì vậy hãy đảm bảo rằng chúng đúng như vậy trước khi thử nhân chúng. Có thể sử dụng một số loại điều kiện trước khi tính toán $ sub_total, như sau:

<?php

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

2
Tôi gặp sự cố này vì tôi vẫn có một vài dấu cộng trong asp mà tôi đang chuyển sang PHP. Ctrl + f và tìm ký tự +.
MH

Có cách nào để tắt cảnh báo này qua php.ini không?
BeniRose

3
Cảm ơn. Tôi đang làm việc trên một dự án Symfony 1.4 kế thừa, và có vẻ như có một vài nơi điều này xảy ra một cách cố ý, đó là một nỗi đau. Đây thực sự nên là một lá cờ trong php.ini cho phép bạn tắt mức độ nghiêm ngặt này.
BeniRose

9
Hoặc bạn có thể sử dụng$sub_total += ((int)$item['quantity'] * (int)$product['price']);
Tôi là Hầu hết ngốc Person

2
Công bằng mà nói, tôi sẽ không tắt tính năng này, đây là một trong những cảnh báo hữu ích hơn thực sự có thể khiến bạn tìm thấy lỗi - trong trường hợp của chúng tôi, một lỗi đã tồn tại trong nhiều năm và không được chú ý. Như Daniel đã nói, nó chỉ xuất hiện nếu bạn thử và áp dụng phép toán vào một chuỗi không phải số. Tôi không gặp trường hợp nào mà đây sẽ là hành vi mong muốn. tức là "mặc định" * 86400 sẽ bằng 0 và nếu không có cảnh báo này, bạn sẽ không bao giờ biết trừ khi bạn tình cờ xem qua mã.
Steve Childs

230

Không chính xác vấn đề bạn gặp phải nhưng lỗi tương tự cho những người đang tìm kiếm.

Điều này đã xảy ra với tôi khi tôi dành quá nhiều thời gian cho JavaScript.

Quay lại với PHP, tôi đã nối hai chuỗi với " +" thay vì " ." và gặp lỗi đó.


24
Cái thứ chết tiệt này đã vấp ngã tôi vào năm 2019, LOL. Việc nối chuỗi của PHP cần được cấu trúc lại!
Daniel Dut

2
Và đây 2 tuần sau khi thực hiện nodejs và quay trở lại PHP, tôi lại gặp phải lỗi này lol
imin 25/02/19

3
ngay sau khi một chuỗi đang được cố gắng nối với a +, nó được giả định rằng nó là một intgiá trị ... trong khi các toán hạng đã cho không thuộc bất kỳ kiểu dữ liệu số nào.
Martin Zeitler

1
haha, điều tương tự cũng xảy ra với tôi, tôi dành quá nhiều thời gian cho JS và khi nói đến PHP, tôi cố gắng sử dụng mã JS. Nhưng trình thông dịch PHP sẽ không cho phép tôi làm điều đó.
Hemant Sankhla

1
Ôi chúa ơi. Tôi đã tìm kiếm trên Google trong gần một giờ chỉ để biết tôi đã sử dụng +thay thế .. Cảm ơn!
marvinpoo

52

Bạn có thể giải quyết vấn đề mà không cần bất kỳ logic mới nào bằng cách truyền thứ vào số, ngăn cảnh báo và tương đương với hành vi trong PHP 7.0 trở xuống:

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

(Câu trả lời từ Daniel Schroeder không tương đương vì $ sub_total sẽ vẫn chưa được đặt nếu gặp phải các giá trị không phải số. Ví dụ: nếu bạn in ra $ sub_total, bạn sẽ nhận được một chuỗi trống, có thể là sai trong hóa đơn. - bởi truyền bạn đảm bảo rằng $ sub_total là một số nguyên.)


4
đó là một thực hành xấu. Bạn cần lọc đầu vào của mình
Ciro Vargas

3
Đây có vẻ là câu trả lời tốt nhất. Và đối với tất cả những gì bạn biết những giá trị này đến từ cơ sở dữ liệu, bạn có thể không cần phải thoát.
MH

3
@Ciro Vargas: Nó phụ thuộc vào ứng dụng. Trong nhiều trường hợp, bạn muốn một số nguyên không xác định được hiểu là số không. Dù sao thì điều này cũng tương đương với hành vi PHP7.0 và không yêu cầu viết lại mã. (Câu trả lời được chấp nhận không yêu cầu viết lại.)
Roland Seuhs

@RolandSeuhs Tôi không chắc mình làm theo, khi nhân hai chuỗi, '24' * '10' sẽ tạo ra 240 trong PHP, '24' * null sẽ tạo ra 0, nhưng '24' * 'cat' sẽ tạo ra lỗi được đề cập ở trên vì 'cat' là một giá trị không phải số. Bạn có thể chuyển 'cat' thành một số nguyên, nhưng điều đó cũng sẽ không cung cấp cho bạn tổng phụ có ý nghĩa. Đối với giải pháp của tôi, nó hoạt động để xác định xem số lượng và giá cả có phải là số hay không. Nếu chúng là chuỗi '24' và '10', nó sẽ vượt qua, nhưng nếu một trong hai là chuỗi không phải số, nó sẽ không thành công. Cách xử lý sub_total không thực sự là mục tiêu của tôi, xin lỗi nếu nó xảy ra theo cách đó.
DanielSchroederDev

3
***** GIÁ nên (nổi) nên đặt điều đó!
Bhavin Rana

24

Trong trường hợp của tôi, đó là do tôi được sử dụng +như trong ngôn ngữ khác nhưng trong toán tử nối chuỗi PHP là ..


5

Điều này đã xảy ra với tôi cụ thể trên PHPMyAdmin. Vì vậy, để trả lời cụ thể hơn điều này , tôi đã làm như sau:

Trong tập tin:

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

Tôi đã thay đổi điều này:

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

Về điều này:

$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'];
}

Mong rằng cứu ai đó gặp rắc rối ...


4

Tôi đã gặp sự cố này với liên kết chuyển tiếp và quay lại phân trang của mình .... chỉ cần đặt (int) trước biến $ Page + 1 và nó đã hoạt động ...

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

Tôi đã gặp sự cố trong phpmyadmin với PHP 7.3. Cảm ơn @coderama, tôi đã thay đổi thư viện / DisplayResults.class.php dòng 855 từ

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

thành

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

Đã sửa.


3

Xin chào, Trong trường hợp của tôi sử dụng (WordPress) và PHP7.4, tôi nhận được cảnh báo về vấn đề giá trị số. Vì vậy, tôi đã thay đổi mã cũ như sau:

Từ:

$val = $oldval + $val;

Đến:

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

Bây giờ cảnh báo đã biến mất :)


2

Kiểm tra nếu bạn không tăng với một số biến mà giá trị của nó là một chuỗi rỗng như ''.

Thí dụ:

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

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

Tuyệt vời, đây là một trường hợp bị bỏ sót trong hầu hết các câu trả lời khác.
Trendfischer

1

Thử cái này.

$sub_total = 0;

và trong vòng lặp của bạn bây giờ bạn có thể sử dụng

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

Nó sẽ giải quyết vấn đề của bạn.


1

Tôi chỉ xem trang này vì tôi đã gặp vấn đề này. Đối với tôi, tôi đã tính toán số dấu phẩy động từ một mảng nhưng ngay cả sau khi chỉ định các biến là dấu chấm động, lỗi vẫn được đưa ra, đây là bản sửa lỗi đơn giản và mã ví dụ bên dưới đang gây ra sự cố.

Ví dụ về 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

}

đó là mã tôi đã lặp lại và tạo các phần tử div html mới. Mã hoạt động tốt và các phần tử đã được hình thành, nhưng tôi nhận được cảnh báo tương tự trong error_log.

Sau khi đọc các câu trả lời hữu ích khác, tôi phát hiện ra rằng tôi đang tính tổng một chuỗi và một số trong dòng sai. Vì vậy, tôi đã thay đổi mã ở dòng đó thành

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

Bây giờ mã hoạt động như trước đó nhưng không có cảnh báo lần này. Hy vọng ví dụ này sẽ hữu ích cho ai đó.


1

Giải quyết lỗi này trên WordPress

Cảnh báo: Gặp phải một giá trị không phải số trong C: \ XAMPP \ htdocs \ aad-2 \ wp-include \ SimplePie \ Parse \ Date.php trên dòng 694

Giải pháp đơn giản ở đây!

  1. định vị một tập tin của wp-includes\SimplePie\Parse\Date.php
  2. tìm một dòng không. 694
  3. bạn hiển thị mã $second = round($match[6] + $match[7] / pow(10, strlen($match[7])));
  4. và thay đổi điều này 3.) thành dòng này $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;

nó hoạt động 100% :)


1

Điều đó thường xảy ra khi bạn ghép chuỗi với dấu +. Trong PHP, bạn có thể ghép nối bằng cách sử dụng dấu chấm (.) Vì vậy, đôi khi tôi vô tình đặt dấu + giữa hai chuỗi trong PHP và nó cho tôi thấy lỗi này, vì bạn chỉ có thể sử dụng dấu + trong số.



0

Nếu gặp phải giá trị không phải số trong mã của bạn, hãy thử giá trị dưới đây. Đoạn mã dưới đây được chuyển đổi thành float.

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

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

 echo $PlannedAmount; //output = 0

0

trong PHP nếu bạn sử dụng + để nối, bạn sẽ gặp lỗi này. Trong php + là một toán tử số học . https://www.php.net/manual/en/language.operators.arithmetic.php

sử dụng sai toán tử +:

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

sử dụng . để nối

$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>";
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.