$ _GET Ve kullanma

4 Cevap php

Belki de en başından itibaren yanlış bir şey yapıyorum, ve eğer öyleyse ben de bu konuda çalışacağız ...

Ben URL parçası olarak Olay Kimliği # geçtiği bir menü öğesi var. Benim özel durumda bu olay için bir bilgi sayfası için kullanıcı alır. Sonra onları Olay kaydolmak sağlayan bir düğme vardır. Tıklayın ve Etkinlik için kaydoldum ve şimdi onlar kaydoldum ve onları birkaç ekstra şeyleri görmenizi sağlar söylüyor aynı bilgileri sayfasına geri alınır ediyoruz.

Bu sayfa isabet ilk kez onlar gizli bir giriş alanı olarak düğmesini işaret tıklarsanız sonra geri sayfasına geçirilir Olay ID # anlamaya $ _GET kullanın. Ama bu sefer olay ID # anlamaya $ _POST kullanmak gerekir. Yani benim sorguda kod gibi görünen bir boolean parçası vardır

SELECT stuff FROM ... WHERE eventID = ($_GET["ID"] ? $_GET["ID"] : $_POST["ID"])

Bu çalışır, ancak daha iyi yapılabilir gibi hissediyor ...

4 Cevap

  1. Veritabanı girişleri sterilize. mysql_real_escape_string() is a quick and easy way to achieve this (or, if the ID is always numeric, you could just use intval() ). Don't be like the school who fell for Bobby Tables.
  2. If you're not sure which request method was used, use the $_REQUEST superglobal, hem GET ve POST değişkenleri içeren (örnek: $_REQUEST['ID']). Benim veri nereden geldiği konusunda net olmak istiyorum çünkü ben normalde, $_REQUEST kullanmak istemiyorum, ama bu onu kullanmak için mükemmel bir durum olacaktır.

Nick Presta işaret ettiği gibi, $_REQUEST da çerez değişkenleri içerir ve Nitekim olarak, isim çakışmaları için öncelik varsayılan * emirdir $_COOKIE, $_POST ve $_GET. Bunun ışığında siz sorguya veri takmadan önce, sen şimdi ne yaptığınızı yapabileceğini, ya yerine $_SERVER['REQUEST_METHOD'] kullanın:

// You can use mysql_real_escape_string() instead if you want
$id = ($_SERVER['REQUEST_METHOD'] == 'POST') ? intval($_POST['id']) : intval($_GET['id']);

Ayrıca, outis belirtildiği gibi, bunun yerine sadece ham SQL sorguları prepared statements Eğer kullanma seçeneğine sahip olduğunu unutmayın.

* - Stewart açıklamalarda belirtildiği gibi sipariş, configurable variables_order yönergesi yapılandırma yoluyla olmaktadır.

Bu kesinlikle daha iyi yapılabilir. Her şeyden önce, senin gibi veritabanı sorgulama önce kullanıcı girdileri. SQL Injection için kendinizi açtı.

Sadelik aşkına, sizin için daha önceki önerileri birleştirerek:

"SELECT stuff FROM ... WHERE eventID = '" . mysql_real_escape_string($_REQUEST['id']) . "';"

Eğer ayrıştırılması gereken herhangi bir değişken veya kaçar dahil olacak sürece ve kayıt için, dizi anahtarı için çift tırnak kullanmayın, bu süreç uzun sürer. Örneğin:

$_POST['id'] and not $_POST["id"] unless you're doing something like $_POST["post_$id"]

Umut olur.

Bunu veritabanına koymak alır yerden sağlanan kimliği seçimini ayırmak gerekir. Kısa sürede sayfa, GET veya POST aracılığıyla çağrıldı olsun bilir gelen kimliği almak için doğru süper küresel bilecek gibi, başka bir deyişle. Aslında, her zaman GET ile POST ve diğerleri ile çağrılır bazı sayfalar olabilir.

Gerçekten ondan kimliğini aldığı önemli değildir, $ _REQUEST kullanın.