php mysql sorgusu ile sorun

6 Cevap php

Ben bir DB yazı yazma ve sonra bir kullanıcıya e-posta sonucu bir form işleyici dosyaya göndererek yöntem = yazı ile bir form var.

Ben bir ekleme deyimini yazdım ama formu işlenirken bir hata alıyorum, ama ben sorunun ne olduğunu gerçekten emin değilim DB vızıltı davranmıyorum. İşte kod -

// MYSQL QUERY
$result = mysql_query("INSERT INTO 2009_prize_results 
  (name, address, address2, email, 100, 101, 102, 103, 104, 105, 106, 107, 108) 
VALUES
  ($_POST[name],$_POST[address],$_POST[address2],$_POST[email]
  ,$_POST[100],$_POST[101],$_POST[102],$_POST[103],$_POST[104],$_POST[105]
  ,$_POST[106],$_POST[107],$_POST[108])");
if (!$result) {
    die ("SQL error: " . mysql_error());
}

Ve ben alıyorum hata -

SQL hatası: Eğer SQL sözdizimi bir hata var; Doğru sözdizimi '100 yakınında kullanmak için MySQL sunucu sürümü karşılık kılavuzunu kontrol, 101, 102, 103, 104, 105, 106, 107, 108) VALUES (Marty Martin, 313 Orlando Av 'at line 1

Gönderme değerleri

name = Marty Martin
address = 313 Orlando Ave
address2 = Anytown, VA
email = foo@foo.com
100 = on
101 = off
10* are all checkboxes so are either on or off

Ben burada yanlış ne var?

6 Cevap

Eğer DEĞERLERE, her maddenin etrafında tek tırnak gerekir

EDIT: Ayrıca $ _POST [] değişkenleri bir dize süre değerlendirmek olmayabilir. Sen farklı bir sözdizimi kullanın veya kötü ekstresi () kullanmanız gerekir;

Bakınız:

Little Bobby Tables :-) XKCD SQL injection - please explain

Eğer mysql kitaplığı kullanmanız gerekiyorsa, o aksi Hazırlanan Tablolar kullanın, size mysql_real_escape_string aracılığıyla tüm girdilerinin çalıştıran belirli olun.

Birlikte sorgu koyduğunuzda sonra tırnak (tek veya çift çalışacak) içinde tüm değerleri sarın.

Eğer gerçekten böyle sayısal isimlerle sütunlar varsa, büyük olasılıkla SQL tarafından literal sayılar olarak yorumlanır değildir bu yüzden ters tırnakların ile sınırlandırmak gerekir. Ve, kendi aklı ve benim için, sizin sorguları biçimlendirmek lütfen.

$result = mysql_query("
INSERT INTO 2009_prize_results(
       name
     , address
     , address2
     , email
     , `100`
     , `101`
     , `102`
     , `103`
     , `104`
     , `105`
     , `106`
     , `107`
     , `108`
)
VALUES (
    -- values here as others have stated
)");

Sorunların bu tür hata ayıklamak için yolu aslında gönderilen sorgu bakmak ve onunla sorunun ne olduğunu görmek için. Onunla sorunun ne olduğunu gördüğünüzde, değer işler kadar genelleme olduğunu anlamaya ve uygun ayarlamalar ve / veya doğrulama kontrolleri ile bunu çözebilirsiniz.

Ayrıca, akılda tutmak: dizeleri (tek tırnak)'' ile çevrili olsun, ve dizeleri belirtilmemiş değerleri NULL olarak (tırnak işaretleri yok) olarak kabul edilmelidir. Eğer standart dışı veya sorunlu olan tablo veya kolon isimlerini varsa, onun adı etrafında `` (backticks) unutmayın; olanların yanı sıra sözdizimi hataları neden olabilir.

Tek tırnak sarma değişkenlere ek olarak, ayrıca POST değişkenler özel karakterler kaçmak gerekir. Bir açıklama ve örnekler için mysql_real_escape_string yöntemi belgelerine bir göz atın.

Önizleme, kaçan XKCD eğlenceli kılan SQL injection attacks tür önlemek için yapılır. Size olur ve kolayca önlenebilir olduğunda hiç eğlenceli olduğunu hariç.

Yorumcu soruyu yanıtlamak için, evet, aynı zamanda prepared statements PHP ve MySQL ile gerçekleştirebilirsiniz. Bu mysql_real_escape_string yöntemi kullanılarak bir alternatiftir.

Tırnak içinde kendi değerlerini koymak gerekir. Örneğin:

... VALUES(Marty

olmalıdır

... VALUES('Marty'

Deneyin:

// Concatenated for readability
$query = "INSERT INTO 2009_prize_results " .
         "(name, address, address2, email, 100, 101, 102, " . 
         "103, 104, 105, 106, 107, 108) VALUES " . 
         "('{$_POST['name']}', 
          '{$_POST['address']'}, 
          '{$_POST['address2']}', 
          '{$_POST['email']}', 
          '{$_POST[100]'}, '{$_POST[101]}', '{$_POST[102]}', '{$_POST[103]}', 
          '{$_POST[104]}', '{$_POST[105]}', '{$_POST[106]'}, '{$_POST[107]}', 
          '{$_POST[108]'})";

$result = mysql_query($query);