Php numRows sorun

4 Cevap php

Benim sayfalara erişmek için sorgu dizesi kullanın. Kimsenin türü bilinmiyor sorgu dizesi elle, daha sonra bir yere yönlendirmek eğer yapmayı deneyin ..

Örneğin:

Url: test.php?m=1 (this is a valid url) test.php?m=1324234 (this is not a valid url ) test.php?m=1asdaa (this is not a valid url )

include("config/database.inc");
$qm=$_GET['m'];
 $query = "select acc from test where acc=$qm"; 
 $numresults=mysql_query($query);
 $numrows=mysql_num_rows($numresults);
  if ($numrows == 0){
    	  header("Location: index.php"); 
    	  exit;
     }

Veritabanında i iki çizgi, çizgi var 1: acc = 1; HAT 2: acc = 2;

If i type to the url: test.php?m=12312431, then redirect to index.php 'coz $numrows=0. Thats ok. But if i type: test.php?m=1sdfsfsf, then i got this error msg.: Warning: mysql_num_rows(): supplied argument is not a valid MySQL result resource in..

Ben bunu nasıl yapabilirim? Veritabanından sorgu önce $ _GET ['m'] kontrol etmeniz gerekir?

Teşekkür ederim.

4 Cevap

Eğer düzgün filtreleme ve kaçan olmadan doğrudan bir SQL sorgusuna GET değişkenin değerini yerleştirerek asla. Senin sorunun numaraları olmayan şeyler SQL sorgusu içine koymak için izin konum olmasıdır. Bu özel durumda, test zararsız ve sadece hataları, ancak kötü niyetli bir kullanıcı da SQL enjeksiyon yoluyla çok daha zararlı şeyler yapabilirdi.

Bunun yerine, ne gerçekten yapmak istiyorum know tamam bir türü (bu durumda, bir tamsayı) değişkenin değerini dönüştürmek ve o kullanarak veritabanını sorgulamak değildir. Bunun yerine bu deneyin:

include("config/database.inc");
$qm=intval($_GET['m']);
 $query = "select acc from test where acc=$qm"; 
 $numresults=mysql_query($query);
 $numrows=mysql_num_rows($numresults);
  if ($numrows == 0){
          header("Location: index.php"); 
          exit;
     }

Yerine zararlı dizeleri sonucu bir tamsayı olması için zorlar türüne intval çağrısı (), dikkat edin.

Bunu yapın:

$qm=intval($_GET['m']);

m geçersiz ise, mysql_query false = $ sorgu dönecektir.

Eğer mysql_num_rows "false" sağlarsanız, size ne göndermiş sorgu bilmiyor ve doğru geçersiz numrows neden olsun, örneğin bir başarısızlık.

O m intval ($ m) tam sayı olup olmadığını kontrol edin;

Yanı sıra girişini doğrulama veya başkalarının emin giriş mantıklı yapmak için önerilen gibi bir typecast zorlama olarak, örneğin, tırnak içinde bir sorguya geçirilen kullanıcı gönderilen değerlerini çevreleyen alışkanlığı içine almak için deneyin

$query = "select acc from test where acc='$qm'";

Eğer teknik bir dizeye bir tamsayı karşılaştırarak konum burada olsa, MySQL bu sağlar (ve hala burada mevcut tamsayı tuşlarını kullanacağız) ve filtre girişi için unutmak eğer savunma son satırı sağlar.