編輯培力/MySQL、PHP、javescipt
- MySQL 放資料
- PHP 伺服器端語言,抓資料、顯示資料
- javescipt 客戶端語言,作用在瀏覽器上,可以快速便捷地與使用者互動
目錄
MySQL
一、登入
http://science4everyone.net/adminer-4.7.5-mysql.php
- 伺服器:
- 帳號:
- 密碼:
- 資料庫(可省略):
二、登入後介面(標準介面)
(一)左側選單
- 語言:
- 版本
- 四指令
- 目前資料庫的諸資料表
- 瀏覽各筆
- 看資料表結構
(二)右側主要工作區
- 登出
- 四層路徑「系統/伺服器/資料庫/資料表」
- 現有層級提示
- 可用工作選單
- ☆互動工作區
(三)示範資料表
- web
- webMail
- ×××note
(四)建立自己的資料表
- create table 表格名 like 既有表格名:使用既有表格的格式創建新表
- 建好後觀察
- 觀察完刪掉
- 「到 assistant 資料庫/建立資料表」,到指定資料庫有兩種方法。
三、SQL概說
- SQL:Structured Query Language。SQL網路資料庫在 MySQL、MSSQL、DB2 語法相同。
- NoSQL 網路資料庫,還沒有標準。要資料量極大才算得到,在全民科學平台上還用不到。
- 網路資料庫在雲端上,可以多人共編而不會亂掉。
- 資料庫系統(如MySQL、MSSQL),包含數個資料庫。
- 一個資料庫包含數個資料表(table)。實體上,一個資料庫是一個目錄(資料夾),一張資料表是一個檔案。
- 每張資料表由「欄」(column)及「筆」(row,record,tuple)構成。
- 每一筆資料的每欄,都放入「值」(value)。
- 資料表中用來辨識筆的欄位叫「鍵」(key,primary key),鍵值也可以由許多欄組合而成,每一筆的鍵值必須「唯一」,如姓名不是好的鍵值,身份證字號是好的鍵值。
四、基本SQL命令
小括號( )是指令的一部分;中括號[ ]代表可選用的選項,指令中不一定要下這些指示。
- show databases;:秀出現有的資料庫。
- create database 資料庫名;:建資料庫。
- use 資料庫名;:取用資料庫
- show tables;:秀出現用資料庫有那些資料表。
- create table 表格名 (欄名 資料型別(欄寬) 預設值,name char(10),);:建資料表。
- create table 表格名 like 既有表格名:使用既有表格的格式創建新表
接著可用「insert 新表 select * from 舊表;」複製資料。 - create table 表格名 as select col1,col2… from 既有表格名 definition only:使用既有表格部分欄位創建新表。如果省略 definition only ,則結構和資料都一起複製到新表。新表沿用預設的 Engine、語系編碼,而不是舊表的。
- describe 表格名;:秀表格結構。
- insert into 表格名 values ('值1','值2',…);:循欄序加一筆資料。
- insert into 表格名 values ('值1','值2',…),('值1','值2',…),('值1','值2',…)…;:循欄序加很多筆資料。
- insert into 表格名 (欄名1,欄名2,…) values ('值1','值2',…);:只對指定數欄填值,加一筆資料。
- insert into 表格名 (欄名1,欄名2,…) select (欄名a,欄名b,…) from…;:批次插入表格內容,select子句中可以含有WHERE、GROUP BY、HAVING、表格連接及別名等等。
- insert into 表格名 select * from 另一表格;:表格結構相同,直接照抄內容。
- insert into 表格名 set 欄名1='值1',欄名2='值2',…;:只對指定數欄填值,加一筆資料。
- REPLACE 的用法與 INSERT INTO 非常接近,不同的地方是:
在 INSERT INTO 中如果你插入的欄位有唯一性質的索引,例如:PRIMARY KEY, AUTO_INCREMENT, UNIQUE,如果插入資料時真的發生唯一性質的欄位資料重複,那麼這個 INSERT INTO 命令會被忽略而不執行,但是在 REPLACE 中的新資料卻會把重複資料中的舊資料蓋掉。因此 REPLACE 比 INSERT INTO 更具強制性。 - 在insert、update命令中,插入欄值如果是123,456等數值,不論欄位的資料型態為何,皆可不加引號而插入;但如果插入之欄值不是數值,則一定要加引號。
- select 欄名1,欄名2,… from 表格名;:找出指定欄位,全部筆數。
- select DISTINCT 欄名1,欄名2,… from 表格名;:找出指定欄位,全部筆數,但所有欄值都相等的諸筆合併為一筆。DISTINCT翻譯為「不同」。
- select * from 表格名;:找出全部欄位,全部筆數。
- select * from 表格名 where 條件(如name='丁志仁');:找出全部欄位,合條件的筆數。
- update 表格名 set 欄名=欄值,欄名=欄值… [where 條件][limit 範圍];:將合條件合範圍的所有筆數,指定欄都換成指定欄值,欄值可以為公式。
如:「update 表格名 set 欄名=TRIM(BOTH '\r\n' FROM 欄名)」去掉頭尾的空白行。
「update 表格名 set 欄名=concat(字串1,char(10),char(13),字串2) where tid = xxxxx」插入換行
「update 表格名 set 欄名=replace(欄名,'abc','char(10)abc') where tid = xxxxx」插入換行 - insert與update之值可以是運算,該運算可包含現有欄值(以欄名表示)。
- alter table 表格名 add 欄名及欄位描述;:對表格加欄。
- alter table 表格名 modify 欄名及欄位描述;:對表格改欄之屬性、欄寬等欄位描述。
- delete from 表格名 where 條件 limit 幾筆;:刪合條件的幾筆。
- 不可用delete from 表格名 where 條件 limit 自第幾筆始,以下幾筆;:因在delete指令下,limit是指幾筆,不是指範圍。
- 4.0版之後開始支援刪多表,其指令類似select,只是以「delete 諸表」取代「select 諸欄」,可以使用left join、on、where組合。
- drop table [if exists] 表格名;:刪除資料表。如加「if exists」則找到則刪,避免出現錯誤訊息。
- truncate table 表格名;:清空資料表。
- drop database [if exists] 資料庫名;:刪除資料庫。
- grant all on *.* to 使用者 identified by '通行碼';:給所有權力,在所有資料庫所有表格,給某使用者以某password辨識時。
- load data local infile '路徑及檔名' into table 表格名 [fields [欄名1,欄名2…] [terminated by ','] [ENCLOSED BY '"'] [ESCAPED BY '\\']] [LINES TERMINATED BY '\r\n'];:從檔案吃資料進表格。省略欄名則循序給;省略分隔符號則以TAB分隔資料。
- 進mysql的預設路徑在/var/lib/mysql
- use 資料庫;後預設路徑在/var/lib/mysql/資料庫。但要load data infile一定要use 資料庫。
- 省不省略「local」,都可以用絕對路徑(從/寫起)、相對路徑(用.或..)、預設路徑(沒指定路徑)。
- 檔名一定要外包引號。
- 「fields」管欄名列、terminated by、ENCLOSED BY、ESCAPED BY,四個操作項
- 省略「fields 欄名1,欄名2…」等欄名列,循序抓欄值,抓到欄位數完或數據檔中的數據抓完,一定吃。和insert不同。
- 省略「terminated by ','」,用TAB(\t)分隔欄值,兩個TAB連在一起,兩個TAB之間還是要算一個空欄值。
- 省略「ENCLOSED BY '"'」,數據檔中的"被當作欄值存起來。如下此令,要看檔中數據前後有無成對的"包起來,有就去掉;如果沒有或引號不是前後成對,不去引號,但認定的欄位就很長,長到把欄位分隔符號包進來,導致把好幾欄當一欄。數據也可以改用其他字符來包欄值。
- 下「OPTIONALLY」,不知何意,本版本也不支援。
- 省略「ESCAPED BY '\\'」,認\為特殊字元,會去反斜。可指定反斜以外的字元為跳脫字元。用「ESCAPED BY 」時,去反斜的功能被抑制,恰可解決許功蓋問題。
- 省略「LINES TERMINATED BY」,以\n(換行)為換筆,Windows下的換行「\r\n」,\r會被吃進欄位值。所以要指定「LINES TERMINATED BY '\r\n'」才會正常。
- OPTIMIZE TABLE 表名;:最佳化資料表。
- flush privileges;:手動讓權限更改生效。
PHP
- http://science4everyone.net/file/丁志仁
- 點擊 jjnote.php
<?php if(!isset($noSession) || !$noSession){@session_start();} // 打開 session ,提供登入功能 define("CMS",'alone'); // 定義 CMS 常數,設定沒有和其他的 CMS 整合 define('DSN',"mysql://assistant:aide@4#@db01.coowo.com:3355/assistant"); // 定義 DSN 常數,提供連結 MySQL 帳密 define("CLASS_HTML_PATH",'/et/class'); // 定義 物件/類別 定義的網址 define('CLASS_FILE_PATH','/var/www/vhosts/science4everyone.net/httpdocs/et/class'); // 定義 物件/類別 定義的位置 include_once CLASS_FILE_PATH."/database/etable.php"; // 載入 etable 類別 include_once CLASS_FILE_PATH."/wiki/wiki.php"; // 載入維基語法類別 $ET = new etable; // 灌模產生 $ET 物件 $ET->css='default'; // 指定外觀 $ET->sql[0]="select webContent from jjnote order by nid desc"; // 指示 $ET 物件的 SQL 指令 $ET->perpage=20; // 指示每頁幾筆 $ET->colAlias=array('webContent'=>'臨時筆記'); // 指示欄的代稱 $ET->formType=array( 'webContent'=>array('auto',array('wiki')), // 指示各欄怎麼和使用者互動 ); $ET->users=array( '丁志仁'=>array('psd'=>'p86651339k','editable'=>7,'grp'=>array('4')) // 指示可以登入的使用者 ); $ET->search=array('webContent'); // 指示全文蒐索欄 $ET->tran=1; // 指示要顯示欄值還是欄值的提示 $ET->main(); // 驅動物件主函式 ?>
在 mediawiki 中使用 CSS 與 javascript
一、自訂css
對所有頁生效
在較新的版本中改 shared.css 和 commonPrint.css 沒用,要編輯頁:MediaWiki:Common.css 才有用。
- 起先 wiki_page 表中沒有這一頁。
- 但仍可編頁:MediaWiki:Common.css,其預設內容為「/* 此 CSS 會套用至所有的介面外觀 */」。
- 一旦儲存變更後, wiki_page 表中即新增此頁,且套用到介面上。其名字空間為「8」。
- 可使用「@import url(http://jendo.org/mm/treestyles.css);」載入外部的 css
- 上述指示也可改為「mw.loader.load('http://jendo.org/mm/treestyles.css','text/css');」用資源載入方法(javascript全域函式)載入外部的 css
進一步請參考:手冊:樣式表
對特定頁生效
參考Mediawiki 外掛中的設定方法,完成 CSS 外掛設定之後,在該頁中加:
- {{#css:MyStyles.css}} 或 {{#css:/skins/MyStyles.css}} ;
- 或直接在解析器函數中寫入 CSS 規則,如下例所示:
{{#css: body { background: yellow; font-size: 20pt; color: red; } }}
二、自訂javascript
- 起先 wiki_page 表中沒有這一頁。
- 但仍可編頁:MediaWiki:Common.js,其預設內容為「/* 此 JavaScript 會用於使用者載入的每一個頁面。 */」。
- 一旦儲存變更後, wiki_page 表中即新增此頁,且套用到介面上。其名字空間為「8」。
- 可使用「mw.loader.load('http://jendo.org/mm/marktree.js');」來載入外部的 javascrip 。
進一步請參考:JavaScript英文說明
三、請看 示範
PHP 與 javascript 語法比較
項目 | PHP | javascript | 備註 | ||||
---|---|---|---|---|---|---|---|
一、基本表示法 | |||||||
包裹 | <SCRIPT language='php'>…</SCRIPT>或 <?…?>或<?php…?> | <SCRIPT language='javascript'>…</SCRIPT>或 <SCRIPT type='text/javascript'>…</SCRIPT> | |||||
二、敘述 | |||||||
概述 | 以敘述為基本操作單位,敘述由「資料」「算符」「;」共同構成。
| ||||||
基本說明 | 「;」代表 敘述結束 | ||||||
換行不等於「;」 | 敘述未加「;」換行等於「;」 | ||||||
多個敘述可以寫在同一行 | |||||||
/*…*/。不可以巢狀。 | 多行註解 | ||||||
//或# | // | 單行註解 | |||||
@ | 錯誤抑制 | ||||||
全形空白解譯為半形空白 | 晚期瀏覽器版本 | ||||||
三、資料型態 | |||||||
純量 | 數值 | 實字 | 某某 (十進位) 0某某(八進位) 0x某某(十六進位) 某某e某某(科學記號) | javascript 型別 | |||
型態 | 分整數(integer)、浮點數(float) | 只有number一種型別 | number | ||||
字串 | 實字 | 引號包住字串 | string | PHP還多了自訂引號 | |||
跳脫字元 | 「"」中除「\'」外「\」是跳脫字元,「'」中除「\'」外「\」是字 | 「"」「'」中「\」都是跳脫字元 | |||||
\n、\r、\t、\\、\"、\'、\一到三位數字(以8進位指定字元)、\x一到二位數字(以16進位指定字元) | |||||||
\$、\s(空白) | \b(倒退)、\f(欄位)、\u一到四位(以16進位unicode指定字元) | ||||||
註標索引 | 代表第幾個字元 | ||||||
布林 | 實字 | 真:true、非0;假:false、0、null | boolean | ||||
複合 | 陣列 | 實字 | array() | [],但字串索引無法用實字表達 | object | ||
索引 | 可用字串索引及註標索引,可多維 | ||||||
元素數 | count(陣列名) | 陣列名.length | |||||
物件 | 實字 | 無實字 | {屬性名:屬性值,屬性名:屬性值,…物件:{物件值}…} | ||||
特殊 | NULL | 實字 | null | ||||
資源 | 有 | 無 | |||||
函式 | 實字 | 非資料,無實字 | function(…){…} | function | |||
自動生成物件 | 不會 | 將實字派入常數或變數,該常數或變數不需要new,自動獲得相關原生類別的諸屬性與諸方法 | |||||
四、常數、變數 | |||||||
常數 | 宣告 | define("常數名",常數值); | 只可用純量 | const 常數名=常數值; | 所有資料型態皆可 | ||
錯誤 | 對常數派值(=…)或重宣告都會發生錯誤 | 重派值(=…),值不變但也不發生錯誤,但重宣告一個既有常數會發生錯誤 | |||||
變數 | 變數名 | 大小寫不同。 | 建議用camelCasing 命名規則 | ||||
可用中文,中文視為字母、數字之組合 | 不可用中文 | ||||||
以「$」開頭,「$」之後可以用字母、_ | 第一個字必須是英文字母 | ||||||
開頭之後可以用數字、字母、_。 | |||||||
範圍 | 用var宣告,物件是變數的一種,函式內宣告或派初值者為區域變數,函式外宣告或派初值者為全域變數 | ||||||
函式內外皆未宣告,卻在函式內派初值者,IE視為區域變數,Firefox視為全域變數 | |||||||
宣告 | 一次宣告多個變數:var 變數=值,變數=值… | ||||||
限制 | 函式不能當變數 | 函式可以當變數 | |||||
刪除變數 | unset(變數們); | delete 變數; | |||||
保留字 | 待查 | if、else、for、while、var | |||||
五、運算 | |||||||
算符 | 指派(=),加(+),減(-),乘(*),除(/),餘數(%),二元算符(+=,-=,*=,/=,%=,&=,^=,|=,<<=,>>=),遞增遞減(++,--),比較(<,>,==,===,<=,>=,!=,<>),邏輯(true,非0,false,0,||,&&,!),位元(&,|,^,~,<<,>>),三元算符(?:),宣告變數(var),造物件(new) | ||||||
屬性及方法(->),字串連接(.),自訂引號(<<<),參考算符(&),抑制錯誤算符(@),執行作業系統命令(`…`) | 屬性及方法(.),字串連接(+),位元無號右移(>>>) | ||||||
六、敘述區塊 | |||||||
概述 | 以{}包住一群敘述,分號加在大括號中每一敘述 | ||||||
控制敘述 | exit; | 程式段落標籤: | |||||
break(跳到迴圈的下一道敘述),continue(跳過迴圈中以後的部分,跳到迴圈頭) | 可跳至段落標籤 | ||||||
迴圈 | while(條件){合條件時做的事} do{…}while(條件) for(設初值;條件;設下一值){…} | ||||||
foreach($陣列 as 用變數1代表元素的鍵=>用變數2代表元素的值){使用前面的變數製作敘述;} while($xxx=each($陣列)){$xxx[0]或$xxx['key']代表每個元素的鍵,$xxx[1]或$xxx['value']代表每個元素的值} | for(變數 in 物件){物件的每個屬性或方法做一次,變數名代表屬性或方法, 物件名[變數名]代表其值,方法的值是「function 方法名(){[native code]}」 | javascript中陣列是物件 | |||||
條件 | if(條件一){做一}else{做其他} switch(變數){case 值一:做一;break;case 值二:做二;break;case 值三:做三;break;…default:做其他;break;} | ||||||
elseif | else if | ||||||
例外 | try{敘述或用throw強制產錯誤碼}catch{依錯誤碼做動作}finall{無論有無錯誤都執行} | ||||||
七、函式 | |||||||
函式表示法 | function 函式名(諸引數){…return 傳回值;…} | ||||||
函式參數 的預設值 | function 函式名(引數=預設值){……} | function 函式名(諸引數){在裡面設預設值}
| |||||
資料表示法 (敘述集合) | $變數乙=create_function(諸引數字串,諸敘述列字串);
| var 函式變數乙=function(引數){…};此為敘述所以最後還要加「;」
| |||||
八、類別與物件 | |||||||
類別 | class 類別名{諸屬性;諸方法;} | function 類別名(引數){this.屬性=運算式;} | |||||
物件 | 屬性不加(),方法加() | ||||||
new 類別名; | new 類別名(); with(物件名){敘述省略物件名} | ||||||
原生類別 | String、Number、Boolean、Array、Math、Date、Function | 由語言提供屬性方法 | |||||
自訂類別 | 由使用者定義類別,由類別生方法 | 由程式提供屬性方法 | |||||
寄主物件 | window(瀏覽器)、document(文件)方法 | 由環境提供屬性方法 | |||||
DOM物件:所有角括號所括的標籤都是
| |||||||
九、事件 | |||||||
概述 | 事件處理器本質是變數(屬性),而其值放入函式,值的資料型別必須為「function」 事件處理器均以on開頭 | ||||||
表示法 | 標籤中:<標籤 事件處理器='指令'> 程式中:物件名.事件處理器=處理函式 | ||||||
使用者觸發 | 事件 | 事件處理器 | |||||
onmouseover | onmouseover | ||||||
submit | onsubmit | ||||||
瀏覽器觸發 | 載入完畢 | onload | |||||
伺服器觸發 | 請求進度改變 | onreadystatechange |