Ⅰ 求助!使用mysql觸發器(其他也可)實現一條插入語句在同表中添加兩條數據。
好像 MySQL 的觸發器, 插入/刪除自己這個表 會 導致 MySQL 發生異常。
方案1:
因此, 你這個情況, 可以嘗試, 創建一個存儲過程。
這個存儲過程, 接受2個參數, 例如 uid1, uid2
然後存儲過程內部, 插入2行數據。
外部程序 例如 php 什麼的, 通過調用這個存儲過程, 調用1次, 插入2行數據。
方案2:
另外折騰一個表, 叫 friend_all
向 friend 表插入1行數據的時候, 自動向 friend_all 表, 插入 2行數據。
這樣最終, 你查詢數據的時候, 簡單查詢 friend_all 表 即可。
Ⅱ PHP調用mysql的問題,求高人
1、你的$sql = "select * from jianjie";前面有個}看到沒,那個是if的結束,無論你前面怎麼樣,運行到$sql = "select * from jianjie";這一行,sql都會賦 值成這個字元串,你再echo 當然就是select * from jianjie
2、不是所有對象都能用echo顯示的,比如象$result這種結果集,把echo $result這一行注釋掉或者刪掉就算地了。
Ⅲ php 怎麼調用,mysql 存儲過程 exec,煩死了
1。執行callprocere()語句。
也就是mysql_query("callproceer([var1]...)");
2.如果有返回值,執行select@ar,返回執行結果。
mysql_query("select@var)"
接下來的操作就和php執行一般的mysql語句一樣了。可以通過mydql_fetch_row()等函數獲得結果。
如果時函數。直接執行selectfunction()就可以了。
$host="localhost";
$user="root";
$password="11212";
$db="samp_db";
$dblink=mysql_connect($host,$user,$password)
ordie("can'tconnecttomysql");
mysql_select_db($db,$dblink)
ordie("can'tselectsamp_db");
$res=mysql_query("set@a=$password",$dblink);
$res=mysql_query("callaa(@a)",$dblink);
$res=mysql_query("select@a",$dblink);
$row=mysql_fetch_row($res);
echo$row[0];
Ⅳ mysql中的存儲過程、觸發器、視圖的用法
建立存儲過程
Create procere、Create function
下面是它們的格式:
Create proceresp_Name ([proc_parameter ])
routine_body
這里的參數類型可以是 IN OUT INOUTT ,意思和單詞的意思是一樣的,IN 表示是傳進來的參數,
OUT 是表示傳出去的參數,INOUT 是表示傳進來但最終傳回的參數。
Create functionsp_Name ([func_parameter ])
Returns type
Routine_body
Returns type 指定了返回的類型,這里給定的類型與返回值的類型要是一樣的,否則會報錯。
下面給出兩個簡單的例子來說明:
1、 顯示 Mysql 當前版本
執行結果
mysql> use welefen;
Database changed
mysql> delimiter // #定義//作為結束標記符號
mysql> create procere getversion(out param1 varchar(50)) #param1為傳出參數
-> begin
-> select version() into param1; #將版本的信息賦值給 param1
-> end
-> //
Query OK, 0 rows affected (0.00 sec)
mysql> call getversion(@a); #調用getversion()這個存儲過程
-> //
Query OK, 0 rows affected (0.00 sec)
mysql> select @a;
-> //
+--------------------------+
| @a |
+--------------------------+
| 5.1.14-beta-community-nt |
+--------------------------+
1 row in set (0.00 sec)
2、 顯示」hello world」
執行結果
mysql> delimiter //
mysql> create function display(w varchar(20)) returns varchar(50)
-> begin
-> return concat('hello 『,w);
-> end
-> //
Query OK, 0 rows affected (0.05 sec)
mysql> select display("world");
-> //
+------------------+
| display("world") |
+------------------+
| hello world |
+------------------+
1 row in set (0.02 sec)
其他操作存儲過程的語句
前面我們已經知道了怎麼創建存儲過程,下面看看其他常用的用於操作存儲過程的語句。
Alter {procere | function} sp_Name []
Alter 語法是用來改變一個過程或函數的特徵,當你想改變存儲過程或者函數的結構時可以使
用它。當然你也可以先 drop 它再 create。
Drop {procere | function} [if exists] sp_Name
Drop 語法即用來刪除一個存儲程序或者函數,當你創建的一個存儲過程或者函數的名字已經存
在時,你想把以前的給覆蓋掉,那麼此時你就可以使用 drop ,然後在創建。
Show create {procere | function } sp_Name
Show 語法用來顯示創建的存儲過程或者函數的信息。這里的 show 用法跟數據表中的 show 用
法是很相似的。
Show {procere | function} status [like 'partten']
它返回子程序的特徵,如資料庫,名字,類型,創建者及創建和修改日期。如果沒有指定樣式,
根據你使用的語句,所有存儲程序和存儲函數的信息都被列出。
看了以上的幾個語法,你是不是感覺跟對表的操作很相象,那你就想對了,他們確實是很相似
的。帶著一份激動心情我們繼續往下看,你會發現很簡單。
Begin ... End 語句
通過 begin end 可以來包含多個語句,每個語句以「;」結尾。
Declare
用Declare 來聲明局部變數
Declarevar_Name type defaulevaule
Delare 條件
Declarecondition_Name CONDITION FOR condition_value
調用存儲過程
Call
格式:
Callsp_Name [parameter ]
這里的 sp_Name 必須是由 create procere 創建的名稱。它可以通過聲明的參數來傳回值,
它也返回受影響的行數,在 MySQL 中可以通過 mysql_affected_rows() 來獲得。
流程式控制制語句
IF 語句
IFsearch_condition THENstatement_list
[ELSEIFsearch_condition THENstatement_list]
[ELSEstatement_list]
END IF
CASE 語句
CASE case_value
WHEN when_value THENstatement_list
WHEN when_value THENstatement_list]
ELSEstatement_list]
END CASE
LOOP 語句
[begin_label:] LOOP
statement_list
END LOOP [end_label]
LOOP 實現了一個簡單的循環,通過 LEAVE 來退出
LEAVE 語句
LEAVE lable
退出語句,一般可以用在循環中。
ITERATE 語句
ITERATE lable
ITERATE 一般出現在 LOOP、REPEATE、WHILE 里,意思是再次循環。
REPEATE 語句
[begin_label:] REPEAT
statement_list
UNTILsearch_condition
END REPEAT [end_label]
REPEAT 語句內的語句或語句群被重復,直至 search_condition 為真。
WHILE 語句
[begin_label:] WHILEsearch_condition DO
statement_list
END WHILE [end_label]
WHILE 語句內的語句或語句群被重復,直至 search_condition 為真。
運用實例
下面通過幾個例子來講述他們的應用:
對網站用戶的操作
為了簡單,用戶表只有用戶名和密碼的信息.在服務端,我們建立如下的表:
代碼片段
Drop table if exists user;
Create table user(
Id int unsigned not null auto_increment,
Name varchar(20) not null,
Pwd char(32) not null,
Primary key(Id)
);
添加用戶的存儲過程:
代碼片段
Delimiter //
Create procere insertuser(in username varchar(20),in userpwd varchar(32))
Begin
Insert into welefen.user(Name,Pwd) values (username,md5(userpwd));
End
//
驗證用戶的存儲過程:
代碼片段
Delimiter //
Create procere validateuser(in username varchar(20),out param1)
Begin
Select Pwd into param1 from welefen.user where Name=username;
End
//
修改密碼的存儲過程:
代碼片段
Delimiter //
Create procere modifyPwd(in username varchar(20),in userpwd varchar(32))
Begin
Update welefen.user set Pwd=md5(userpwd) where Name=username;
End
//
刪除用戶的存儲過程:
代碼片段
Delimiter //
Create procere deleteuser(in username varchar(20))
Begin
delete from welefen.user where Name=username;
End
//
在客戶端,我們給出如下的程序:
代碼片段
文件名:ProcereUser.php
<?php
if (!mysql_connect("localhost","root","welefen")){
echo "連接資料庫失敗";
}
if (!mysql_select_db("welefen")){
echo "選擇資料庫表失敗<br>";
}
$insert_user=array("welefen","welefen");//這里的welefen分別為用戶名、密碼
if (mysql_query("call insertuser('$insert_user[0]','$insert_user[1]')")){
echo "添加用戶$insert_user[0]成功<br>";
}else {
echo "添加用戶$insert_user[0]失敗<br>";
}
$validate_user=array("welefen","welefen");//這里的welefen分別為用戶名、密碼
mysql_query("call validateuser('$validate_user[0]',@a)");
$Pwd=mysql_query("select @a");
$result=mysql_fetch_array($Pwd);
if ($result[0]==md5($validate_user[1])){
echo "用戶$validate_user[0]驗證正確<br>";
}else {
echo "用戶$validate_user[0]驗證錯誤<br>";
}
$modify_Pwd=array("welefen","weilefeng"); //welefen為用戶名weilefeng為新密碼
if (mysql_query("call modifyPwd('$modify_Pwd[0]','$modify_Pwd[1]')")){
echo "用戶$modigy_Pwd[0]的密碼修改成功<br>";
}else {
echo "用戶$modigy_Pwd[0]的密碼修改失敗<br>";
}
$delete_user=array("welefen"); //welefen為用戶名
if (mysql_query("call deleteuser('$delete_user[0]')")){
echo "用戶$delete_user[0]刪除成功<br>";
}else {
echo "用戶$delete_user[0]刪除失敗<br>";
}
?
程序運行的結果:
執行結果
添加用戶welefen 成功
用戶welefen 驗證正確
用戶welefen 的密碼修改成功
用戶welefen 刪除成功
以上的這個程序簡單的說明了Mysql 中的存儲過程結合PHP 的應用,當然在實際應用要比這個
復雜的多。
驗證角谷猜想
角谷猜想:給定一個整數x,若x%2=1,則x=3*x+1,否則x=x/2,如此循環下去,經過有限步驟必
能得到1。
例 如 : 初 始 整 數 為 9 , 則
9->28->14->7->22->11->34->17->52->26->13->40->20->10->5->16->8->4->2->1
為了說明存儲過程中一些語法的應用,我們通過存儲過程來實現它:
執行結果
mysql> delimiter //
mysql> create procere jgguess(in number int)
-> begin
-> declare param1 int default 1;
-> set @a=concat(number);
-> jiaogu:loop #循環開始
-> set param1=number%2;
-> if param1=1 then set number=number*3+1; #number 為奇數,將它乘3加 1
-> else set number=number/2;
-> end if;
-> set @a=concat(@a,'->',number);
-> if number>1 then iterate jiaogu; #number 不為 1,繼續循環
-> end if;
-> leave jiaogu; #退出循環
-> end loop jiaogu;
-> end
-> //
Query OK, 0 rows affected (0.00 sec)
mysql> call jgguess(11);
-> //
Query OK, 0 rows affected (0.00 sec)
mysql> select @a//
+-------------------------------------------------------+
| @a |
+-------------------------------------------------------+
| 11->34->17->52->26->13->40->20->10->5->16->8->4->2->1 |
+-------------------------------------------------------+
1 row in set (0.02 sec)
在這個存儲過程中,你傳入的參數不能超過int 型數據的范圍,否則就會報錯。
觸發器
觸發器是與表有關的命名資料庫對象,當表上出現特定事件時,將激活該對象。例如當我們向
某個表插入一行數據時發生一個事件或者刪除某個記錄時觸發某個事件。
語法:
CREATE TRIGGER trigger_Name trigger_time trigger_event
ON tbl_Name FOR EACHROW trigger_stmt
trigger_time 是觸發器的動作時間。它可以是 BEFORE 或 AFTER ,以指明觸發器是在激活它的
語句之前或之後觸發。
trigger_event 指明了激活觸發器的語句的類型。trigger_event 可以是下述值之一:
INSERT:將新行插入表時激活觸發器,例如,通過 INSERT、LOADDATA 和 REPLACE 語句;
UPDATE:更改某一行時激活觸發器,例如,通過UPDATE語句;
DELETE:從表中刪除某一行時激活觸發器,例如,通過 DELETE 和 REPLACE 語句。
例如當我們向上面的user 表中增加一個用戶名為「welefen 」時,我們把記錄用戶數的表的值增
加 1;
代碼片段
Create table numuser(
Num int not null default 0
);
Delimiter //
Create trigger testnum after insert on welefen.user for each row
Begin
Update welefen.numuser set Num=Num+1;
End
//
視圖
當我們想得到數據表中某些欄位的信息,並想把他們保存時我們就可以用視圖。
語法:
CREATE [OR REPLACE] [ALGORITHM = {UNDEFINED | MERGE | TEMPTABLE}]
VIEW view_Name [(column_list)]
AS select_statement
[WITH [CASCADED | LOCAL] CHECK OPTION]
例如我們想對上面的用戶表使用視圖,可以這樣:
Create viewwelefen.userview as select * fromwelefen.user;
查看視圖的信息可以使用:
Select * fromwelfen.userview;
Ⅳ php 怎麼實現mysql觸發器效果
1231231231231231312
觸發器
1. 什麼是觸發器
觸發器是一種特殊類型的存儲過程,不由用戶直接調用。創建觸發器時會對其進行定義,以便在對特定表或列作特定類型的數據修改時執行。
觸發器從本質上來說,是一個存儲過程,但是它與普通的存儲過程不一樣的地方在於,普通的存儲過程是通過CALL方法進行調用的,而觸發器不是用CALL調用,觸發器是在我們提前設定好的事件出現以後,自動被調用的。
2.為什麼要用觸發器
我們在MySQL 5.0中包含對觸發器的支持是由於以下原因:
(1)MySQL早期版本的用戶長期有需要觸發器的要求。
(2)我們曾經許諾支持所有ANSI標準的特性。
(3)您可以使用它來檢查或預防壞的數據進入資料庫。
(4)您可以改變或者取消INSERT, UPDATE以及DELETE語句。
(5)您可以在一個會話中監視數據改變的動作。在這里我假定大家都讀過"MySQL新特性"叢書的第一集--"MySQL存儲過程",那麼大家都應該知道MySQL至此存儲過程和函數,那是很重要的知識,因為在觸發器中你可以使用在函數中使用的語句。特別舉個例子:
①復合語句(BEGIN / END)是合法的.
②流控制(Flow-of-control)語句(IF, CASE, WHILE, LOOP, WHILE, REPEAT, LEAVE,ITERATE)也是合法的.
③變數聲明(DECLARE)以及指派(SET)是合法的.
④允許條件聲明.
⑤異常處理聲明也是允許的.
⑥但是在這里要記住函數有受限條件:不能在函數中訪問表.
因此在函數中使用以下語句是非法的。
ALTER 'CACHE INDEX' CALL COMMIT CREATE DELETE
DROP 'FLUSH PRIVILEGES' GRANT INSERT KILL
LOCK OPTIMIZE REPAIR REPLACE REVOKE
ROLLBACK SAVEPOINT 'SELECT FROM table'
'SET system variable' 'SET TRANSACTION'
SHOW 'START TRANSACTION' TRUNCATE UPDATE
在觸發器中也有完全一樣的限制.觸發器相對而言比較新,因此會有(bugs)缺陷.所以我在這里給大家警告,就像我在存儲過程書中所說那樣.不要在
含有重要數據的資料庫中使用這個觸發器,如果需要的話在一些以測試為目的的資料庫上使用,同時在你對表創建觸發器時確認這些資料庫是默認的。
2.1 觸發器的主要用途
觸發器主要用於在多個有相互關系的表之間,做一些相互關聯的操作。
2.2 臨時表
更新:更新是用一條新的數據 替換一條舊的數據。在系統中,更新操作分為以下2個步驟:
(1)首先,把舊的數據刪掉
(2)把新的數據插入表中。
在進行以上兩個步驟之前,系統又進行了3個步驟:
(1) 系統創建兩張臨時表,臨時表與要操作的表的結構完全相同,僅是結構相同,但是臨時表中並無數據。
(2) 系統向其中一張臨時表插入要更新的數據,
(3) 系統把要刪除的,即要被更新的數據,插入另外一張臨時表當中。
2.2.1 臨時表的叫法:
NEW:用來插入新數據的臨時表
OLD:數據要被替換的臨時表
2.2.2 臨時表的使用
NEW 列名獲取插入值
2.2.3 使用不同的語句與使用臨時表的關系
使用UPDATA語句:可以使用NEW和OLD兩張臨時表
使用INSERT語句:只能使用NEW臨時表
使用DELETE語句:只能使用OLD臨時表
Ⅵ 如何用php調用mysql中的數據
大概的基本流程如下:
連接資料庫,再加一個判斷。
選擇資料庫
讀取表
輸出表中數據
下面是代碼:
<?php
$con
= mysql_connect("localhost","root","abc123");
/*
localhost
是伺服器
root
是用戶名 abc123
是密碼*/
if
(!$con)
{
die("資料庫伺服器連接失敗");
}
/* 這就是一個邏輯非判斷,如果錯誤就輸出括弧里的字元串
*/
@mysql_select_db("a", $con);
/* 選擇mysql伺服器里的一個資料庫,假設你的資料庫名為 a*/
$sql = "SELECT * FROM
qq";
/*
定義變數sql, "SELECT * FROM qq"
是SQL指令,表示選取表qq中的數據 */
$result
= mysql_query($sql);
//執行SQL語句,獲得結果集
/*下面就是選擇性的輸出列印了,由於不清楚你的具體情況給你個表格列印吧*/
//列印表格
echo
"<table
border=1>";
while(
$row
=
mysql_fetch_array($result)
)
/*逐行獲取結果集中的記錄,得到數組row */
{
/*數組row的下標對應著資料庫中的欄位值 */
$id
=
$row['id'];
$name
=
$row['name'];
$sex
=
$row['sex'];
echo
"<tr>";
echo
"<td>$id</td>";
echo
"<td>$name</td>";
echo
"<td>$sex</td>";
echo
"</tr>";
}
echo
"<table
/>";
?>
如果你的switch是表頭,就定義這個表頭欄位,然後輸出。
你可以去後盾人平台看看,裡面的東西不錯
Ⅶ mysql 觸發器 代碼放在哪裡。有點不是很明白。是放到PHP代碼裡面還是什麼地方謝謝
這個是mysql內部的代碼,直接在mysql里創建就可以了,可以通過phpmyadmin創建添加到mysql指定庫中
Ⅷ php mysql 定時每天凌晨3點執行刪除數據任務
mysql定時任務
自 MySQL5.1.6起,增加了一個非常有特色的功能–事件調度器(Event Scheler),可以用做定時執行某些特定任務(例如:刪除記錄、對數據進行匯總等等),來取代原先只能由操作系統的計劃任務來執行的工作。更值得 一提的是MySQL的事件調度器可以精確到每秒鍾執行一個任務,而操作系統的計劃任務(如:linux下的CRON或Windows下的任務計劃)只能精 確到每分鍾執行一次。對於一些對數據實時性要求比較高的應用(例如:股票、賠率、比分等)就非常適合。
如:每隔30秒將執行存儲過程test,將當前時間更新到examinfo表中id=14的記錄的endtime欄位中去.
CREATE PROCEDURE test ()
BEGIN
update examinfo SET endtime = now() WHERE id = 14;
END;
create event if not exists e_test
on schele every 30 second
on completion preserve
do call test();
2. windows、linux 的定時任務 這個就不舉例了,通過腳本定時去調用mysql執行