2017-10-06 57 views
0

我有一个PHP脚本,从一个窗体记录输入到MySQL数据库表。我正在寻找一种方法来插入这些数据,直到3行被创建,之后它必须更新现有的行,以便第一个更新到新的输入,第二个更新到前一个输入,第三个更新到前者的第二个输入。MySQL插入和更新表,最大3

表:

CREATE TABLE IF NOT EXISTS inputlog (
    id int(11) NOT NULL auto_increment, 
    userid int(11) NOT NULL default '0', 
    name text, 
    value text, 
    PRIMARY KEY (id) 
) ENGINE=MyISAM DEFAULT CHARSET=latin1;` 

前三行我使用:

insert into inputlog (userid,name,value) values('$userid','$name','$value') 

之后即有可能成为:

update inputlog set value = '$value' where userid = '$userid' and name = '$name' 

它必须更新所有的连续行。

我该如何做到这一点?

+2

**警告**:这有一些严重的[SQL注入漏洞](http://bobby-tables.com/),因为用户数据在查询中使用。尽可能使用**准备好的陈述**。这些在['mysqli'](http://php.net/manual/en/mysqli.quickstart.prepared-statements.php)和[PDO](http://php.net/manual/)中很简单en/pdo.prepared-statements.php)其中任何用户提供的数据都是用'?'或':name'指示符指定的,后者使用'bind_param'或'execute'填充,具体取决于您使用的是哪一个。 **绝不**将'$ _POST','$ _GET'或任何用户数据直接放入您的查询中。 – tadman

+0

不要使用单引号''''作为变量,而是使用双引号来代替'“”',除非你使用像'$ query =“INSERT ....”这样的主要查询“;那么单引号就可以。 – AXAI

+0

你也应该尽可能避免使用脆弱的,过时的MyISAM引擎。 InnoDB应该是你的默认设置。同样,如果这很实用,则使用'utf8'或'utf8mb4'进行编码,因为'latin1'的限制性很强。 – tadman

回答

0

太长的意见,所以...

看起来像你想,因为你想要的数据用ID进行排序,以在你的表中只有3行。所以id = 1将是最新值,然后id = 2,最后id = 3。

总之,不要这样做,id字段可以是任何值。不要为此编码。如果您将另一个表中的id用作外键,则危险是您将失去参照完整性。我建议的是:

  • 为每行添加一个时间戳列。
  • 你插入一个新的值时,都会设置时间戳列NOW()
  • 当选择,排序上的时间戳和限制3个结果

如果您必须只有3行,你可以然后删除除最近3个时间戳之外的行。


但是......如果你必须这样做......

  • 执行SELECT与第2行
  • 截断表(删除所有行)
  • 插入新行,然后存储的2行

然后你会按照你想要的顺序排列3行。但是,如果没有看到整个推理为您的应用程序,我的“蜘蛛感觉”告诉我,你将在稍后撞墙......


,并检查其他的事情担心了意见。