2016年9月21日 星期三

如何在MySQL的程式中中止程序?

如果是 Stored Function,可以使用 return expr

而 procedure. trigger, event 則要用 leave

CREATE PROCEDURE SP_Reporting(IN tablename VARCHAR(20))
proc_label:BEGIN
     IF tablename IS NULL THEN
          LEAVE proc_label;
     END IF;

     #proceed the code

END;

2016年9月15日 星期四

關於 mysql #1442 cannot update table "xxx" in Store function/trigger .....

MySQL 裡有在使用 Stored Function/Trigger 的,大概都會碰到過 #1422 這個Error.

今天記錄一下我的狀況:

我寫了一個 Procedure ,其中有一段

UPDATE table1 SET  field1=....., field2=....., WHERE .....
其中一個 field = (SELECT mem_id FROM members WHERE xxxx=xxxxx)

這裡呼叫了 members 這個 table,
而 UPDATE 的 table1 裡面的 Trigger,又有一段
UPDATE members SET xxx=xxxxx......

所以,此時,就產生了 #1422的Error!

也就是說,我在一個 UPDATE Statement 中呼叫了members 的 SELECT ,而在 該UPDATE中又啟動 trigger 又去 UPDATE members ,

而 #1422 的基本錯誤就是:不能在 自己的 trigger 中又要去 update自己!

一般而言,這是 對自己的 table

而我上述的例子,不是自己的 table, 而是有引用到的 另一個 table。我一直在自己的table中找不到錯誤,後來經朋友幫忙看,才發現是 用到的另一個table members的問題!

記錄在這裡,留給自己參考,如果剛好有緣者,也請參考之。

update multiple records at one time!

今天發生一個需求:
我有兩個 table:  members, orders
orders裡面有多筆 members 的訂單紀錄
如今,我想要統計 每一個members,分別各自合計下了總訂單金額。
如何做?

如果只是查詢,那簡單:

SELECT mem_id, sum(orders_total) FROM  orders GROUP BY mem_id;

這樣就出來的。以 mem_id 為群組,分別總計他們的 sum()

........

現在,我希望將此資料 update 到 members 裡面的一個欄位 all_orders_total, how to do?

經過測試,這樣就好了:

UPDATE members m, (SELECT mem_id, sum(orders_total) as tot FROM orders GROUP BY mem_id) b
SET  m.all_orders_total = b.tot
WHERE  m.mem_id = b.mem_id;

就這樣,解決了!

2016年9月10日 星期六

讓html頁面停留3秒後動作

在<html>
<head>

//增加這一段:

<meta http-equiv="refresh" content="3; url=/index.php">

</head>

三秒後,會自動重新載入到 index.php

MySQL Trigger 的問題?

為何有些在 Trigger 中執行 Update另一個table,沒有問題
而在 SQL prompt 之下,直接執行 Update 那個 table 就 error???

這是 MySQL的bug嗎?


==================================================

找到原因了:原來是 MD5(100), 跟 MD5(100.00) 這裡不一樣的!


CCS $Redirect

要製作一個網頁,程式判斷:如果 某個值空白,則跳到另一個網頁

Global $Redirect;
if (empty($somevalue)) {

    /// Redirect to another page
    $Redirect = "otherpage.php";

} else {

  //  normal part...

}

上述這個功能,我記得以前寫過,可以用的。不知為何,今天寫卻不行!?!???

試了半天,只好試另個辦法:


if (empty($somevalue)) {

    /// Redirect to another page

    header('Location: /otherpage.php');
    exit();

} else {

  //  normal part...

}

第二個這樣改就可以了。

改日有空再來研究為何第一個不行?!

在此做個紀錄。



2016年9月9日 星期五

MySQL Business Rule

DBA 要能善用 Stored Procedure/Stored Function 用來包裝 Business Rule


資料庫管理師可以藉由儲存程序常商業邏輯包裝起來,除了可以有安全控管的功能外,也可以簡化開發,方便程式攥寫。此外,有些複雜的邏輯與資料處理,可以先在資料庫端預先處理,就可以提昇整體效能。所以,儲存程序的攥寫,是資料庫管理師必須熟識的技能。


2016年9月3日 星期六

codecharge $_POST

codecharge的 record form 綁定了 datasource ,經過程式的處理後,
<form ...... action="{Action}"> 原則上 action還是會回到自己頁面本身程式,才把更新的內容寫到資料庫去。
如果
<form ..... action="otherpage.php"> 那麼,程式裡處理了半天,資料也計算過了,但是,只要按了 submit 按鈕,就直接跳到 "otherpage.php"去了,根本就沒有處理頁面資料庫本身的update/delete !

又:$_POST["var"]

發出的 page :  send.php
<form ...... method='post' action="process.php">
<input type="input" name="var"....>

必須在 process.php 裡面,才可以接收到 $_POST["var"]
如果程式跳到任何其他程式,例如:something.php,在something.php裡面就是抓不到 $_POST["var"]了!


因此,如果,要在兩個程式中間傳遞參數的方法,是什麼呢?!

或是,我已經有一組$_POST[] 參數資訊要傳遞,可是 上面 codecharge程式還要先處理完資料庫以後,才要傳遞參數,但是 action已經設定為"himself.php",怎麼辦?

接收端的程式已經被定義好使用 $_POST!

2016年9月2日 星期五

codecharge buttom on_click event

Button Control Reference

Server side event:

on_click

Occurs after the button has been clicked and the form is submitted. 
If the button appears in a record or editable grid form, record operations such as insert, update and delete occur after this event has been processed. 
In cases where the form does not have a Data Source, this event is used to perform post-submission operations such as sending emails messages based on the submitted information.

按鈕按了! ==> Form送出去了 ==> 執行本on click Event的程式 ==> 執行Insert/Update/Delete

 

如何判斷現在FORM是在 insert mode? 還是 update mode?

只要用  if (empty({primary_key})) 就可以知道是否為新增模式了。 如果 {promary_key} 是空白的,那麼就是在新增模式;反之,就是更新模式。 以上。