2015-04-24 18 views
-1

我在PhpMyadmin中有一個表,它具有一個採用url值的列。我不想從PHP代碼/前端進行驗證。我如何使用觸發器/過程來實現這一點?我想下面的觸發器,但得到的錯誤:「#1241操作數應包含3列(S)」用於驗證Mysql表中的URL列值的觸發器

CREATE TRIGGER `validate_url_after_insert` BEFORE INSERT ON `table_name` 

FOR EACH ROW BEGIN 

DECLARE str1 varchar(10); 

DECLARE str2 varchar(10); 

SET str1='http://'; 

SET str2='https://'; 

if(substring_index(substring_index(substring_index(REPLACE(new.url,str2,str1), '/',3),str1,-1),'.',-1) != 'com',substring_index(substring_index(substring_index(REPLACE(new.url,str2,str1), '/',3),str1,-1),'.',-3),substring_index(substring_index(substring_index(REPLACE(new.url,str2,str1), '/',3),str1,-1),'.',-2)) != '' then 

SIGNAL SQLSTATE '45000' 
SET MESSAGE_TEXT = 'Can not insert'; 

END IF; 

END 
+0

您以前曾嘗試過哪些方法,哪些方法不適合您?你爲什麼不想用PHP進行驗證(這是服務器端,而不是前端)?如果你確實需要(用於某些奇怪的需求)在MySQL中進行驗證,請查看MySQL正則表達式(https://dev.mysql.com/doc/refman/5.1/en/regexp.html)和觸發器(http: //dev.mysql.com/doc/refman/5.7/en/create-trigger.html)並將它們一起使用。注:我添加這個作爲評論,因爲我不認爲它實際上提供了一個完整的答案。 – gabe3886

+0

Seconding gabe3886的評論。驗證屬於中間層PHP代碼。儘可能避免數據庫層中的數據驗證(參照完整性之外)。 –

+1

我不想做前端驗證。即在從用戶那裏獲得輸入時。在PHP代碼插入到我的數據庫時,甚至不想進行驗證。我希望它在mysql /後端得到驗證 –

回答

3

好吧,我得到了我對我自己的答案。

  CREATE TRIGGER `validate_work_url` BEFORE INSERT ON `table_name` 
      FOR EACH ROW BEGIN 
      IF new.url REGEXP "^(https?://|www.)[.A-Za-z0-9-]+.[a-zA-Z]{2,4}" THEN 
       SET new.url = new.url; 
      ELSE 
      SIGNAL SQLSTATE '45000' 
           SET MESSAGE_TEXT = "INCORRECT URL" ; 
      END IF; 
      END