發表文章

10.4.8-MariaDB->SQL嚴格模式設定方法(for-windows)-教學撰寫:徐嘉裕Neil hsu

圖片
說起來也奇怪至今仍不解哪出問題了?本地端跟客戶端同樣都是安裝XAMPP-7.3.11版,但客戶端的sql_mode設定卻和本地端不相同,導致許多模組本地端是正常的但上傳到客戶端後都無法使用,資料存取出錯或無法寫入,經過檢查發現XAMPP的windows版本跟CentOS版本my.ini配置是不一樣的!

先來看一下my.ini設定->windows版

sql_mode=NO_ZERO_IN_DATE,NO_ZERO_DATE,NO_ENGINE_SUBSTITUTION

資料庫設定是使用

NO_ZERO_IN_DATE
NO_ZERO_DATE
NO_ENGINE_SUBSTITUTION

再來看CentOS->my.ini設定

sql_mode=STRICT_TRANS_TABLES,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION

資料庫設定是使用

STRICT_TRANS_TABLES
ERROR_FOR_DIVISION_BY_ZERO
NO_AUTO_CREATE_USER
NO_ENGINE_SUBSTITUTION

差別在時間格式及預設值部分,為了讓本地端跟客戶端的設定一致,所以修改本地端的my.ini吧sql_mode替換為以下的設定值

sql_mode=STRICT_TRANS_TABLES,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION


重新啟用MYSQL後再SQL輸入SELECT @@GLOBAL.sql_mode看設定是否有生效!





如果顯示設定值跟my.ini中設定一樣就可以了,關於資料庫sql_mode常用值說明可以參考這個網站

http://xstarcd.github.io/wiki/MySQL/MySQL-sql-mode.html

先讓本地端跟客戶端設定一致,然後才來調整SQL語法,才能做升級工作喔!!

教學心得撰寫:徐嘉裕 Neil hsu

使用htaccess進行網站轉址的方法-教學撰寫:徐嘉裕Neil hsu

分享一些常用的.htaccess網站轉址方法!有需要的朋友參考看看!

//網址轉換
RewriteEngine on
RewriteCond %{HTTP_HOST} ^123.88.88.666$ [NC]
RewriteRule ^(.*)$ http://www.blogger.com [R=301,L]

這樣可以吧網站的IP:123.88.88.666轉換成http://www.blogger.com但不包含所帶變數及路徑

//網址轉換包含路徑檔名變數
RewriteEngine on
RewriteCond %{HTTP_HOST} ^123.88.88.666$ [NC]
RewriteRule ^(.*)$ http://www.blogger.com%{REQUEST_URI} [L,R=301]

這樣可以吧網站的IP:123.88.88.666轉換成http://www.blogger.com包含路徑檔名及變數

例如: http://123.88.88.666/index.php?id=123 轉換後   http://www.blogger.com/index.php?id=123

//HTTP轉HTTPS包含路徑檔名變數
RewriteEngine on
RewriteCond %{HTTPS} off
RewriteRule ^(.*)$ https://%{HTTP_HOST}%{REQUEST_URI} [L,R=301]

自動吧網站的http轉換為https包含路徑檔名及變數

把需要轉址的code貼到伺服器根目錄中的.htaccess文件裡面在重啟apache即可套用新設定


教學心得撰寫:徐嘉裕 Neil hsu

jQuery變更結構中id名和class名的方法-教學撰寫:徐嘉裕Neil hsu

使用attr()函數可以變更網頁結構中的id名和class名,達到css樣式或是js功能切換的目的,方法如下!

//HTML結構

<div id='boxid1'  class='boxclass1'>內文內文........</div>

//更換Id名稱

$("#boxid1").attr('id','boxid2');

這樣結構中的id由原本的boxid1更換為boxid2


//更換Class名稱

$(".boxclass1").attr('class','boxclass2');

這樣結構中的class由原本的boxclass1更換為boxclass2

有需要的朋友參考看看

心得教學撰寫:徐嘉裕 neil hsu

擷取臺中市教育局校園活動新聞的PHP程式,可用於Xoops自訂區塊中-教學撰寫:徐嘉裕Neil hsu

圖片
首先要先感謝台中市喀哩國小資訊老師提供的原始程式碼,這樣讓我節省很多時間,不用再去開發網頁爬蟲程式,這裡就按照原始程式碼修改為兩個樣式!直接可以顯示臺中市教育局校園活動新聞內容

首先區要知道所屬學校的網址,這樣程式才能去爬行撈資料,查詢學校網址的方法如下:

1、先進入臺中市校園活動新聞首頁
http://www.tc.edu.tw/SchoolNews/show

2、找到右下角的學校發表排行區塊

3、找到自己學校點進去,上面的網址就是該學校活動新聞網址,之後的程式需要貼入


樣式一:區塊輪播樣式




//PHP程式碼

echo "<script type='text/javascript' src='http://www.tc.edu.tw/js/jquery-1.6.4.min.js'></script> <script type='text/javascript' src='http://www.tc.edu.tw/js/plugins/jquery.cycle.all.min.js'></script> <script type='text/javascript'> $('#school_news').cycle({         fx:     'turnDown',         delay:  -2000,         speed:  2500 ,         timeout:  5000 ,         pause:1    }); </script>

$show_num=1;//顯示幾則新聞,大於1則會有輪播效果
//取得新聞
$url = "http://www.tc.edu.tw/SchoolNews/show/school/id/546";  //貼上校園活動新聞網址
$contents = addslashes(file_get_contents($url));
$contents = str_replace (addslashes('href="/'), addslashes(' href…

仿CSS的nth-child功能用PHP做一個用迴圈數帶出固定1.2.3的數值重複function-教學撰寫:徐嘉裕Neil hsu

圖片
CSS的nth-child其實是很好用的,但唯一的限制是指定的物件必須為相連,而且無法對子物件做樣式設定,例如以下結構就無法用nth-child來定義.thumbnail的樣式!

<ul class="row">
<li class="col-md-4">
<div class="thumbnail"><img>......略</div>
</li>
<li class="col-md-4">
<div class="thumbnail"><img>......略</div>
</li>
<li class="col-md-4">
<div class="thumbnail"><img>......略</div>
</li>
</ul>

物件必須相連,nth-child是用物件的順序來定義樣式的,如果要做以下的效果固定迴圈3個區塊3種樣式用nth-child是無法實現的!!

當然是還有解決方法,Xoops是使用smarty樣板引擎,在foreach裡面用<{cycle values="box01,box02,box03"}>來定義class也是可以,但如果有做了AJAX的分類切換功能,那被切換的頁面是讀ajax.php,所以smarty的cycle又不能用了,無法兼顧。

最終的解決辦法還是要靠PHP,利用迴圈吧固定1.2.3的倍數整除後回傳數值,然後再輸出到樣板或直接輸出PHP上,這樣就沒問題了!寫了一個自動分3區塊樣式的function有需要的朋友參考看看!

//PHP-CODE
function blocksclassbox($key="",$i="",$type="",$prefix=""){
$nthchilds="".$prefix."box01"; //初始值

JQuery使用each迴圈取得核取方塊陣列數值的方法(選取及取消)-教學撰寫:徐嘉裕Neil hsu

圖片
核取方塊陣列就是由很多個核取方塊所組件起來的,形成一個陣列型態,所以如果要取值就不能用個別取值的方法,必須要使用each迴圈來判斷哪些方塊目前是checked狀態,哪些是未checked狀態,可以用以下的方法。


例如像下面這樣的核取方塊陣列要取值!




html結構

<label class=' checkbox-inline checkboxeach'><input id='checkbox' checked='checked' type='checkbox' name='options[3][]' value='1'>學生活動</label>

<label class=' checkbox-inline checkboxeach'><input id='checkbox' checked='checked' type='checkbox' name='options[3][]' value='3'>教師活動</label>
<label class=' checkbox-inline checkboxeach'><input id='checkbox' checked='checked' type='checkbox' name='options[3][]' value='47'>教師文康活動</label>
<label class=' checkbox-inline checkboxeach'><input id='checkbox' checked='checked' type='checkbox' name='options[3][]' value='48'>進修與研討</label>
<label class=…

分享PHP常用的表單驗證function-教學撰寫:徐嘉裕Neil hsu

分享一些網路上實用的PHP表單驗證function,這些function我都已經升級到PHP7.3版本了,也經過實際測試確實有效,有需要的朋友請自行取用吧!!


//身分證驗證格式(驗證條件不成立回傳true)
function chk_pid($id) {
if(!$id)return false;
$id = strtoupper(trim($id)); //將英文字母全部轉成大寫,消除前後空白
//檢查第一個字母是否為英文字,第二個字元1 2 A~D 其餘為數字共十碼
$ereg_pattern= "^[A-Z]{1}[12ABCD]{1}[[:digit:]]{8}$";
if(!preg_match("/".$ereg_pattern."/i", $id))return true;
$wd_str="BAKJHGFEDCNMLVUTSRQPZWYX0000OI"; //關鍵在這行字串
$d1=strpos($wd_str, $id[0])%10;
$sum=0;
if($id[1]>='A')$id[1]=chr($id[1])-65; //第2碼非數字轉換依[4]說明處理
for($ii=1;$ii<9;$ii++)
$sum+= (int)$id[$ii]*(9-$ii);
$sum += $d1 + (int)$id[9];
if($sum%10 != 0)return true;
return false;
}

//時間格式驗證(驗證條件不成立回傳true) function isDate($str){
if(!preg_match("/^[0-9]{4}-[1-12]{2}-[1-31]{2}$/", $str)){
return false;
}
$__y = substr($str, 0, 4);
$__m = substr($str, 5, 2);
$__d = substr($str, 8, 2);
//$var=checkdate($__m, $__d, $__y);
if(checkdate($__m, $__d, $__y)){
$resultvar=true;
}else{
$resultv…

超好用的JQuery圖片放大燈箱效果-FancyBox套件(沒用會後悔喔)-教學撰寫:徐嘉裕Neil hsu

圖片
FancyBox是一套非常好用也非常簡單套用的js放大燈箱效果套件,可以單獨使用也能跟其他的js圖片播放器整合,方法超簡單的。

例如像下面這個圖片播放器原本預設功能是滑動下方小縮圖切換播放器大圖


但少了燈箱放大效果,總覺得視覺上不夠吸引人,加上FancyBox套件後點擊小圖就會立刻開啟圖片放大的燈箱效果



然後圖片還能再放大跟上下拉動,並且能左右切換圖片,這樣撥放器就變的更美觀了,大推,以下為FancyBox燈箱套件使用方法!


1、先去FancyBox官網下載套件,或是直接用說明中連結也行!

網址:http://fancyapps.com/fancybox/3/


2、於需要使用燈箱效果圖片下方加入js跟css引入連結

<script src="//code.jquery.com/jquery-3.3.1.min.js"></script>

<link rel="stylesheet" href="https://cdn.jsdelivr.net/gh/fancyapps/fancybox@3.5.7/dist/jquery.fancybox.min.css" />

<script src="https://cdn.jsdelivr.net/gh/fancyapps/fancybox@3.5.7/dist/jquery.fancybox.min.js"></script>

3、在圖片加上<a>標籤加上data-fancybox="gallery"設定即可
<a data-fancybox="gallery" href="big_1.jpg"><img src="small_1.jpg"></a>
<a data-fancybox="gallery" href="big_2.jpg"><img src="small_2.jpg"></a>
4、<a>中的連結為大圖的url位置,img的src為小縮圖的…

php使用each批次大量接收變數-教學撰寫:徐嘉裕Neil hsu

圖片
在php中如果要接收變數($_GET or $_POST)按照老師教的方法應該是要這樣寫!

$var=isset($_REQUEST['var'])?$_REQUEST['var']:"";

然後$var就是接收變數值

因此檔頭通常會會寫一大串的接收變數COED




變數越多,擋頭接收變數區就越長,因為當初老師就是這樣教的所以我就這樣寫習慣了....
最近發現可以用更簡單的方法來批次接收變數,不用寫落落長的變數接收CODE了!方法如下!

使用each來接收變數再用while解出變數key跟value值,再用$$var直接吧變數的key值變成變數名稱


//接收變數區
while (list($var, $value) = each($_REQUEST)) {
$$var=trim(isset($value)?$value:"");
}

這樣就能批次接收全部變數,上面那一排落落長的code可以清除了,精簡程式結構增加開發效能,有需要的朋友參考看看!


2019-9-27補充說明

上面的方法是可以吧任何post過來的值參都自動變成新變數,但這樣反而會有讓駭客有攻擊癱瘓系統的機會,因為不管傳什麼$$var都會形成一個新變數。

例如駭客故意在網址GET傳送

www.testweb.com/index.php?test=123456789

那在PHP中就會自動產生一個$test的變數值為123456789

如果惡意插入512KB位元組的文字就會導致1MB 的記憶體被消耗,那像中國網軍群控系統一台電腦可以群控100多個作業系統,每個作業系統再開10個視窗用機器人腳本不斷送變數進網站,伺服器記憶體很快就會被消耗殆盡。

解決方法就是吧需要用的變數設為白名單,吧允許傳送的變數name預先用陣列建構起來,在於while迴圈中判斷這些變數是否為合法變數,如果是才產生變數,這樣就不會被駭客攻擊漏洞了!


//允許傳送變數
$allowvar =array("of_sortid","centerid","enable","arrange","search","type","useruid",&q…

jQery在function中回傳$.ajax變數的方法-教學撰寫:徐嘉裕Neil hsu

正常來說,如果要在function中回傳變數只需要使用return即可!

例如

function test(){
var $result='12345';
return result;
}

alert(test()); //顯示12345
那如果在function中執行$.ajax不就是
function test(){
$.ajax({
url : 'test.php',
type : "post",
data : {},
async : false,
success : function(data) {
var result =data ;
}
});
return result;
}

很抱歉這樣寫是什麼值都回傳不出去的,因為$.ajax的data變數是在test.php完成操作後接收回傳值產生的,所以$.ajax預設是不存在data變數,這樣會導致function在執行時 return result;並無變數而產生程式錯誤(js變數需要宣告),解決方法就是在function中宣告一個變數預設值即可!
function test(){ var result =false ; //預設值
$.ajax({
url : 'test.php',
type : "post",
data : {},
async : false,
success : function(data) {
result =data ; //回傳值
}
});
return result;
}
這樣就沒問題了,可以吧function中$.ajax的data回傳變數使用return回傳出去!
有需要的朋友參考看看!

教學撰寫:徐嘉裕 Neil hsu