Большие проблемы с моей текущей схемой / синтаксисом и кодированием - PullRequest
0 голосов
/ 22 марта 2011

У меня есть несколько проблем: И я действительно застреваю здесь.

Хорошо, первая проблема связана с моим jquery, связанным с моей кнопкой.Функция работает, но когда она привязана к моей кнопке управления asp (Button1), я не могу по какой-то причине использовать код для обновления mysql.

<script type="text/javascript">
    $(function () {

        $('[name*= "Button2"]').click(function () {
            var x = $('[name*= "TextBox1"]').val();
            var newdiv = $("<div></div>").html(x).attr('id', 'test');

            $('#test1').append(newdiv);
            $('[name*= "Table1"]').text($('#test1').html());
            $('[name*= "TextBox1"]').val('');

            return false;

        });
    });  
</script>
<p>
    <asp:TextBox ID="TextBox1" name="TextBox1" runat="server" Rows="3" 
        Height="47px" Width="638px"></asp:TextBox>
</p>
<p>
    <asp:Button ID="Button1" runat="server" Text="Post Message" Width="98px" 
        onclick="Button1_Click" />
    <asp:Button ID="Button2" runat="server" onclick="Button2_Click" Text="Button" />
    </p>
<p>
    <asp:Table ID="Table1" name="Table1" runat="server" Width="488px"></asp:Table>
</p>

<div id="test1"></div>

</asp:Content>

Я попытался решить эту проблему, убрав return false;, это сработало вчто он сохранился в базе данных, поскольку там был ИД пользователя, но в Wallpostings было пустое поле.Это происходит из-за перезагрузки страницы, когда я нажимаю кнопку asp, что, в свою очередь, связано с java / jquery.Если я продолжаю возвращать false, я ничего не получаю в своем sql.

    {
        string theUserId = Session["UserID"].ToString();
        OdbcConnection cn = new OdbcConnection("Driver={MySQL ODBC 3.51 Driver}; Server=localhost; Database=gymwebsite; User=root; Password=commando;");
        cn.Open();

        OdbcCommand cmd = new OdbcCommand("INSERT INTO WallPosting (UserID, Wallpostings) VALUES ("+theUserId+", '" + TextBox1.Text + "')", cn);
        cmd.ExecuteNonQuery();
    }
}

Используя этот код, я могу вставить в свою базу данных, но когда я пытаюсь вставить снова, если я хочу добавить еще один комментарий к моей записи на стене, я получаюошибка: дублирующая запись '1' для ключа 'PRIMARY', поэтому я думаю, что мне нужно использовать update, но я не знаю, как выполнить обновление для синтаксиса mysql или sql?При создании схемы также указывается, что при обновлении не выполняется никаких действий (не уверен, что это одно и то же), см. Ниже сценарий)

Также обновление выполняет то же самое, что и вставка, если начинать нечегос?И если я обновлю, как мне добавить данные последовательно (не уверен, что это правильное слово), то есть, если у меня уже есть яблоки в моих Wallpostings, и я обновляю что-то новое в моем текстовом поле, например, апельсины, как мне сделать это в макете, как это:

(Wallposting Table)

| UserID | Wallpostings |
....1........Oranges
.............Apples  

Игнорировать точки (только для пробелов)

enter image description here

    SET @OLD_UNIQUE_CHECKS=@@UNIQUE_CHECKS, UNIQUE_CHECKS=0;

SET @OLD_FOREIGN_KEY_CHECKS=@@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0;

SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE='TRADITIONAL';



CREATE SCHEMA IF NOT EXISTS `gymwebsite` DEFAULT CHARACTER SET latin1 COLLATE latin1_swedish_ci ;

USE `gymwebsite` ;



-- -----------------------------------------------------

-- Table `gymwebsite`.`User`

-- -----------------------------------------------------

CREATE  TABLE IF NOT EXISTS `gymwebsite`.`User` (

  `UserID` INT NOT NULL AUTO_INCREMENT ,

  `Email` VARCHAR(245) NULL ,

  `FirstName` VARCHAR(45) NULL ,

  `SecondName` VARCHAR(45) NULL ,

  `DOB` VARCHAR(15) NULL ,

  `Location` VARCHAR(45) NULL ,

  `Aboutme` VARCHAR(245) NULL ,

  `username` VARCHAR(45) NULL ,

  `password` VARCHAR(45) NULL ,

  PRIMARY KEY (`UserID`) )

ENGINE = InnoDB;





-- -----------------------------------------------------

-- Table `gymwebsite`.`Pictures`

-- -----------------------------------------------------

CREATE  TABLE IF NOT EXISTS `gymwebsite`.`Pictures` (

  `UserID` INT NOT NULL ,

  `picturepath` VARCHAR(245) NULL ,

  PRIMARY KEY (`UserID`) ,

  INDEX `fk_Pictures_Userinfo1` (`UserID` ASC) ,

  CONSTRAINT `fk_Pictures_Userinfo1`

    FOREIGN KEY (`UserID` )

    REFERENCES `gymwebsite`.`User` (`UserID` )

    ON DELETE NO ACTION

    ON UPDATE NO ACTION)

ENGINE = InnoDB;





-- -----------------------------------------------------

-- Table `gymwebsite`.`WallPosting`

-- -----------------------------------------------------

CREATE  TABLE IF NOT EXISTS `gymwebsite`.`WallPosting` (

  `UserID` INT NOT NULL AUTO_INCREMENT ,

  `Wallpostings` VARCHAR(2500) NULL ,

  INDEX `fk_WallPostings_Userinfo1` (`UserID` ASC) ,

  PRIMARY KEY (`UserID`) ,

  CONSTRAINT `fk_WallPostings_Userinfo1`

    FOREIGN KEY (`UserID` )

    REFERENCES `gymwebsite`.`User` (`UserID` )

    ON DELETE NO ACTION

    ON UPDATE NO ACTION)

ENGINE = InnoDB;





-- -----------------------------------------------------

-- Table `gymwebsite`.`DietPlan`

-- -----------------------------------------------------

CREATE  TABLE IF NOT EXISTS `gymwebsite`.`DietPlan` (

  `UserID` INT NOT NULL ,

  PRIMARY KEY (`UserID`) ,

  INDEX `fk_DietPlan_Userinfo1` (`UserID` ASC) ,

  CONSTRAINT `fk_DietPlan_Userinfo1`

    FOREIGN KEY (`UserID` )

    REFERENCES `gymwebsite`.`User` (`UserID` )

    ON DELETE NO ACTION

    ON UPDATE NO ACTION)

ENGINE = InnoDB;





-- -----------------------------------------------------

-- Table `gymwebsite`.`WorkoutPlan`

-- -----------------------------------------------------

CREATE  TABLE IF NOT EXISTS `gymwebsite`.`WorkoutPlan` (

  `UserID` INT NOT NULL ,

  PRIMARY KEY (`UserID`) ,

  INDEX `fk_WorkoutPlan_Userinfo1` (`UserID` ASC) ,

  CONSTRAINT `fk_WorkoutPlan_Userinfo1`

    FOREIGN KEY (`UserID` )

    REFERENCES `gymwebsite`.`User` (`UserID` )

    ON DELETE NO ACTION

    ON UPDATE NO ACTION)

ENGINE = InnoDB;





-- -----------------------------------------------------

-- Table `gymwebsite`.`Friends`

-- -----------------------------------------------------

CREATE  TABLE IF NOT EXISTS `gymwebsite`.`Friends` (

  `idFriends` INT NOT NULL AUTO_INCREMENT ,

  `UserID` INT NOT NULL ,

  PRIMARY KEY (`idFriends`, `UserID`) ,

  INDEX `fk_Friends_Userinfo1` (`UserID` ASC) ,

  CONSTRAINT `fk_Friends_Userinfo1`

    FOREIGN KEY (`UserID` )

    REFERENCES `gymwebsite`.`User` (`UserID` )

    ON DELETE NO ACTION

    ON UPDATE NO ACTION)

ENGINE = InnoDB;







SET SQL_MODE=@OLD_SQL_MODE;

SET FOREIGN_KEY_CHECKS=@OLD_FOREIGN_KEY_CHECKS;

SET UNIQUE_CHECKS=@OLD_UNIQUE_CHECKS;

Что я могу пытаться сделать, это обновить, но в то же время вставить?Если это имеет какой-то смысл?

Ответы [ 2 ]

4 голосов
/ 22 марта 2011
  1. "вернуть ложь";в вашем js это все равно, что сказать 'protectDefault ()', это предотвращает запуск следующего кода (и не дает браузеру публиковать формы и следующие ссылки и т. д.).В этом случае он не позволяет коду ASP.net выполнять обратную передачу, и это не позволяет вашему серверному коду выполнять ваш оператор SQL.Вам необходимо удалить эту возвращаемую ложную строку.

Обновление: динамическое содержимое исчезает, поскольку для обновления SQL требуется обратная передача.Это означает, что страница перерисовывается с нуля, и все изменения, сделанные с помощью jQuery, исчезают.Чтобы исправить это, вам нужно либо выполнить AJAX-вызов для запуска кода на стороне сервера, либо удалить функцию JS и написать некоторый код на стороне сервера для отображения div после выполнения вызова SQL.

  1. UserIdне должен быть первичным ключом для таблицы WallPosting, он должен быть только первичным ключом для таблицы User.Вы должны создать новое поле с автоматическим приращением под названием WallPostingId, и это позволит вам иметь несколько WallPostings для каждого пользователя (делайте это и с другими таблицами, очевидно, изменяя имя поля, чтобы оно подходило для каждой таблицы), затем вы можете отсортироватьих по CreatedDate (еще одно полезное поле).Можно использовать UserId в качестве ограничения внешнего ключа в других таблицах, но это только подтверждает, что любой заданный UserId существует.

Ваша команда ODBC уязвима для атаки SQL-инъекций! Aхитрый пользователь может использовать такую ​​команду, чтобы взять под контроль вашу базу данных, потенциально украсть, повредить и уничтожить данные для других пользователей.

Вы не должны использовать конкатенацию строк (например, «Вставить ...» + UserText +«...») для построения команд SQL.Я бы предложил создать хранимые процедуры или операторы Linq для каждой или ваших операций с данными, которые имеют дело с данными, созданными пользователем.Подумайте об этом, что если я введу это в текстовое поле:

');выпадающий стол Пользователь;-

2 голосов
/ 22 марта 2011

Глядя на вашу схему, похоже, что в вашей таблице WallPosting идентификатор пользователя определен как первичный ключ.Вы не можете вставить в эту таблицу еще одну запись с повторяющимся первичным ключом, поскольку ваш первичный ключ должен быть уникальным в таблице.Вашему столу на стене требуется другой первичный ключВаша схема будет выглядеть примерно так (WallPostingId, UserId, Wallposting) с первичным ключом WallPostingId.

Во-вторых, обновление не будет вставлять запись, если ее не существует - вставка и обновление - это две разные операции.Похоже, вы ищете "upsert" - в основном, оператор обновления, если rowcount == 0, то операция вставки.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...