2020年12月29日 星期二

Scriptcase 注意事項!不能偷懶!

使用SCRIPTCASE的一些注意事項。

** GRID 如果自訂 SQL需用 SCRIPTCASE內設的 SQL BUILDER建立,比較沒問題。

如果自己用編輯器,建立的 SQL stmt,很容易產生錯誤。不知道為什麼?!可能SC本身有針對SQL語法做一些處理的關係。


** 不能偷懶

剛設計好,上傳出版時,在執行主機環境設定時,時間很趕,所有漏掉了 Client Char Set 為 "UTF-8"。結果忘記了!

今天在上傳正式程式時,才發現怎麼中文都出現亂碼,成為 "?"。這是典型的中文亂碼的問題。

一時忘了之前漏掉設定資料庫連線為 Client CHAR UTF-8,結果搞了半天。逐一檢查個別應用程式的 Application CHAR SET/ Language/ 專案的 Language 等!浪費了很多時間!都白做了!

其實就是 Server 上的 Database Client 連線設定忘記設!

一重新設定,就OK了!

唉~~真的每一個步驟,不要馬虎,以免多做了許多虛功!

紀錄一下,提醒自己。以後不要犯一樣的錯誤。

ScriptCase Grid Default Layout Header

 {lang_othrs_title} Report of - 報表

 {lang_othrs_titl} List - 列表


記得要更改一下Grid Layout HEADER 上的顯示。

2020年12月10日 星期四

SCRIPTCASE 處理 PDF、Grid 無法順利匯出PDF

ScriptCase 提供很多PDF匯出功能,使用了一些 Third Party 做的 pdf Class

而,Grid Export to PDF,則是使用 wkhtmltopdf 這個程式。wkhtmltopdf 不是一個 php class,而是一個可執行的 cmd 檔案,必須直接用 cmd 來下指令 將 html 產生 pdf

類似這樣:

> wkhtmltopdf  source.html  output.pdf

而 wkhtmltopdf 需要安裝在 產品主機上,才可以執行。

------------------------------------------------------------

Scriptcase 在自己Local開發環境下,Grip Application 可以順利的匯出 pdf 檔案。

可是,出版到產品環境時,卻無法匯出。

經過Google大神查詢結果,發現:

http://www.toughdev.com/content/2015/11/fixing-pdf-export-issues-when-using-a-scriptcase-grid-application/

1. 產品主機要安裝 JRE

2. SC使用  wkhtmltopdf ,所以

放在:/_lib/prod/third/wkhtmltopdf/os_.../

產生的檔案在

/_lib/tmp/ 

裡面有 grid 的 html 檔案。

還有一個執行 wkhtmltopdf 的 log 檔案

./wkhtmltopdf-amd64   --page-size A4 --orientation Portrait --header-right "[page]" https://malladmin.hongfumall88.com/_lib/tmp/sc_gamer_grid_link2_qrcode_pdf_html_hmsaloggbfeb16ekrisu8lbjb9.html /home/ddnews/domains/malladmin.hongfumall88.com/public_html/_lib/tmp/sc_pdf_20201210065017_905_gamer_grid_link2_qrcode_pdf.pdf


3. 需要打開 /_lib/prod/third/wkhtmltopdf/os_.../ 那個執行檔的權限為 "777",這樣就解決了權限的問題。

(直接用 SSH 在 Linxs cmd 下去執行 ./wkhtmltopdf-amd64   --page-size A4 --orientation Portrait --header-right "[page]" https://malladmin.hongfumall88.com/_lib/tmp/sc_gamer_grid_link2_qrcode_pdf_html_hmsaloggbfeb16ekrisu8lbjb9.html /home/ddnews/domains/malladmin.hongfumall88.com/public_html/_lib/tmp/sc_pdf_20201210065017_905_gamer_grid_link2_qrcode_pdf.pdf,結果出現  權限錯誤的問題,還有幾個 SC 產生的 html 裡面所指引的 .css 路徑錯誤 "/_lib/" 變成  "/_lib/_lib/....,這應該是 SC產生的 html碼 路徑錯誤!)


修改這幾個後,可以順利產生  pdf, 了,但是出來的中文卻是亂碼!

這個問題還要繼續解決!

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

https://my.oschina.net/huqiji/blog/804899

終於在這個網頁找到答案了

中文亂碼或者空白解決方法

如果wkhtmltopdf中文顯示空白或者亂碼方框

打開windows c:\Windows\fonts\simsun.ttc拷貝到linux伺服器/usr/share/fonts/目錄下,再次生成pdf中文顯示正常


解決了!


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

2021/04/01今天愚人節!

SC的PDF又來搞怪了!

後來查一查,跟上面紀錄的一樣,就是那個執行檔案的權限,改為"777"就可以了!

可能是我前兩天有更新 deploy _lib檔案,而SC的預設權限為"666",

以後記得,如果重新 deploy lib檔案,這裡要來設定權限為"777"

/_lib/prod/third/wkhtmltopdf/linux-amd64/wkhtmltopdf-amd64.exe


2020年12月8日 星期二

MySQL 資料庫 + Stored Procedure 設計通則

一、資料庫部分

二、程式部分


一、資料庫部分

使用英文名稱

Comment 盡量不要使用




二、程式部分


proc_label: BEGIN

/*
-- Program name:  program_name.sql
-- INPUT 參數說明:
-- IN in_gamer_id .....
-- IN in_gamer_id .....
-- IN in_gamer_id .....
-- 程式說明:
-- 作者:
-- 日期:

OUT `out_ret_code` varchar(100) CHARSET utf8mb4 COLLATE utf8mb4_unicode_ci

*/

DECLARE v_program_name VARCHAR(100) DEFAULT "porgram_name.sql";
-- 這個變數是為了方便輸出訊息時,便於顯示程式名稱,方便偵錯。

DECLARE EXIT handler for sqlexception
BEGIN
  GET DIAGNOSTICS CONDITION 1
  @p1 = RETURNED_SQLSTATE, @p2 = MESSAGE_TEXT;
  ROLLBACK;
  SET out_ret_code =(SELECT concat("RETURNED_SQLSTATE:",@p1 ," MESSAGE_TEXT:" ,@p2 ));
  CALL system_log(CONCAT("sqlexception:",out_ret_code));
END;
DECLARE EXIT handler for sqlwarning
BEGIN
  GET DIAGNOSTICS CONDITION 1
  @p1 = RETURNED_SQLSTATE, @p2 = MESSAGE_TEXT;
  ROLLBACK;
  SET out_ret_code =(SELECT concat("RETURNED_SQLSTATE:",@p1 ," MESSAGE_TEXT:" ,@p2 ));
  CALL system_log(CONCAT("sqlwarning:",out_ret_code));
END;

-- 判斷傳入參數是否正確
IF input_is_error() THEN
SET out_ret_code = CONCAT("ERROR: 幫別人註冊: CP not enough!",v_my_cp, " bunit_type:",in_bunit_type);
CALL system_log(out_ret_code);
LEAVE proc_label;
END IF;

/*

先處理參數正確性檢查
先處理不用寫資料庫的運算
最後要寫資料庫時,再
START TRANSACTION
COMMIT;
ROLLBACK;*/

START TRANSACTION;


/*
資料庫更新動作
*/

SET out_ret_code = "SUCCESS";

COMMIT;

END;



IF NOT EXISTS(SELECT * FROM People) THEN
SIGNAL SQLSTATE '45000' SET MESSAGE_TEXT = 'OMG PANIC';
END IF;


MySQL Stored Procedure Cursor 的標準程式模板

DECLARE v_exit INT DEFAULT FALSE;
DECLARE cur_table CURSOR FOR
SELECT field1, field2 FROM table;
DECLARE CONTINUE HANDLER FOR NOT FOUND SET v_exit = TRUE;

OPEN cur_table;
my_fetch: LOOP
FETCH cur_table
INTO v_field1, v_field2;
IF v_exit THEN
LEAVE my_fetch;
END IF;
<process code here...>

END LOOP my_fetch;

CLOSE cur_table;




** PHP 程式部分,要配合的程式碼:

EVENT_BUTTON_UPDATE_ONCLICK()

// --- Custom Code
    $db = new clsDBconn_mysql();

    $sql1 = "CALL add_new_proc(".
$db->ToSQL($_SESSION["ID"],ccsText) . ",".
$control->ctrl->GetValue()  . "," .
$db->ToSQL($aaaaa,ccsText). "," .
"@ret_code)";
    $db->query($sql1);
        
    $sql_log = "CALL system_log(".$db->ToSQL($sql1, ccsText).")";
    $db->query($sql_log);
    $sql2 = "SELECT @ret_code";
    $db->query($sql2);
    $Result = $db->next_record();
    global $Redirect;
    $Redirect = "success.php?ret_code=".$db->f("@ret_code");
    $db->close();




 

2020年12月3日 星期四

AH01909: www.example.com:443:0 server certificate does NOT include an ID....

 從Apache log中發現這一條,很奇怪,我主機中,並沒有example.com這個網址,為何會產生這個?

AH01909: www.example.com:443:0 server certificate does NOT include an ID....

奇怪哩!

紀錄一下,以後再來查

2020年12月2日 星期三

php 使用 SQL 時,引號要避開,否則會出錯!mysqli_real_escape_string()

 

<?php
$mysqli = new mysqli("localhost","my_user","my_password","my_db");

if ($mysqli -> connect_errno) {
  echo "Failed to connect to MySQL: " . $mysqli -> connect_error;
  exit();
}

// Escape special characters, if any
$firstname = $mysqli -> real_escape_string($_POST['firstname']);
$lastname = $mysqli -> real_escape_string($_POST['lastname']);
$age = $mysqli -> real_escape_string($_POST['age']);

$sql="INSERT INTO Persons (FirstName, LastName, Age) VALUES ('$firstname', '$lastname', '$age')";

if (!$mysqli -> query($sql)) {
  printf("%d Row inserted.\n", $mysqli->affected_rows);
}

$mysqli -> close();
?>



像下面這個例子: $lastname 裡面的值有單引號。這樣進入 SQL 就會發生錯誤,應該要避開。

就使用這個函數:mysqli_real_escape_string(),就可以把單引號等避開了!


<?php

$lastname = "D'Ore";

$sql="INSERT INTO Persons (LastName) VALUES ('$lastname')";

// This query will fail, cause we didn't escape $lastname
if (!$mysqli -> query($sql)) {
  printf("%d Row inserted.\n", $mysqli->affected_rows);
}

?>


https://www.w3schools.com/php/func_mysqli_real_escape_string.asp

https://www.php.net/manual/en/mysqli.real-escape-string.php

CodeChargeStudio用來做 AJAX回應程式

 之前做了一個 AJAX動態去讀取伺服器程式 getname.php,要獲取姓名的程式。

結果程式呼叫 JavaScript 讀取 getname.php 之後,版面大變!

後來發現,原來是我是以CodeChargeStudio來製作getname.php,沒有把 html 模板清空、清乾淨,還留有CCS原本內定的一些 html模板的文字,這些<html><head>......</head><body>.....</body></html>整個一起都傳到網頁裡面去了!所以,CSS就大亂了!

我將 getname.php 在 CCS上留存的 html模板都清空,只剩下產生{name},就乾淨了!

犯了這個錯誤!紀錄一下。

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

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