【问题标题】:Big problems with my current schema/syntax and coding我当前的架构/语法和编码存在大问题
【发布时间】:2011-03-22 17:08:43
【问题描述】:

我有几个问题:我真的被困在这里了。

好的,第一个问题是我的 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; 来解决这个问题,因为它确实保存到数据库中,因为用户 ID 在那里,但 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();
    }
}

使用此代码我可以插入到我的数据库中,但是当我尝试再次插入时,如果我想在墙上的帖子上添加另一条评论,我收到一个错误:键 'PRIMARY' 的重复条目 '1' 所以我想我需要使用更新,但我不知道如何更新 mysql 或 sql 语法?它还说,当我创建架构时,更新时没有任何操作(不确定这是否是同一件事)请参阅下面的脚本)

如果没有任何东西开始,更新是否也与插入做同样的事情?如果我更新我如何按顺序添加数据(不确定那是正确的词),即如果我的 Wallpostings 中已经有苹果并且我在我的文本框中更新了一些新的东西,比如橘子,我如何让它像这样布局:

(Wallposting Table)

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

忽略点(仅用于间距)

    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;

我可能想做的是更新但同时插入?如果那有意义的话?

【问题讨论】:

    标签: c# jquery asp.net mysql sql


    【解决方案1】:
    1. “返回假;”在您的 js 中就像说 preventDefault(),它会阻止进一步的代码运行(并且它会阻止浏览器发布表单和跟踪链接等)。在这种情况下,它会阻止 ASP.net 代码执行回发,从而阻止服务器端代码运行 SQL 语句。您需要删除该 return false 行。

    更新:您的动态内容消失了,因为您需要回发来执行 SQL 更新。这意味着页面会从头开始重新绘制,并且您使用 jQuery 所做的所有更改都会消失。要更正此问题,您需要进行 AJAX 调用以运行服务器端代码,或者删除 JS 函数并编写一些服务器端代码以在进行 SQL 调用后显示 div。

    1. UserId 不应该是 WallPosting 表的主键,它应该只是 User 表的主键。您应该创建一个名为 WallPostingId 的新自动递增字段,这将允许您为每个用户拥有多个 WallPostings(也可以对其他表执行此操作,显然更改字段名称以适合每个表),然后您可以排序它们由 CreatedDate (另一个有用的领域)。可以在其他表中将 UserId 作为外键约束,但这只是验证任何给定的 UserId 是否存在。

    您的 ODBC 命令容易受到 SQL 注入攻击! 狡猾的用户可能会使用这样的命令来控制您的数据库,从而可能会窃取、破坏和破坏其他用户的数据。

    您不应该使用字符串连接(例如“Insert ...” + UserText + “...”)来构建 SQL 命令。我建议为每个处理用户创建的数据的数据操作创建存储过程或 Linq 语句。想一想,如果我在文本框中输入这个会怎样:

    ‘);删除表用户; --

    【讨论】:

    • 我认为这可能会解决我的问题。您在 return false 行上的权利,但我将其设置为这样,因此我可以看到添加到页面的动态 html 内容,但是您错过了我说的为什么当我将其拿走时表格中没有显示任何内容?我得到的只是设置了用户 ID,但没有数据。
    • @Garrith:我已经更新了我的答案来解释发生了什么,我的建议是在服务器端实现它。
    • 是的,我很害怕,不确定我是否知道如何从 sql 中检索并将人们在文本框中写入的内容发送回 html 内容。
    【解决方案2】:

    查看您的架构,您的 WallPosting 表似乎将 UserId 标识为主键。您不能使用重复的主键将另一条记录插入到该表中,因为无论您的主键是什么,都必须在表中是唯一的。您的墙贴表需要不同的主键;您的架构看起来类似于 (WallPostingId, UserId, Wallposting),其中 WallPostingId 是主键。

    其次,如果不存在记录,更新将不会插入记录 - 插入和更新是两个不同的操作。听起来您正在寻找“upsert” - 基本上是一个更新语句,如果 rowcount == 0,则插入操作。

    【讨论】:

      猜你喜欢
      • 2013-11-17
      • 2013-10-13
      • 1970-01-01
      • 2022-11-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多