2017-10-06 96 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行。但是,如果沒有看到整個推理爲您的應用程序,我的「蜘蛛感覺」告訴我,你將在稍後撞牆......


,並檢查其他的事情擔心了意見。