Uyarı: Sayısal olmayan bir değerle karşılaşıldı


123

Yakın zamanda PHP 7.1'e güncellendi ve aşağıdaki hatayı almaya başlayın

Uyarı: 29. satırda sayısal olmayan bir değerle karşılaşıldı

İşte 29. satır nasıl görünüyor

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

Localhost'ta her şey iyi çalışıyor ..

Bununla nasıl başa çıkılacağı veya ne olduğu hakkında bir fikriniz var mı?


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

2
PHP 7'de yeni bir uyarı gibi görünüyor (bildiğiniz gibi). php.net/manual/en/migration71.other-changes.php Hatayı aldığınızda bu değişkenlerin değerleri var mı? Onları 0 olarak
başlatarak

1
@MichaelHanon, bahsettiğiniz cevap nerede? sözdizimi hatası nedir?
FKEinternet

1
$ alt_toplam + = ((int) $ öğe ['miktar'] * (int) $ ürün ['fiyat']);
En Aptal

bunun gibi eski formatı kullanıyorum a = a + b; veya str = str. "<a href='".str2."'> asd </a>"; veya $ this-> storeItems = $ this-> storeItems. $ str;
saber tabatabaee yazdi

Yanıtlar:


106

Öyle görünüyor ki PHP 7.1'de sayısal olmayan bir değerle karşılaşılırsa bir Uyarı verilecek. Bu bağlantıya bakın .

Aldığınız Uyarı bildirimi ile ilgili kısım şu şekildedir:

Numaralar veya bunların atama eşdeğerlerini bekleyen operatörler kullanılarak geçersiz dizeler zorlandığında yeni E_WARNING ve E_NOTICE hataları ortaya çıktı. Dize sayısal bir değerle başladığında ancak sondaki sayısal olmayan karakterler içerdiğinde bir E_NOTICE yayınlanır ve dizi sayısal bir değer içermediğinde bir E_WARNING çıktılanır.

Ya tahmin ediyorum $ öğesi [ 'miktar'] veya $ ürünü [ 'fiyat'] kadar emin onları çoğalmak için denemeden önce yapmak yapmak, sayısal bir değer içermiyor. $ Alt_toplamını hesaplamadan önce bir tür koşullu kullanabilirsiniz, örneğin:

<?php

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

2
Bu sorunu yaşadım çünkü PHP'ye aktardığım asp'de hala birkaç artı işaretim vardı. Ctrl + f ve + karakterleri arayın.
MH

Bu uyarıyı php.ini aracılığıyla kapatmanın bir yolu var mı?
BeniRose

3
Teşekkürler. Eski bir Symfony 1.4 projesi üzerinde çalışıyorum ve görünen o ki, bunun kasıtlı olarak gerçekleştiği birkaç yer var ki bu çok acı verici. Bu gerçekten php.ini'de bu katılık düzeyini kapatmanıza izin veren bir bayrak olmalıdır.
BeniRose

9
Alternatif olarak şunu da kullanabilirsiniz$sub_total += ((int)$item['quantity'] * (int)$product['price']);
En Aptal

2
Dürüst olmak gerekirse, bunu kapatmayacağım, bu, sizi bir hata bulmaya gerçekten götürebilecek daha faydalı uyarılardan biri - bizim durumumuzda, yıllardır yerinde olan ve fark edilmeyen bir hata. Daniel'in dediği gibi, bu sadece matematikleri sayısal olmayan bir dizgeye uygulamaya çalışırsanız görünür. Bunun istenen davranış olacağı bir durum göremiyorum. yani "varsayılan" * 86400, 0'a eşittir ve bu uyarı olmadan, kodda adım adım ilerlemediğiniz sürece asla bilemezsiniz.
Steve Childs

230

Tam olarak yaşadığınız sorun değil, arayan insanlar için aynı hata.

JavaScript'te çok fazla zaman geçirdiğimde bu bana oldu.

PHP'ye geri döndüğümde iki dizgeyi " +" yerine " " ile birleştirdim .ve bu hatayı aldım.


24
Bu lanet şey 2019'da beni şaşırttı, LOL. PHP'nin dizgi birleştirme yeniden yapılandırılmalıdır!
Daniel Dut

2
Ve burada nodejs yaptıktan ve PHP'ye geri döndükten 2 hafta sonra bu hatayla tekrar karşılaştım lol
imin

3
Bir dizge a ile birleştirilmeye çalışılır çalışmaz, +bunun bir intdeğer olduğu varsayılır ... Verilen işlenenler herhangi bir sayısal veri türünden değildir.
Martin Zeitler

1
haha, aynısı bende de oldu, JS'ye çok fazla zaman harcıyorum ve PHP söz konusu olduğunda JS kodunu kullanmaya çalışıyorum. Ancak PHP yorumlayıcı bunu yapmama izin vermiyor.
Hemant Sankhla

1
Aman Tanrım. Bunun +yerine kullandığımı öğrenmek için neredeyse bir saattir Google'da çalışıyorum .. Teşekkürler!
marvinpoo

53

Sorunu yeni bir mantık olmadan çözebilirsin, sadece sayıyı sayıya çevirerek uyarıyı engeller ve PHP 7.0 ve altındaki davranışa eşdeğerdir:

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

(Daniel Schroeder'in cevabı eşdeğer değildir çünkü sayısal olmayan değerlerle karşılaşılırsa $ sub_total ayarlanmadan kalır. Örneğin, $ sub_total yazdırırsanız, muhtemelen bir faturada yanlış olan boş bir dize alırsınız. - by döküm, $ sub_total değerinin bir tam sayı olduğundan emin olun.)


4
bu kötü bir uygulamadır. Girişlerinizi filtrelemeniz gerekiyor
Ciro Vargas

4
Bu en iyi cevap gibi görünüyor. Ve tüm bildiğiniz için bu değerlerin veritabanından geldiğini, kaçmanız gerekmeyebilir.
MH

3
@Ciro Vargas: Uygulamaya göre değişir. Çoğu durumda, tanımlanmamış bir tamsayının sıfır olarak yorumlanmasını istersiniz. Her neyse, bu PHP7.0 davranışına eşdeğerdir ve kodun yeniden yazılmasını gerektirmez. (Kabul edilen yanıtın yeniden yazılması gerekiyor.)
Roland Seuhs

@RolandSeuhs Takip ettiğimden emin değilim, iki dizgeyi çarparken '24' * '10' PHP'de 240 üretecek, '24' * null 0 üretecek, ancak '24' * 'cat' belirtilen hatayı atacak yukarıda çünkü 'kedi' sayısal olmayan bir değerdir. Bir int için 'cat' çevirebilirsiniz, ancak bu size anlamlı bir ara toplam da vermez. Benim çözümüme gelince, miktar ve fiyatın sayısal olup olmadığını belirlemek için çalışıyor. '24' ve '10' dizeleriyse, geçer, ancak herhangi biri sayısal olmayan bir dizeyse başarısız olur. Sub_total ile nasıl başa çıkılacağı aslında benim amacım değildi, eğer bu şekilde olursa özür dilerim.
DanielSchroederDev

3
***** FİYAT olmalı (float) olmalı!
Bhavin Rana

25

Benim durumumda +, başka bir dilde olduğu gibi benim yüzümden kullanıldı , ancak PHP dizelerinde birleştirme operatörü ..


5

Bu özellikle PHPMyAdmin'de başıma geliyordu. Yani daha spesifik cevap bu , şu yaptı:

Dosyada:

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

Ben bunu değiştirdim:

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

Buna:

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

Umarım kurtarıcı biri biraz derttir ...


4

Sayfalandırma ileri ve geri bağlantımla bu sorunu yaşadım .... basitçe (int) değişkenini $ Sayfa + 1 değişkeninin önüne koyun ve işe yaradı ...

<?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 ile phpmyadmin'de sorunla karşılaştım. Teşekkürler @coderama, kitaplıkları / DisplayResults.class.php 855 satırını değiştirdim

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

içine

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

Sabit.


3

Merhaba, Benim durumumda (WordPress) ve PHP7.4 kullanarak sayısal değer sorunu hakkında bir uyarı alıyorum. Bu yüzden eski kodu aşağıdaki gibi değiştirdim:

Gönderen:

$val = $oldval + $val;

Kime:

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

Şimdi uyarı kayboldu :)


2

Bir değişkenle artmadığınızı kontrol edin, değerinin '' gibi boş bir dize olduğunu kontrol edin.

Misal:

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

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

Süper, bu diğer cevapların çoğunda gözden kaçan bir durum.
Trendfischer

1

Bunu dene.

$sub_total = 0;

ve artık döngünüzde bunu kullanabilirsiniz

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

Sorununuzu çözmeli.


1

Bu sorunu yaşadığım için bu sayfaya baktım. Benim için bir diziden hesaplanan kayan nokta sayılarına sahiptim, ancak değişkenleri kayan noktalar olarak belirledikten sonra bile hata hala veriliyordu, işte soruna neden olan basit düzeltme ve örnek kod.

Örnek 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

}

bu, yeni html div öğelerini döngüye sokan ve oluşturan kodum. Kod iyi çalıştı ve öğeler oluşturuldu, ancak error_log'da aynı uyarıyı aldım.

Yararlı diğer cevapları okuduktan sonra, hatalı satırdaki bir dizi ve bir sayıyı özetlediğimi fark ettim. Bu yüzden o satırdaki kodu şu şekilde değiştirdim:

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

Artık kod daha önceki gibi çalışıyor, ancak bu sefer uyarı yok. Umarım bu örnek birisi için yararlı olur.


1

Bu hatayı WordPress'te çözün

Uyarı: 694. satırda C: \ XAMPP \ htdocs \ aad-2 \ wp-include \ SimplePie \ Parse \ Date.php'de sayısal olmayan bir değerle karşılaşıldı

Burada basit çözüm!

  1. bir dosyayı bul wp-includes\SimplePie\Parse\Date.php
  2. hayır bir satır bulun. 694
  3. kodu göster $second = round($match[6] + $match[7] / pow(10, strlen($match[7])));
  4. ve bunu 3.) bu satıra değiştirin $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 çalışıyor :)


1

Bu genellikle dizeleri + işaretiyle dolandırdığınızda olur. PHP'de nokta işaretini (.) Kullanarak birleştirme yapabilirsiniz. Bu yüzden bazen PHP'de iki dizge arasına yanlışlıkla + işareti koyuyorum ve bu bana bu hatayı gösteriyor, çünkü yalnızca sayılarda + işaretini kullanabilirsiniz.



0

Kodunuzda sayısal olmayan bir değerle karşılaşılırsa aşağıdakilerden birini deneyin. Aşağıdaki kod float'a dönüştürülmüştür.

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

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

 echo $PlannedAmount; //output = 0

0

PHP'de bitiştirme için + kullanırsanız bu hatayla sonuçlanırsınız. Php + 'da aritmetik bir operatördür. https://www.php.net/manual/en/language.operators.arithmetic.php

+ operatörünün yanlış kullanımı:

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

kullanın . birleştirme için

$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>";
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.