$ _POST var mı kontrol edin


101

$ _POST'un var olup olmadığını kontrol etmeye çalışıyorum ve varsa, başka bir dizenin içine yazdırın, yoksa hiç yazdırmayın.

bunun gibi bir şey:

$fromPerson = '+from%3A'.$_POST['fromPerson'];

function fromPerson() {
    if !($_POST['fromPerson']) {
        print ''
    } else {
        print $fromPerson
    };
}

$newString = fromPerson();

Herhangi bir yardım harika olur!

Yanıtlar:


172
if( isset($_POST['fromPerson']) )
{
     $fromPerson = '+from%3A'.$_POST['fromPerson'];
     echo $fromPerson;
}

62

Basit. İki seçeneğiniz var:

1. HİÇBİR gönderi verisi olup olmadığını kontrol edin

//Note: This resolves as true even if all $_POST values are empty strings
if (!empty($_POST))
{
    // handle post data
    $fromPerson = '+from%3A'.$_POST['fromPerson'];
    echo $fromPerson;
}

(VEYA)

2. Post verilerinde yalnızca BELİRLİ Anahtarın olup olmadığını kontrol edin

if (isset($_POST['fromPerson']) )
{
    $fromPerson = '+from%3A'.$_POST['fromPerson'];
    echo $fromPerson;
}

Shi yorumun gereğince Augustus Francis'in yanıta , empty()olduğu değil php, dize, çünkü seçim # 1 için doğru '0'eşdeğerdir falseve - empty()döner trueiçin YANLıŞ olarak tüm değerlerin eşdeğer . Bu nedenle empty, değer kullanıldığında kod yazdırmayı atlar '0'. Boş dizgeyi dışarıda bırakmak istiyorsanız, Augustus cevabına bakın.
ToolmakerSteve

34

Herkes isset () kullanmayı söylüyor - ki bu muhtemelen sizin için çalışacaktır.

Ancak, arasındaki farkı anlamanız önemlidir

$_POST['x'] = NULL; ve $_POST['x'] = '';

isset($_POST['x'])dönecektir falseİlk örnekte, aynı dönecektir trueEğer ikisinden birini yazdırmak çalışırsa, hem boş değerini döndürecektir rağmen ikinci birinde.

Eğer sizin $_POSTkullanıcı tarafından girilen bir alandan / formdan geliyorsa ve boş bırakılmışsa, değerin "" olacağına ama BOŞ OLMAYACAĞINA İNANIYORUM (bundan% 100 emin değilim).

Bu varsayım yanlış olsa bile (birisi yanlışsam lütfen beni düzeltin!) Yukarıdakileri ileride kullanmak üzere bilmek yine de iyidir.


4
empty () değişken varlığını ve boş olmayan bir değeri kontrol eder, bu nedenle boş bir dizge false döndürmesi gerektiğinde kullanılacak işlev budur.
Han Dijk

1
@HanDijk - Shi açıklama gereği Augustus Francis'in yanıta , empty()olduğu değil php, dize, çünkü burada doğru '0'eşdeğerdir falseve - empty()döner trueiçin YANLıŞ olarak tüm değerlerin eşdeğer . Bu nedenle empty, değer kullanıldığında kod yazdırmayı atlar '0'.
ToolmakerSteve

30

Şaşırdım, bundan bahsedilmedi

if($_SERVER['REQUEST_METHOD'] == 'POST' && isset($_POST['fromPerson'])){

2
Neden? Sunucu yöntemi POST değilse, POST değişkeni ayarlanmayacaktır, bu nedenle gereken tek şey ikinci yarıdır. Yanlış mıyım?
ToolmakerSteve

@ToolmakerSteve evet çoğu durumda bu yeterli ama her zaman değil cevabım bunun yapılabileceği başka bir yol göstermekti.
John Magnolia

Ayrıca, onay kutuları olan bir formunuz varsa ve isimsiz gönderiyorsanız da işe yarar.
John Magnolia

2
Bir durumu anlatınız isset($_POST['fromPerson']olduğunu true, olsa bile if($_SERVER['REQUEST_METHOD'] == 'POST'olduğunu false. Böyle bir durum olmadıkça, gereken tek şey isset...kısımdır.
ToolmakerSteve

Doğru, ama tam tersi. fromPersonmevcut olmayabilir, ancak POST hala mevcut olabilir. Soru, "$ _POST varsa" idi. ve sadece bir örnekte, $ _POST ['fromPerson'] kullanılmıştır. @Goat'ın burada tanımladığı gibi bazı durumlarda, fromPersonGönder adı olsa bile POST'ta mevcut olmayabilir.
papo


13

Dizi anahtarının var olup olmadığını kontrol etmenin doğru yolu işlevdir array_key_exists()

Aradaki fark, sahip $_POST['variable'] = nullolduğunuzda anahtarın var olduğu ve gönderildiği, ancak değerin boş olduğu anlamına gelir.

Diğer seçenek, isset()dizi anahtarının var olup olmadığını ve ayarlanıp ayarlanmadığını kontrol edecek olan seçenektir.

Son seçenek, empty()dizi anahtarının var olup olmadığını ve değerin boş kabul edilmediğini kontrol edecek olanı kullanmaktır .

Örnekler:

$arr = [
  'a' => null,
  'b' => '',
  'c' => 1
];

array_key_exists('a', $arr); // true
isset($arr['a']); // false
empty($arr['a']); // true


array_key_exists('b', $arr); // true
isset($arr['b']); // true
empty($arr['b']); // true


array_key_exists('c', $arr); // true
isset($arr['c']); // true
empty($arr['c']); // false

Sorunuzla ilgili olarak

Değerin gönderilip gönderilmediğini kontrol etmenin uygun yolu, istek yönteminin kontrolü ile array_key_exists () kullanmaktır.

if ($_SERVER['REQUEST_METHOD'] == 'POST' && array_key_exists('fromPerson', $_POST)    
{
   // logic
}

Ancak bazı durumlarda sizin mantık bağlıdır nerede vardır isset()ve empty()iyi olmak yanı olabilir.


Harika cevap, kullanma önerisi dışında empty. Shi yorumun gereğince Augustus Francis'in yanıta , empty()olduğu değil php, dize, çünkü alternatif bir seçenek olarak doğru '0'eşdeğerdir falseve - empty()döner trueiçin YANLıŞ olarak tüm değerlerin eşdeğer . Bu nedenle empty, değer kullanıldığında kod yazdırmayı atlar '0'. Boş dizgeyi dışarıda bırakmak istiyorsanız, Augustus cevabına bakın.
ToolmakerSteve

En iyi cevap +1.
Viktor Joras

9
  • Bu durumda yöntemi kullanmak issetuygun değildir.

PHP belgelerine göre: http://php.net/manual/en/function.array-key-exists.php
(bkz. Örnek 2. Array_key_exists () vs isset () )
Yöntem array_key_exists, dizideki anahtar varlığını kontrol etmek için tasarlanmıştır.

Dolayısıyla sorudaki kod aşağıdaki gibi değiştirilebilir:

function fromPerson() {
   if (array_key_exists('fromPerson', $_POST) == FALSE) {
        return '';
   } else {
        return '+from%3A'.$_POST['fromPerson'];
   };
}

$newString = fromPerson();


  • $ _POST dizisinin varlığını kontrol etmek gerekli değildir çünkü bu, 4.1.0 sürümünden beri PHP ortamı global değişkeni (günümüzde PHP'nin eski sürümleriyle karşılaşmıyoruz).

Bu kod, yalnızca issetposta alanı ayarlandığında ancak NULL içerdiğinde çözümden farklıdır . Bu bir iyi bir alternatif , eğer izin vermek istediğiniz NULLyer elsedalı. Ancak , bir dizgeye ihtiyaç duyulursa bu bir hatadır; bu durumda issetdoğru olanı yapar, ancak bu kod yapmaz - NULLdeğeri aktarır. Robert'ın daha sonraki cevabı farkı gösteriyor.
ToolmakerSteve

6

Aslında tüm yöntemler önerilmemektedir, bu Netbeans 7.4'te bir uyarıdır ve kesinlikle süper küresel değişkenlere doğrudan erişmemek, bunun yerine bir filtre kullanmak iyi bir uygulamadır.

$fromPerson = filter_input(INPUT_POST, 'fromPerson', FILTER_DEFAULT);
if($fromPerson === NULL) { /*$fromPerson is not present*/ }
else{ /*present*/ }
var_dump($fromPerson);exit(0);

1
Öte yandan, kodun okunabilirliği de önemlidir. IMHO, issetbir filtre ifadesinden çok daha okunabilir. Ama buna işaret ettiğiniz için teşekkür ederim; dikkate alınması faydalı bir seçenektir.
ToolmakerSteve

Peki, filtreleri kullanan ancak isset / 2
linuxatico

"Tüm yöntemler aslında önerilmez" - bu güçlü bir ifadedir (NetBeans bir uyarı olarak işaretlese bile). Bir bağlantı var mı yetkili bir kaynak , bu zorlaştırır, $ _POST doğrudan referanslar? ( Php hakkında titizlikten ziyade kodlama kolaylığı için tasarlanmış çok şey var - bu soruya verilen cevaplardaki kaç kişinin yanlış kullandığına empty, php'nin gevşek yazımıyla tetiklendiğine bakın; $ _POST'a erişmenin zayıf olarak değerlendirileceğini hayal etmek zor stil.)
ToolmakerSteve

4

Deneyin

if (isset($_POST['fromPerson']) && $_POST['fromPerson'] != "") {
    echo "Cool";
}

Per Han Dijk'in Rafael'in cevabı hakkındaki yorumu empty($_POST['fromPerson']), bu birleşik testi yapıyor. Okumak ve yazmak daha kolay :)
ToolmakerSteve

@ToolmakerSteve: empty('0')döndürür true. Yani aynı değil.
Shi

1
@Shi - evet, haklısınız; söylediğim yanlış! Görünüşe göre burada gösterilen koddan daha basit bir çözüm yok.
ToolmakerSteve


3
if (is_array($_POST) && array_key_exists('fromPerson', $_POST)) {
    echo 'blah' . $_POST['fromPerson'];
}

1
İs_array ($ _ POST) POST'ta herhangi bir değer olup olmadığını kontrol ediyor mu? Uygulamamda başka bir şey yapmadan önce bir gönderi olup olmadığını belirlemeye çalışıyorum.
Jeff LaFay

1
Düzenlememe bakın. is_array()bir dizi olup olmadığını kontrol eder, ikinci kısım anahtarlı bir öğeye sahip olup olmadığını kontrol eder 'fromPerson'.
jezmck

2

if( isset($_POST['fromPerson']) ) doğrudur.

Echo'yu yönlendirmekten daha iyi bir işlev ve geri dönüş kullanabilirsiniz.


2
Bu cevap, yıllar önce başka cevaplarda söylenmemiş olan tartışmaya hiçbir şey eklemez .
Takım ÜreticisiSteve

1

Üçlü bir operatörde ayarlanıp ayarlanmadığını ve boş olup olmadığını kontrol etmeyi seviyorum.

// POST variable check
$userID  = (isset( $_POST['userID'] )    && !empty( $_POST['userID'] ))   ? $_POST['userID']   :  null;
$line    = (isset( $_POST['line'] )      && !empty( $_POST['line'] ))     ? $_POST['line']     :  null;
$message = (isset( $_POST['message'] )   && !empty( $_POST['message'] ))  ? $_POST['message']  :  null;
$source  = (isset( $_POST['source'] )    && !empty( $_POST['source'] ))   ? $_POST['source']   :  null;
$version = (isset( $_POST['version'] )   && !empty( $_POST['version'] ))  ? $_POST['version']  :  null;
$release = (isset( $_POST['release'] )   && !empty( $_POST['release'] ))  ? $_POST['release']  :  null;

5
empty('0')olduğunu true. Olmasa iyi olur version 0, ya da userID 0vb.
Shi

0

Bu konu çok eski olmasına ve benim için Google'da üst sıralarda yer almasına rağmen cevabımı eklemek isterim.

En iyi yöntemim denemek:

if(sizeof($_POST) !== 0){
// Code...
}

Gibi $_POST bir dizidir komut yükler ve hiçbir veri mevcut ise, $_POSTdeğişken o 0. Bu bir dizi uzunluğu IF deyimini kullanılabilir olacaktır.

Ayrıca $_POST, ayarlanmış olup olmadığını kontrol ediyormuşuz gibi görünen bir "tanımlanmamış dizin" hatası verip vermediğini merak ediyor olabilirsiniz ... Aslında$_POST her zaman var, "tanımsız dizin" hatası yalnızca $ _POST aramayı denediğinizde görünecektir. var olmayan dizi değeri.

$_POSTher zaman kendi içinde ya boştur ya da dizi değerlerine sahiptir. $_POST['value']mevcut olmayabilir, bu nedenle bir "tanımsız dizin" hatası verir.

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.