почему этот код не будет работать

#asp.net #mysql

#asp.net #mysql

Вопрос:

я настроил редактор для ввода его содержимого в базу данных, а затем я могу повторно просмотреть, отредактировать его и сохранить снова, и вот что я использовал:

 string user = Page.User.Identity.Name;

    MySqlConnection conn = new MySqlConnection(@"connection string;");
    MySqlCommand cmd = new MySqlCommand("UPDATE copy SET cv='"   '"'   Editor1.Content.Replace("'", "''")   '"'   "' WHERE id = '"   user   "' ", conn);

    conn.Open();
    cmd.ExecuteNonQuery();

    conn.Close();
  

вставка и выбор работают нормально, а обновление — нет, оно не выдает ошибок, но оно просто не изменяет содержимое (независимо от того, что я изменяю, оно всегда остается тем же содержимым);

я знаю, что это открыто для sql-инъекции, и я должен переключиться на параметризованный запрос, и я сделаю именно это после того, как все заработает

я использую asp.net 3.5, mysql 5.0

я определил проблему и задаю новый вопрос по ней спасибо всем за вашу помощь

Комментарии:

1. Ага… Чувствуем запах внедрения кода , не так ли?

2. пожалуйста, поставьте точку останова и скажите мне, является ли Editor1.Content обновленное значение, которое вы хотите, и сообщите мне значение `user`.

3. @just_name я попробовал точку останова, и по какой-то причине содержимое редактора всегда пустое, хотя в нем есть содержимое

Ответ №1:

Не имеет значения, почему это не работает, это просто неправильно.

Вы широко открыты для атак с использованием SQL-инъекций, и это должно быть вашей первой заботой.

Вы исправляете это, используя вместо этого параметры, что-то вроде этого:

 MySqlCommand cmd = new MySqlCommand("UPDATE copy SET cv=?cv WHERE id = ?id", conn);
cmd.Parameters.AddWithValue("cv", Editor1.Content);
cmd.Parameters.AddWithValue("id", user);
  

Комментарии:

1. спасибо, я на самом деле собираюсь переключиться на параметризованный запрос, но после того, как у меня все заработает

2. Вы на самом деле используете строку подключения, как показано? ie. внутри строки?

3. Почему бы вам не попробовать параметризованный способ сейчас и посмотреть, не поможет ли это также волшебным образом решить ваши проблемы?

4. нет, «строка подключения» заменена на фактическую, и она протестирована, и хорошо, я попробую

5. Вы получаете какие-либо ошибки, исключения, еще много чего? Кроме того, что возвращает ExecuteNonQuery? Он должен возвращать количество измененных строк. Возвращает ли он 0, или 1, или что?

Ответ №2:

ExecuteNonQuery должен возвращать количество выполненных строк, имея это в виду, вы можете отладить код. можете ли вы написать sql statment, который вы создаете, в string, чтобы мы могли вам помочь?

кроме того, первое, что приходит на ум, это то, что id = ‘user’ может быть неправильным, id предполагает целое число, но name выглядит как строковое значение.

Комментарии:

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