Bir sorgu içinde PHP değişkeni kullanılarak

6 Cevap php

İçimde bir sorgu kullanarak PHP gibi am:

 $query =  'SELECT * from #__chronoforms_UploadAuthor where text_6 like "%'.$_GET['title'].'%" and text_7 like "%'.$_GET['author'].'%" limit 0,1';

Ben limiti bir PHP değişken yerine 1 eklemek çalışıyorum nerede ..

   $query =  'SELECT * from #__chronoforms_UploadAuthor where text_6 like "%'.$_GET['title'].'%" and text_7 like "%'.$_GET['author'].'%" limit 0,"'.$_GET['limit'].'"';

ama bana bir hata gösterir. Bazı hatalar tutmak vardır $_GET['limit'].

6 Cevap

Üç şey:

  1. Bu sorguları yazıyoruz yolu okumak biraz zor. Şahsen ben bir multi-line (aşağıda başına) heredoc sözdizimi kullanmayı tercih, ama bu kesinlikle gerekli değildir;

  2. Herhangi bir kullanıcı girişi mysql_real_escape_string() to avoid SQL injection saldırılara geçmesi gerekir. Note: "kullanıcı girişi" anything O vb çerezleri, form alanları (normal veya gizli), sorgu dizeleri dahil müşteri gelir içerir; ve

  3. Sen koymak LIMIT 0,5 değil LIMIT 0,"5", yani muhtemelen sorunun kaynağı olan LIMIT fıkra, ikinci argüman alıntı gerekmez.

Yani deneyin:

$title = mysql_real_escape_string($_GET['title']);
$author = mysql_real_escape_string($_GET['author']);
$limit = (int)$_GET['limit'];

$query = <<<END
SELECT *
FROM #__chronoforms_UploadAuthor
WHERE text_6 LIKE "$title%" 
AND text_7 LIKE "%$author%"
LIMIT 0,$limit
END;

Ayrıca, bir commentor bu % ve _ kaçan not edilmelidir. Bu olabilir ya da doğru olmayabilir. Birçok uygulama kullanıcı joker girmek için izin verir. Bu durum buysa, o zaman bunları kaçmak gerekir. Bunları kaçmak gerekiyorsa bunları işlemek:

$title = like_escape($limit);

function like_escape($str) {
    return preg_replace('!(?|\\)((?:\\)*)([%_])!', '$1\$2', $str);
}

Bu biraz karmaşık düzenli ifade birisi '\'% koyarak ve ardından ters eğik çizgi kaçış değil, '%', hangi '\%' alma durdurmaya çalışıyor.

Karma işareti (#) ve bir sorun gibi görünüyor, hangi SQL Yorum başlar

Korkunç cevaplar demet istiyorum!

a. Sınır sorunu çözmek için:

$limit = intval($_GET['limit']);

ve daha sonra

...LIMIT 0, $limit

sorguda.

b. Gibi birçok sözü $ _GET ['title'], sterilize etmek için:

$title = mysql_real_escape_string($_GET['title']);

Yani son kodu olmalıdır

$limit=intval($_GET['limit']);
$title = mysql_real_escape_string($_GET['title']);
$author = mysql_real_escape_string($_GET['author']);
$query = "SELECT * from #__chronoforms_UploadAuthor
          WHERE text_6 like '$title' and text_7 like '%$author%'
          LIMIT 0, $limit";

Bu sorunun kaynağı olan çift-tırnak içinde $_GET['limit'] kapalı ettik.

Bu deneyin:

$query =  'SELECT * from #__chronoforms_UploadAuthor where text_6 like "%'.$_GET['title'].'%" and text_7 like "%'.$_GET['author'].'%" limit 0,'.$_GET['limit'];

Cletus bu yanıtında söz olarak da, çözmeniz gereken çok daha ciddi sorunlar var.

$ _GET ['Sınır'] etrafında çift tırnak kaldırın. LIMIT deyimi alır iki sayı alıntı olmamalıdır.

Bu çalışması gerekir:

$query =  'SELECT * from #__chronoforms_UploadAuthor where text_6 like "%'.$_GET['title'].'%" and text_7 like "%'.$_GET['author'].'%" limit 0,'.$_GET['limit'];

Ama gerçekten, gelen verileri filtrelemek gerekir ...

$query =  'SELECT * from #__chronoforms_UploadAuthor where text_6 like "%'.mysql_real_escape_string($_GET['title']).'%" and text_7 like "%'.mysql_real_escape_string($_GET['author']).'%" limit 0,"'.intval($_GET['limit']).'"';