navi G Ответов: 1

Использование фильтра предварительного поиска ASP.NET с#


Привет друзья,

Я пытаюсь создать расширенный поисковый запрос , который позволит пользователям вводить столько фильтров, сколько они хотят. этот фильтр содержит различные элементы управления Asp, такие как dropdownlist и checkbox.
Это запрос , который я использую ,проблема в том, что он требует, чтобы фильтр enter all работал, мне нужно, чтобы он принимал любую коллекцию фильтров ,

(пожалуйста, опубликуйте свои ответы с изменением моего кода для лучшего понимания).


Проверьте правильность моего запроса ?
Проверьте также, правильно ли мой парамитризованный код ?


БЛАГОДАРИТЬ ВСЕХ.

Что я уже пробовал:

public partial class Searchpage : System.Web.UI.Page
{
    SqlConnection con = new SqlConnection();
    string price1;
    string price2;
    string osx;
    string checktwog;
    string checkthreeg;
    string checkfourg;
    string phonetype;
    string cam;
    string ram;
    string q;
    protected void Page_Load(object sender, EventArgs e)
    {
        con.ConnectionString = ConfigurationManager.ConnectionStrings["conn"].ConnectionString;
        con.Open();
        try
        {
           price1 = Convert.ToString(Session["price1"]);
           price2 = Convert.ToString(Session["price2"]);
           osx = Convert.ToString(Session["osx"]);
           checktwog = Convert.ToString(Session["checktwog"]);
           checkthreeg = Convert.ToString(Session["checkthreeg"]);
           checkfourg = Convert.ToString(Session["checkfourg"]);
           phonetype = Convert.ToString(Session["phonetype"]);
           cam = Convert.ToString(Session["cam"]);
           ram = Convert.ToString(Session["ram"]);
           
           q = "SELECT * FROM legacy WHERE [price] >= @prc1 AND [price] <= @prc2 AND [os] = @systm AND [gprsedge] = @gtwog AND [threeg] = @gthreeg AND [fourg] = @gfourg AND [touchscreen] = @touchtype AND [camera] = @ccamera AND [ram] = @rram";
           SqlDataSource1.SelectCommand = q;
           SqlDataSource1.DataBind();
           lbl_item_page.Text = Convert.ToString(checktwog);
           SqlCommand comm = new SqlCommand(q, con);
           comm.Parameters.AddWithValue("@prc1", price1);
           comm.Parameters.AddWithValue("@prc2", price2);
           comm.Parameters.AddWithValue("@systm", osx);
           comm.Parameters.AddWithValue("@gtwog", checktwog);
           comm.Parameters.AddWithValue("@gthreeg", checkthreeg);
           comm.Parameters.AddWithValue("@gfourg", checkfourg);
           comm.Parameters.AddWithValue("@touchtype", phonetype);
           comm.Parameters.AddWithValue("@ccamera", cam);
           comm.Parameters.AddWithValue("@rram", ram);
           
        }
        catch (Exception ex)
        {
            
            Response.Write(ex.ToString());
        }

    }

F-ES Sitecore

Проверьте, есть ли у переменных какие-либо допустимые данные, прежде чем добавлять их в предложение where

q = "select * from legacy where "
если (!строка.IsNullOrWhitespace(price1))
{
q = q + "price >= @price and "
}

и так далее, затем удалите любой текст "и" в конце строки, и у вас будет запрос, который содержит только то, что вас интересует. Вам также нужно будет позаботиться о том, когда нет действительных параметров и т. д.
}

1 Ответов

Рейтинг:
12

OriginalGriff

Цитата:
Я буду парамитризованный запрос позже.

Нет, нет, ты не сделаешь этого. Потому что это будет "работать", и вы перейдете к другим вещам. И в результате ваш код всегда будет уязвим для SQL-инъекций. Сначала исправьте это, а затем переходите к тому, что вы пытаетесь сделать.
И... если вы устраните проблему с фильтром без параметризации запроса, то еще меньше шансов, что вы решите ее изменить!

На самом деле, вы можете решить обе проблемы одновременно.
Что вам нужно сделать, так это: создать StringBuilder для хранения запроса по мере его сборки и список<SqlParameter> для хранения значений параметров. Добавьте целое число и установите его равным 1.
Напишите метод, который возвращает целое число и принимает int, StringBuilder, ваш список и две строки: одну с именем Condition и одну с именем Parameter
В методе проверьте параметр - если он пуст или пробел, верните целое число без изменений.
В противном случае добавьте строку условия в StringBuilder, плюс '@' и целочисленное значение. Увеличьте целое число. Создайте SQLParameter, дайте ему то же имя, которое вы только что добавили в StringBuilder, и установите его значение в качестве параметра. Добавьте его в список и верните новое целочисленное значение.
Теперь вы просто вызываете это для каждого возможного поискового запроса, а когда закончите, установите команду SQL и ее параметры.

Это намного быстрее кодировать, чем писать на английском языке!


navi G

хорошо, Хорошо, спасибо, но с этим запросом что не так ? я имею в виду, если я хочу сделать с этим запросом ?

OriginalGriff

Ты не захочешь делать это с этим запросом, поверь мне.
Если вы оставите это так, любой человек в любой точке мира может удалить вашу базу данных, просто введя поля.
Если вы оставляете его уязвимым, вам лучше привыкнуть к регулярному, всестороннему резервному копированию и восстановлению. Потому что вы потратите много времени именно на это...

navi G

и помогите мне создать этот код, как сделать его парамитризованным ? Пожалуйста, отредактируйте мой код с помощью paramitrized. пожалуйста, потому что я не знаю, как это сделать.

OriginalGriff

Нет, это твоя работа или домашнее задание, а не мое.
Это не сложно: все прописано для вас.
Попробуйте - как вы собираетесь чему-то научиться, если вы этого не делаете?

navi G

Не поможешь ли ты мне, Оригиналгрифф ?

navi G

хорошо большое спасибо Друг.............я ценю вашу помощь.

navi G

в любом случае я задам этот вопрос в своем следующем посте.