Peringatan: Ditemukan nilai non-numerik

123

Baru saja diperbarui ke PHP 7.1 dan mulai mendapatkan kesalahan berikut

Peringatan: Nilai non-numerik ditemukan di baris 29

Seperti inilah tampilan baris 29

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

Di localhost semuanya berfungsi dengan baik ..

Ada ide bagaimana mengatasi ini atau apa itu?

Imran Rafique
sumber
4
var_dump($item['quantity'], $product['price'])
u_mulder
2
Sepertinya peringatan baru di PHP 7 (seperti yang Anda ketahui). php.net/manual/en/migration71.other-changes.php Ketika Anda mendapatkan kesalahan apakah variabel tersebut memiliki nilai? Saya pikir Anda dapat menghindarinya dengan menginisialisasi mereka ke 0.
tjfo
1
@MichaelHanon di mana jawaban yang Anda maksud? apa kesalahan sintaksnya?
FKEinternet
1
$ sub_total + = ((int) $ item ['quantity'] * (int) $ product ['price']);
Saya Orang Paling Bodoh
saya menggunakan format lama seperti ini a = a + b; atau str = str. "<a href='".str2."'> asd </a>"; atau $ this-> storeItems = $ this-> storeItems. $ str;
saber tabatabaee yazdi

Jawaban:

106

Tampaknya di PHP 7.1, Peringatan akan dikeluarkan jika nilai non-numerik ditemukan. Lihat tautan ini .

Berikut adalah bagian relevan yang berkaitan dengan pemberitahuan Peringatan yang Anda dapatkan:

Kesalahan E_WARNING dan E_NOTICE baru telah diperkenalkan ketika string yang tidak valid dipaksakan menggunakan operator yang mengharapkan angka atau penugasannya yang setara. E_NOTICE dipancarkan ketika string dimulai dengan nilai numerik tetapi berisi karakter non-numerik di belakangnya, dan E_WARNING dipancarkan ketika string tidak berisi nilai numerik.

Saya menebak $ item ['quantity'] atau $ product ['price'] tidak mengandung nilai numerik, jadi pastikan bahwa nilai tersebut mencantumkannya sebelum mencoba mengalikannya. Mungkin menggunakan semacam kondisional sebelum menghitung $ sub_total, seperti:

<?php

if (is_numeric($item['quantity']) && is_numeric($product['price'])) {
  $sub_total += ($item['quantity'] * $product['price']);
} else {
  // do some error handling...
}
DanielSchroederDev
sumber
2
Saya mengalami masalah ini karena saya masih memiliki beberapa tanda plus di asp yang saya transfer ke PHP. Ctrl + f dan cari + karakter.
MH
Apakah ada cara untuk mematikan peringatan ini melalui php.ini?
BeniRose
3
Terima kasih. Saya sedang mengerjakan proyek Symfony 1.4 yang lama, dan tampaknya ada beberapa tempat ini terjadi secara sengaja, yang menyebalkan. Ini benar-benar harus menjadi bendera di php.ini yang memungkinkan Anda untuk menonaktifkan tingkat keketatan ini.
BeniRose
9
Atau Anda dapat menggunakan$sub_total += ((int)$item['quantity'] * (int)$product['price']);
Saya Orang Paling Bodoh
2
Agar adil, saya tidak akan mematikan ini, ini salah satu peringatan yang lebih berguna yang benar-benar dapat mengarahkan Anda untuk menemukan bug - dalam kasus kami, yang telah ada selama bertahun-tahun dan tidak diperhatikan. Seperti yang dikatakan Daniel, ini hanya muncul jika Anda mencoba dan menerapkan matematika ke string non numerik. Saya gagal melihat kasus di mana ini akan menjadi perilaku yang diinginkan. yaitu "default" * 86400 akan sama dengan 0 dan tanpa peringatan ini, Anda tidak akan pernah tahu kecuali Anda melangkah melalui kode.
Steve Childs
230

Bukan masalah yang Anda alami tetapi kesalahan yang sama untuk orang yang menelusuri.

Ini terjadi pada saya ketika saya menghabiskan terlalu banyak waktu di JavaScript.

Kembali ke PHP saya menggabungkan dua string dengan " +" bukan " ." dan mendapatkan kesalahan itu.

Yassir Ennazk
sumber
24
Hal sialan ini membuatku tersandung pada tahun 2019, LOL. Rangkaian string PHP perlu direstrukturisasi!
Daniel Dut
2
Dan di sini 2 minggu setelah melakukan nodejs dan kembali ke PHP saya menghadapi kesalahan ini lagi lol
imin
3
segera setelah string dicoba untuk digabungkan dengan a +, diasumsikan bahwa itu adalah intnilai ... sedangkan operan yang diberikan bukan tipe data numerik.
Martin Zeitler
1
haha, hal yang sama terjadi pada saya, saya menghabiskan terlalu banyak waktu di JS dan ketika datang ke PHP saya mencoba menggunakan kode JS. Tetapi penerjemah PHP tidak mengizinkan saya melakukan itu.
Hemant Sankhla
1
Ya Tuhan. Aku sudah googling selama hampir satu jam hanya untuk mencari tahu saya menggunakan +bukannya .. Terima kasih!
marvinpoo
53

Anda dapat menyelesaikan masalah tanpa logika baru hanya dengan memasukkan sesuatu ke dalam nomor, yang mencegah peringatan dan sama dengan perilaku di PHP 7.0 dan yang lebih lama:

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

(Jawaban dari Daniel Schroeder tidak setara karena $ sub_total akan tetap tidak disetel jika nilai non-numerik ditemukan. Misalnya, jika Anda mencetak $ sub_total, Anda akan mendapatkan string kosong, yang mungkin salah dalam faktur. - oleh casting Anda memastikan bahwa $ sub_total adalah bilangan bulat.)

Roland Seuhs
sumber
4
itu praktik yang buruk. Anda perlu menyaring masukan Anda
Ciro Vargas
4
Ini sepertinya jawaban terbaik. Dan untuk semua yang Anda tahu nilai-nilai ini berasal dari database, Anda mungkin tidak perlu keluar.
MH
3
@Ciro Vargas: Tergantung aplikasinya. Dalam banyak kasus, Anda ingin integer yang tidak ditentukan ditafsirkan sebagai nol. Bagaimanapun ini adalah perilaku yang setara dengan PHP7.0 dan tidak memerlukan penulisan ulang kode. (Jawaban yang diterima memang membutuhkan penulisan ulang.)
Roland Seuhs
@RolandSeuhs Saya tidak yakin saya ikuti, ketika mengalikan dua string, '24' * '10' akan menghasilkan 240 dalam PHP, '24' * null akan menghasilkan 0, tetapi '24' * 'cat' akan memunculkan kesalahan yang disebutkan di atas karena 'cat' adalah nilai non-numerik. Anda dapat mengubah 'cat' menjadi int, tetapi itu juga tidak akan memberi Anda subtotal yang berarti. Adapun solusi saya, ini berfungsi untuk menentukan apakah kuantitas dan harga adalah numerik. Jika mereka adalah string '24' dan '10', itu lolos, tetapi jika salah satunya adalah string non-numerik, gagal. Bagaimana sub_total ditangani sebenarnya bukan tujuan saya, maaf jika terjadi seperti itu.
DanielSchroederDev
3
***** HARGA harus (float) harusnya gitu!
Bhavin Rana
25

Dalam kasus saya itu karena saya digunakan +seperti dalam bahasa lain tetapi dalam operator penggabungan string PHP ..

CodeToLife
sumber
5

Ini terjadi pada saya secara khusus di PHPMyAdmin. Jadi untuk menjawab ini secara lebih spesifik , saya melakukan hal berikut:

Dalam File:

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

Saya mengubah ini:

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

Untuk ini:

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

Berharap bahwa menyelamatkan seseorang dari masalah ...

coderama
sumber
4

Saya mengalami masalah ini dengan paginasi tautan maju dan mundur .... cukup setel (int) di depan variabel $ Page + 1 dan berhasil ...

<?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 }
?>
Ajmal Aamir
sumber
3

Saya mengalami masalah di phpmyadmin dengan PHP 7.3. Terima kasih @coderama, saya mengubah libraries / DisplayResults.class.php baris 855 dari

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

ke

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

Tetap.

Henry
sumber
3

Halo, Dalam kasus saya menggunakan (WordPress) dan PHP7.4, saya mendapat peringatan tentang masalah nilai numerik. Jadi saya mengubah kode lama sebagai berikut:

Dari:

$val = $oldval + $val;

Untuk:

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

Sekarang peringatan itu hilang :)

Jodyshop
sumber
2

Periksa apakah Anda tidak menambahkan beberapa variabel yang nilainya adalah string kosong seperti ''.

Contoh:

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

foreach($integers as $integer) {
    $total += $integer;
}
Luiz Gustavo Martins
sumber
Super, ini adalah kasus yang terlewat di sebagian besar jawaban lain.
Trendfischer
1

Coba ini.

$sub_total = 0;

dan di dalam lingkaran Anda sekarang Anda dapat menggunakan ini

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

Ini harus menyelesaikan masalah Anda.

Wadday
sumber
1

Saya baru saja melihat halaman ini karena mengalami masalah ini. Bagi saya, saya memiliki angka floating point yang dihitung dari array tetapi bahkan setelah menetapkan variabel sebagai floating point kesalahan masih diberikan, inilah perbaikan sederhana dan kode contoh di bawahnya yang menyebabkan masalah.

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

sumber
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

}

itulah kode yang saya miliki yang mengulang dan membuat elemen div html baru. Kode berfungsi dengan baik dan elemen terbentuk, tetapi saya mendapat peringatan yang sama di error_log.

Setelah membaca jawaban lain yang berguna, saya menyimpulkan bahwa saya sedang menjumlahkan string dan angka di baris yang salah. Jadi saya mengubah kode di baris itu menjadi

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

Sekarang kodenya berfungsi seperti sebelumnya tetapi kali ini tanpa peringatan. Semoga contoh ini bermanfaat bagi seseorang.

Neo
sumber
1

Selesaikan kesalahan ini di WordPress

Peringatan: Nilai non-numerik ditemukan di C: \ XAMPP \ htdocs \ aad-2 \ wp-termasuk \ SimplePie \ Parse \ Date.php pada baris 694

Solusi sederhana di sini!

  1. cari file wp-includes\SimplePie\Parse\Date.php
  2. temukan baris no. 694
  3. Anda menunjukkan kodenya $second = round($match[6] + $match[7] / pow(10, strlen($match[7])));
  4. dan ubah ini 3.) ke baris ini $second = round((int)$match[6] + (int)$match[7] / pow(10, strlen($match[7])));
Nasirkhan Pathan
sumber
1
$sub_total_price = 0; 

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

echo $sub_total_price;

itu bekerja 100% :)

Imran Imu
sumber
1

Itu biasanya terjadi ketika Anda menipu string dengan tanda +. Di PHP Anda dapat membuat penggabungan menggunakan tanda titik (.) Jadi terkadang saya tidak sengaja meletakkan tanda + di antara dua string di PHP, dan itu menunjukkan kepada saya kesalahan ini, karena Anda hanya dapat menggunakan + masuk angka.

ASammour
sumber
0

Pastikan struktur kolom Anda INT.

Borgy ES
sumber
0

Jika nilai non-numerik ditemukan dalam kode Anda, coba di bawah ini. Kode di bawah ini diubah menjadi float.

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

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

 echo $PlannedAmount; //output = 0
mallikarjun SK
sumber
0

di PHP jika Anda menggunakan + untuk penggabungan Anda akan berakhir dengan kesalahan ini. Dalam php + adalah operator aritmatika . https://www.php.net/manual/en/language.operators.arithmetic.php

penggunaan operator + yang salah:

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

gunakan . untuk penggabungan

$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>";
Tuan
sumber