發表文章

寫一個PHP高效率資料表交叉條件查詢方法!!-教學撰寫:徐嘉裕Neil hsu

圖片
在開發模組功能最怕遇到就是多條件的資料表交叉查詢,例如查詢資料表條件A+條件B,但又可單獨查詢條件A及條件B,如果只有1-2個查詢項目還好,但如果同時有5個或更多的查詢項目,有時候容易出錯,所以想出來一個高效率又方便的交叉查詢function寫法分享給大家!!

例如像下面這個介面圖有5項查詢功能,要能同時查詢單項及多項交叉查詢並將結果顯示右方的總表內容中!!


這樣必須設資料表的where查詢條件!如果一個一個判斷,5項查詢會產生5*5=25總組合!會寫到累死,所以乾脆直接function起來批次處理!!

//資料交叉查詢組合
function crossquery($where=""){

foreach($where as $key=> $val){
$wherevar.=$val;
}

$wherevar=!empty($wherevar) ? "where ".$wherevar."" : ''; // get TRUE

//去除最後字元
$wherevar=substr($wherevar,0,-4);
return $wherevar;

}

這樣就吧查詢條件全部交叉組合起來了,只需要在要讀取資料表的php檔中呼叫crossquery()函式並吧$where陣列直送入


//資料交叉查詢
$wherevar['0']=!empty($setuptime) ? "`setuptime` LIKE '%$setuptime%' and " : false; //時間有值
$wherevar['1']=!empty($enfunction) ? "`enfunction` = '".$enfunction."' and " : false; //功能有值
$wherevar['2']=!empty($basid) ? "`basid` = '".$basid."' and " : false; //單位有值
$wherevar['3']=!empty($review) ? &…

Xoops吧多個資料表合併顯示按照建立日期排序在一個table中的方法-教學撰寫:徐嘉裕Neil hsu

之所謂關關難過關關過,遇到問題就要爆肝解決了阿?阿不然呢!!
講這麼多也是要抱怨一下,目前遇到一個問題就是客戶有4個資料表,分別是影片/相片/新聞/檔案,四個表都是獨立的,需要做一個總表吧4個表的內容按照建立時間排序顯示,之前一直卡在join的邏輯中解不出來,後來才想到join主要是做資料表欄位關連,而不是合併顯示,上網查了一下mysql操作手冊終於讓我找到一個可以解決問題方法,真是感動阿,用UNION ALL就可以解決了阿,方法如下。

//重點說明-很重要

使用UNION ALL查詢的多個資料表的欄位名稱都要相同才能抓地到數值,例如資料表table1中的name欄位那table2也必須要相同的name欄位名稱,欄位格式也都需相同,才能抓到兩個表的相同資料。

資料表 table1 
IDTITLETIMESNAME11影片標題012018-10-18AAA2影片標題022018-9-18BBBBB
資料表 table2
IDTITLETIMESNAME21相片標題012018-10-17AAA2相片標題022018-9-17BBBBB
資料表 table3
IDTITLETIMESNAME31新聞標題012018-10-16AAA2新聞標題022018-9-16BBBBB
資料表 table4
IDTITLETIMESNAME41檔案標題012018-10-15AAA2檔案標題022018-9-15BBBBB
我們只需要取得ID,TITLE跟TIMES這三個欄位數值即可,其他欄位不用顯在總表中!!

Xoops資料表語法

//先在function.php中加上以下的合併查詢功能

//合併資料表查詢

function mergetablewhile($table="",$tablenane="",$where="",$order="",$type=""){

global $xoopsDB;

foreach($table as $key=> $val){
$selectvar.="SELECT ".$tablenane." FROM ".$xoopsDB->prefix($val)." ".$where." …

Xoops做一個單頁資料上下頁切換功能-教學撰寫:徐嘉裕Neil hsu

圖片
之前在開發Xoops模組如果有遇到上下頁切換都是使用Xoops內建函數,但是為了美觀改用bootstrap3的上下頁按鈕,這樣整個mysql查詢語法都要自己寫了,本來邏輯一直被卡在Limit查詢上解不出來,後來靈光乍現想到一個更簡單的方法來解決,分享給好朋友參考。


1、先引入neillibrary模組的function.php

2、加上以下的上下頁查詢資料表語法

//接收變數 $dbid=isset($_REQUEST['dbid'])?$_REQUEST['dbid']:"";
$dbneme="資料表名稱";

//上下頁面控制
//下一頁
$where=" where dbid > '".$dbid."' order by dbid ASC ";
$enshow['goahead']=moduledb($dbneme,$where);


//上一頁
$where=" where  dbid < '".$dbid."' order by dbid DESC ";
$enshow['retreatc']=moduledb($dbneme,$where);

備註說明:dbid為頁面的欄位id數值(PRIMARY KEY),這裡用dbid如要使用這個code可以改成自己頁面的id欄位名稱


3、然後輸出到smarty樣板

<nav >

<ul class="pager">

<{if $enshow.retreatc.dbid}> //如果有上一筆數值才出現按鈕判斷
<li><a href="<{xoAppUrl /}>modules/<{$xoops_dirname}>/moviecenter.php?op=page&dbid=<{$enshow.retreatc.dbid}>"><span aria-hidden="true">&larr;</span>&…

CentOS7->SELinux設定(防火牆)-教學撰寫:徐嘉裕Neil hsu

如果剛安裝好CentOS需要檢查一下SELinux設定,如為Enforcing則除了本地端以為其他外連都無法連入主機需要修改才行,方法如下!

先用SSH連線進入主機,輸入以下查詢指令觀看目前的SELinux設定狀態!

# getenforce


SELinux 共有三種模式如下:

Enforcing:強制模式,依據設定來限制檔案資源存取。
Permissive:寬容模式,不限制檔案資源存取,但仍會依據設定檢查並記錄相關訊息。
Disabled:停用模式,SELinux 已被停用。
預設是Enforcing,要將其修改為Disabled
找到以下檔案/etc/selinux/config  打開編輯
# This file controls the state of SELinux on the system.
# SELINUX= can take one of these three values:
# enforcing - SELinux security policy is enforced.
# permissive - SELinux prints warnings instead of enforcing.
# disabled - No SELinux policy is loaded.
SELINUX=disabled
# SELINUXTYPE= can take one of three two values:
# targeted - Targeted processes are protected,
# minimum - Modification of targeted policy. Only selected processes are protected.
# mls - Multi Level Security protection.
#SELINUXTYPE=targeted

修改紅字那一段,改成disabled

然後再重新啟用CentOS,這樣外部連線就能進入網站主機了!!

重啟CentOS指令:#  reboot


參考資料來源:https://dotblogs.com.tw/echo/2017/06/19/linux_selinux_mode
教學撰寫:徐嘉裕 Neil hs…

寫了一個Xoops防止外部位置傳參寫入網站資料表的方法-教學撰寫:徐嘉裕Neil hsu

Xoops雖然有自己的表單驗證方式,但如果是用bootstrap框架寫的表單,就沒辦法套用Xoops的表單驗證功能,必須要自己寫一個驗證,否則像是非會員權限的聯絡我們表單,如果有別人吧form的action指向到您的網站,欄位都一樣是可以吧資料post過來寫入資料表的,所以必須要驗證傳入的網址是否為網站網址,如果相符才讓資料寫入,方法如下:

1、先在模組的function.php中加上以下的判斷函數

//檢查傳入網址

//網址合併

function urlpregmatch($var=""){

$url1= str_replace ("/","",$var); //去除/

$url2= str_replace ("http:","",$url1); //去除http:

$url3= str_replace (".","",$url2); //去除.

$url4= preg_replace("/[&?=.#]/", '',$url3); //去除&?=.#

return $url4;

}


//比對網址(防外部傳參)

function alignmenturl(){

//本地端網址合併

$url1=urlpregmatch($var=XOOPS_URL);

//傳入端網址合併

$url2=urlpregmatch($var=$_SERVER['HTTP_REFERER']);


//判斷傳入網址是否為相同網站

if (!empty(preg_match("/".$url1."/i", "".$url2.""))) {

return true;

}

}

然後再php接收變數端加上以下判斷函數
//機器人檢查
if(empty(alignmenturl())) redirect_header(XOOPS_URL,0 , _MD_NOTWELCOME);

備註_MD_NOTWELCOME為php常數可以在語系檔中自行增加您要顯示的內容

這樣設定之後只有相同網址的post參數才…

CK編輯器使用JS取值的方法-教學撰寫:徐嘉裕Neil hsu

圖片
CK編輯器相信大家一定不陌生,是一套非常好用的所見即所得編輯器(WYSIWYG),能編排HTML格式及上傳圖檔諸多功能,這裡就不再描述,重點是如何用js取得文字編輯框中的數值?如果是用PHP的form透過post是完全沒問題的,只要取的textarea的name值即可,但如果是吧ck編輯器包在ajax裡面,那就不能用form來傳值了,必須用js來取值,例如下面的ck編輯器






<textarea id="CKcontent" name="CKcontent" > </textarea>


如果用 var  $CKcontent= $("#CKcontent").val();
很抱歉,這樣是完全取不到值的,因為ck編輯器本身在內部又用js建構一層html的p元素來顯示內容,被這問題卡了好久,終於找到解決方法!!
就是用
var  $CKcontent=CKEDITOR.instances.CKcontent.getData();
這樣就能用js抓取ck編輯器中編輯框的數值了,紅字的部分就是textarea的id值,有需要的朋友參考看看!!


教學撰寫:徐嘉裕 Neil hsu

js使用each迴圈讀取val值以陣列型態儲存的方法-教學撰寫:徐嘉裕Neil hsu

圖片
在開發ajax的ui介面時需要寫一個排序功能,也就是像下面這樣可以輸入數字來排列順序的表格。





由於是全ajax的ui介面,所以取得input ->  var值得方法跟php不一樣,不能用php的邏輯來思考,希望當夠按下變更排序按鈕時,吧所有的input -> var及input -> name值全部以陣列方式打包再透過ajax.php來儲存,方法如下。

//html結構

<input type='text' class='sorteach form-control' name='1' value='' placeholder=''>
<input type='text' class='sorteach form-control' name='2' value='' placeholder=''> <input type='text' class='sorteach form-control' name='3' value='' placeholder=''> <input type='text' class='sorteach form-control' name='4' value='' placeholder=''>
<button type='submit' id='sortbtn' class='btn btn-primary btn-lg btn-block button'>變更排序</button>

紅字的name值為需要儲存的資料表的欄位id值,藍字為each所需要的class值

所以按下變更排序至少需要取得兩個陣列,一個是name值陣列一個是value值陣列。

//JS結構


$("#sortbtn").click(function(){

//建構陣列
var $sortids…

修改bootstrap分頁選單使用jQuery新增及刪除class方法-教學撰寫:徐嘉裕Neil hsu

圖片
如果我們要使用bootstrap分頁選單做一個自動流程控制,像是下面這樣,當AJAX建立完成影片新增後自動切換到下一個頁籤,可以使用jQuery的removeClass()跟removeClass( )來達成這樣的功能需求。


bootstrap分頁選單是用 class="active"來定義當前顯示的頁籤按鈕及內容區塊,預設定義在是第一個頁籤及區塊的class裡面,

<ul class="nav nav-tabs" role="tablist" id='movievar' name="1,<{$enshow.basid}>">

<li id='limoviebtn1' role="presentation" class="active"><a id="moviebtnfunction1" href="#moviebtn1" aria-controls="moviebtn1" role="tab" data-toggle="tab"><{$smarty.const._MD_MOVIECENTERPHP02}></a></li>

<li id='limoviebtn2' role="presentation"><a id="moviebtnfunction2" href="#moviebtn2" aria-controls="moviebtn2" role="tab" data-toggle="tab"><{$smarty.const._MD_MOVIECENTERPHP03}></a></li>


</ul>

<!-- Tab panes -->

<div class="tab-content&qu…

jQuery取type='radio'值的方法-教學撰寫:徐嘉裕Neil hsu

圖片
例如向下圖這樣的單選核取type='radio'按鈕





如果要用JS來取得Radio數值然後透過 $.ajax來儲存數值,方法如下:

//結構

<div class='form-group'>

<label class='col-sm-4'>狀態(啟用/關閉)</label>

<div class='col-sm-8'> <label class='radio-inline'>

<input type='radio' id='' name='enable' value='0'>不啟用

</label><label class='radio-inline'>

<input type='radio' id='' name='enable' checked=checked value='1'>啟用

</label>

<br /><br /><br /></div>

</div>

藍字為input的name值,我們就要利用name來取得value中紅色的數值

//JS

$("body").on("click", "按鈕id或class值", function (e){

$enable=$('input[name=enable]:checked').val()

// alert($enable);

})


這樣當點擊按鈕時就會取得name=enable被核取中數值,之後再吧$enable變數值透過$.ajax存進資料庫即可!!

教學撰寫:徐嘉裕 Neil hsu

Xoops免費佈景:neilambilight2.8正式版釋出-佈景設計開發:徐嘉裕Neil hsu

圖片
neilambilight2.8正式版發佈了,本次發佈更新除了更改了手機介面的按鈕列顯示方式,主選單及網站功能選單全部收納到按鈕列以節省空間,調整與除錯修正佈景及模組的BUG問題,升級優化程式結構,資料表結構調整,最重要的更新是翻新了neothemesadmin佈景管理後台的五項功能,分別為【管理首頁】【佈景設定】【佈景圖片播放器管理】【網站選單管理】及【區塊選單管理】,全部UI介面均採用bootstrap3框架及neillibrary函數庫模組與JS互動元件,跳脫原本死板的Xoops原生介面型態,並增加了許多實用的功能,精簡及合併刪除未使用的檔案。目前neothemesadmin佈景管理後台90%都已翻新完成,預計下次改版就能全部翻新,這樣就能再繼續增加新的功能開發及準備佈景介面的改版工作。


neilambilight2.8 更新內容
==============================

增加聯絡我們送出欄位資料無害化設定,增加回覆時郵件中自動附上詢問問題。修改手機版介面,增加登入登出按鈕功能。修改手機版介面,增加功能導覽bar,吧主選單收納到功能功能導覽bar的選單列裡面,精簡優化界面。手機版佈景主選單移除Google外部讀取字形,加快選單開啟速度。修改手機版聯絡我們表單排版樣式,CSS調整。解決電腦手機版tad_uploader模組檔案文字過多會拉破版面的問題。修正跑馬燈管理按鈕出現PHP常數問題。修改neothemesadmin佈景管理模組首頁,使用bootstrap3框架重新編排。電腦版介面增加網站管理按鈕,點了直接進Xoops管理後台。neothemesadmin佈景管理模組sql兼容資料庫嚴格模式。neothemesadmin佈景管理模組多層區塊按鈕管理分類增加url欄位及target選項及是否使用分類連結選項功能及欄位。修改多層區塊按鈕程式及樣版檔,前台增加開啟滑動選單按鈕(若無子分類時不會顯示),增加編輯分類按鈕。更新neothemesadmin佈景管理模組->佈景設定UI介面,使用JS控制元件+bootstrap3框架及neillibrary函數庫模組與優化程式結構重新編寫。於模組更新檔中增加刪除無用的analyzefbid.php檔案設定。更新neothemesadmin佈景管理模組->佈景圖片播放器管理UI介面,使用boots…