Girdiye dayalı bir işlevi sql deyimi ayarlanması

2 Cevap php

Hey there, This is a bit urgent!

I'm trying to make a simple filter search where-by you can choose from a series of 3 drop downs and then based upon this the results are then displayed, How would I go about adjusting the sql query for each and if you were to only choose to search from aone of the 3 rather than all 3 etc... example there could be the url with input such as: url.com?location=gb&color=3&hair=4 and still form the correct sql query for something like this: url.com?location=gb&hair=1 and not encounter problems with WHERE and AND etc etc and empty variables in the statement

Verileri tüm olasılıklar için nasıl ayarlanacağını görmek için bu kullanarak kontrol etmek için büyük bir işlev olması gerek değil mi?

Thanks, Stefan

2 Cevap

Ben bir soru ben senin için oldukça benzer olduğunu düşünüyorum, diğer gün yanıtladı:

PHP: prepared statement, IF statement help needed

Fikir uygulama girişine uygun gerektiği gibi terimleri toplamak için kodunuzda koşullu mantığı kullanmaktır. O zaman doğru SQL ifadesi üreten böyle bir şekilde onları bir araya.

Bu dinamik SQL ifadesi oluşturmak için bazı uygulama fonksiyonunu gerek yok, ve mümkün olduğunca kısa ve öz yapmak için teknikler vardır. Gerçekten birçok olası arama terimleri varsa, uzun bir fonksiyonu ile bitirmek olabilir. Ama ne oldu? Karmaşık girişleri varsa, onlarla başa çıkmak için karmaşık kodu gerekir sürpriz olmamalıdır.


Yorumlarınız Re:

url.com? location = gb & color = 3 & saç = 4

Tamam, sen kadar üç girişe sahiptir ve dinamik bu bir SQL sorgusu oluşturmak için var. En sondan başlar ve geriye doğru çalışalım. Sonuçta böyle bir SQL ifadesi istiyorum:

WHERE (location = 'gb') AND (color = 3) AND (hair = 4)

Eğer üç dönem bir dizi varsa, implode() function. But you may also have fewer than three. You can handle any number of terms by putting however many terms you have into an array and imploding them with AND her dönem arasında PHP kullanarak bunları birlikte katılabilirsiniz:

$where_array = array(
        "(location = 'gb')",
        "(color = 3)",
        "(hair = 4)"
    );

$where_expr = "WHERE " . implode(" AND ", $where_array);

Peki bu terimler ile dizi oluşturabilirim? Sizin app mevcut talebi mevcut her giriş için koşullu diziye eklemek için kod yazarak:

$where_array = array();
if (array_key_exists("location", $_GET)) {
    $location = mysql_real_escape_string($_GET["location"]);
    $where_array[] = "(location = '$location')";
}
if (array_key_exists("color", $_GET)) {
    $color = mysql_real_escape_string($_GET["color"]);
    $where_array[] = "(color = '$color')";
}
if (array_key_exists("hair" $_GET)) {
    $hair = mysql_real_escape_string($_GET["hair"]);
    $where_array[] = "(hair = '$hair')";
}

Bütün bunlar yapıldıktan sonra, dizi sıfır ila üç öğesi vardır. Bu bir veya daha fazla varsa, aksi takdirde atlamak, daha önce gösterildiği gibi bir WHERE tümcesi oluşturmak istiyorum.

$where_expr = '';
if ($where_array) {
    $where_expr = "WHERE " . implode(" AND ", $where_array);
}

Sonra temel SQL sorgusu için $where_expr append.

$sql .= $where_expr

Ilgili şeyler $params yerine bir SQL ifadesi içine dinamik değerler de dahil olmak üzere alternatif bir yöntem sorgu parametreleri, için mysql_real_escape_string(). Bu zorunlu değildir (ve aslında PHP'nin eski mysql uzatma sorgu parametreleri desteklemiyor) ama ben PDO geçiş tavsiye yüzden bu özelliği kullanabilirsiniz. Burada örneğe bakın: PDO::prepare() .

İşte bu benim gitmek olduğunu:

// discard empty values and unwanted keys
$get = array_intersect_key(array_filter($_GET, 'strlen'), array_flip(array('location', 'color', 'hair')));

foreach ($get as $key => $value)
{
    $get[$key] = $key . ' = ' .  mysql_real_escape_string($value);
}

$sql .= ((count($get) == 0) ? null : ' WHERE ') . implode(' AND ', $get);

Ben henüz denemedim ama iyi çalışması gerekir.