[SQL] MySQL to PostgreSQL 好痛轉移,SQL語法差異

換資料庫真的好機掰,會有一堆未知問題,見招拆招,紀錄於下

LIMIT OFFSET

/* MySQL */
SELECT * FROM abc WHERE status=1 ORDER BY create_time DESC LIMIT 0 , 10
/* PostgreSQL */
SELECT * FROM abc WHERE status=1 ORDER BY create_time DESC LIMIT 10 OFFSET 0

# UPDATE 不能加 ORDER BY and LIMIT
/* MySQL */
UPDATE abc SET aaa=1 WHERE id<=100 ORDER BY status DESC LIMIT 10

/* PostgreSQL */
/* 若有需求要用子句解決 */
UPDATE abc main SET aaa=1
FROM
 ( SELECT id FROM page_builder WHERE id<=100 ORDER BY status DESC LIMIT 10 ) sub
WHERE main.id = sub.id

PHP

//mysql 取新增的id
mysql_insert_id() mysqli_insert_id();
//PostgreSQL

$re = pg_query($conn, "INSERT INTO foo (bar) values (123);");
$re
= pg_query("SELECT lastval();");
$row
= pg_fetch_row($re);
$insert_id
= $row
[0];

[……]

閱讀更多

[PHP] Fatal error: Uncaught Error: Call to undefined function ldap_connect apache2.4 php7 Windows

因為要用到 PHP  ldap_connect()
Fatal error: Uncaught Error: Call to undefined function ldap_connect()
設定方式網路上很多
主要是設定PHP.ini擴充套件,把前面的註解拿掉

extension=php_imap.dll

如果還不行
Copy PHP 目錄下的 libsasl.dll 到apache中的bin資料夾中

如果還不行
Copy PHP 目錄下的 libeay32.dll 及 ssleay32.dll 到 C:WindowsSystem32 中

基本上該設定的都設定了,但我還是不行,
這是一個怪問題,我用Nginx + PHP7
可以順利的call ldap_connect()
但用 apache2.4 就會跳 Fatal error
怪的是我用相同的PHP7,搞死人,
最後找到原因,以下解決我的問題
修改 PHP.ini

extension_dir = "ext"

改為

extension_dir = "C:/php-7.0.9-Win32-VC14-x64/ext"

也不知道為什麼,用Apache2.4預設的PHP.ini會有這樣的問題,用NginX反而不會
怪怪怪!!!

http://stackoverflow.com/questions/17204437/fatal-error-call-to-undefined-function-mb-detect-encoding

[……]

閱讀更多

[php] json_decode json file to array return NULL

This worked for me

<?php
$json_string = file_get_contents('json_string.txt');
$json_string = preg_replace( '/[^[:print:]]/', '',$json_string);
$obj = json_decode( $json_string , true );
print_r($obj);
exit;
?>

這問題有點見鬼,直接用字串測試,一樣的josn字串,正常,就是放進檔案用json_decode()會拋回個NULL,網路上看了很多方法都沒效,搞了我好久,以下跟大家分享,下方有範例檔

這樣是正常的
<?php
$json_string = '{"aaa":"bbb","0":{"bbb":"bbb","ccc":"ccc"}}';
$obj = json_decode( $json_string , true );
var_dump($obj);
?>
output:
array(2) { ["aaa"]=> string(3) "bbb" [0]=> array(2) { ["bbb"]=> string(3) "bbb" ["ccc"]=> string(3) "ccc" } }
放進檔案就不行
<?php
$json_string = file_get_contents('json_string.txt');
$obj = json_decode( $json_string , true );
var_dump($obj);
exit;
?>
output:
NULL

我覺得應該是檔案中有些隱藏字元導致,也許是跟編碼有關的字元,所以由檔案讀進字串後清除這些隱藏字元,結果成功了~喔耶

$json_string = preg_replace( '/[^[:print:]]/', '',$json_string);

像這樣子

<?php
$json_string = file_get_contents('json_string.txt');
$json_string = preg_replace( '/[^[:print:]]/', '',$json_string);
$obj = json_decode( $json_string , true );
print_r($obj);
exit;
?>


範例檔案下載
download
[……]

閱讀更多

Drop and drag

Drag and drop so simple it hurts
https://github.com/bevacqua/dragula

angular-drag-and-drop-lists
http://marceljuenemann.github.io/angular-drag-and-drop-lists/

GRIDSTACK.JS
http://troolee.github.io/gridstack.js/[……]

閱讀更多

網頁前端 framework 整理

Bootstrap 4 alphahttp://blog.getbootstrap.com/2015/12/08/bootstrap-4-alpha-2/

bootstrap 3 v3.3.7
http://getbootstrap.com/

bootstrap 3 v3.3.1 (中文)
https://kkbruce.tw/bs3/

Foundation for Sites 6
http://foundation.zurb.com/

Google Material design

Polymer Paper Elements Paper elements
https://elements.polymer-project.org/

[……]

閱讀更多

[CSS] 子容器無法撐開父容器 child overflows parent when parent width is 100 percent, parent div can not follow child width

css child overflows parent when parent width is 100 percent, parent div can not follow child width
CSS 當父容器寬為100% (無特殊設定即為100%),子容器寬度超出父容器,父容器無法被子容器撐大,而出現漏白現如下圖

解決方法在父容器中加上

display:inline-block
範例檔案下載
download

[……]

閱讀更多

PHP 正規表達式速查( 眼睛業障重,不要看 )

我的筆記 ( 眼睛業障重,不要看 )

正則表達式
範例

整數
[0-9]+
3704

有小數點的實數
[0-9]+\.[0-9]+
7.93

英文詞彙
[A-Za-z]+
Code

變數名稱
[A-Za-z_][A-Za-z0-9_]*
_counter

Email
[a-zA-Z0-9_]+@[a-zA-Z0-9\._]+
ccc@kmit.edu.tw

URL
http://[a-zA-Z0-9\./_]+
http://ccc.kmit.edu.tw/mybook/

描述

\
將下一個字元標記為一個特殊字元、或一個原義字元、或一個向後引用、或一個八進制轉義符。例如,“n”匹配字元“n”。“\n”匹 配一個分行符號。序列“\\”匹配“\”而“\(”則匹配“(”。

^
匹配輸入字串的開始位置。如果設置了RegExp物件的Multiline屬性,^也匹配“\n”或“\r”之後的位置。

$
匹配輸入字串的結束位置。如果設置了RegExp物件的Multiline屬性,$也匹配“\n”或“\r”之前的位置。

*
匹配前面的子運算式零次或多次。例如,zo*能匹配“z”以及“zoo”。*等價於{0,}。

+
匹配前面的子運算式一次或多次。例如,“zo+”能匹配“zo”以及“zoo”,但不能匹配“z”。+等價於{1,}。

?
匹配前面的子運算式零次或一次。例如,“do(es)?”可以匹配“do”或“does”中的“do”。?等價於{0,1}。

{n}
n是一個非負整數。匹配確定的n次。例如,“o{2}”不能匹配“Bob”中的“o”,但是能匹配“food”中的兩個o。

{n,}
n是一個非負整數。至少匹配n次。例如,“o{2,}”不能匹配“Bob”中的“o”,但能匹配“foooood”中的所有o。“o{1,}”等價於“o+”。“o{0,}”則等價於“o*”。

{n,m}
m和n均為非負整數,其中n<=m。最少匹配n次且最多匹配m次。例如,“o{1,3}”將匹配“fooooood”中的前三個o。“o{0,1}”等價於“o?”。請注意在逗號和兩個數之間不能有空格。

?
當該字元緊跟在任何一個其他限制符(*,+,?,{n},{n,},{n,m})後面時,匹配模式是非貪婪的。非貪婪模式盡可能少的匹配所搜索的字串,而預設的貪婪模式則盡可能多的匹配所搜索的字串。例如,對於字串“oooo”,“o+?”將匹配單個“o”,而“o+”將匹配所有“o”。

.
匹配除“\n”之外的任何單個字元。要匹配包括“\n”在內的任何字元,請使用像“[.\n]”的模式。

(pattern)
匹配pattern並獲取這一匹配。所獲取的匹配可以從產生的Matches集合得到,在VBScript中使用SubMatches集合,在JScript中則使用$0…$9屬性。要匹配圓括號字元,請使用“\(”或“\)”。

(?:pattern)
匹配pattern但不獲取匹配結果,也就是說這是一個非獲取匹配,不進行存儲供以後使用。這在使用“或”字元(|)來組合一個模式的各個部分是很有用。例如,“industr(?:y|ies)就是一個比”industry|industries’更簡略的運算式。

(?=pattern)
正向預查,在任何匹配pattern的字串開始處匹配查找字串。這是一個非獲取匹配,也就是說,該匹配不需要獲取供以後使用。例 如,“Windows(?=95|98|NT|2000)”能匹配“Windows2000”中的“Windows”,但不能匹配 “Windows3.1”中的“Windows”。預查不消耗字元,也就是說,在一個匹配發生後,在最後一次匹配之後立即開始下一次匹配的搜索,而不是從 包含預查的字元之後開始。

(?!pattern)
負向預查,在任何不匹配pattern的字串開始處匹配查找字串。這是一個非獲取匹配,也就是說,該匹配不需要獲取供以後使用。例如 “Windows(?!95|98|NT|2000)”能匹配“Windows3.1”中的“Windows”,但不能匹配“Windows2000”中 的“Windows”。預查不消耗字元,也就是說,在一個匹配發生後,在最後一次匹配之後立即開始下一次匹配的搜索,而不是從包含預查的字元之後開始

x|y
匹配x或y。例如,“z|food”能匹配“z”或“food”。“(z|f)ood”則匹配“zood”或“food”。

[xyz]
字元集合。匹配所包含的任意一個字元。例如,“[abc]”可以匹配“plain”中的“a”。

[^xyz]
負值字元集合。匹配未包含的任意字元。例如,“[^abc]”可以匹配“plain”中的“p”。

[a-z]
字元範圍。匹配指定範圍內的任意字元。例如,“[a-z]”可以匹配“a”到“z”範圍內的任意小寫字母字元。

[^a-z]
負值字元範圍。匹配任何不在指定範圍內的任意字元。例如,“[^a-z]”可以匹配任何不在“a”到“z”範圍內的任意字元。

\b

\B
匹配非單詞邊界。“er\B”能匹配“verb”中的“er”,但不能匹配“never”中的“er”。

\cx
匹配由x指明的控制字元。例如,\cM匹配一個Control-M或回車符。x的值必須為A-Z或a-z之一。否則,將c視為一個原義的“c”字元。

\d
匹配一個數位字元。等價於[0-9]。

\D
匹配一個非數位字元。等價於[^0-9]。

\f
匹配一個換頁符。等價於\x0c和\cL。

\n
匹配一個分行符號。等價於\x0a和\cJ。

\r
匹配一個回車符。等價於\x0d和\cM。

\s
匹配任何空白字元,包括空格、定位字元、換頁符等等。等價於[\f\n\r\t\v]。

\S
匹配任何非空白字元。等價於[^\f\n\r\t\v]。

\t
匹配一個定位字元。等價於\x09和\cI。

\v
匹配一個垂直定位字元。等價於\x0b和\cK。

\w
匹配包括底線的任何單詞字元。等價於“[A-Za-z0-9_]”。

\W
匹配任何非單詞字元。等價於“[^A-Za-z0-9_]”。

\xn
匹配n,其中n為十六進位轉義值。十六進位轉義值必須為確定的兩個數位長。例如,“\x41”匹配“A”。“\x041”則等價於“\x04”&“1”。規則運算式中可以使用ASCII編碼。

\num
匹配num,其中num是一個正整數。對所獲取的匹配的引用。例如,“(.)\1”匹配兩個連續的相同字元。

\n
標識一個八進制轉義值或一個向後引用。如果\n之前至少n個獲取的子運算式,則n為向後引用。否則,如果n為八進位數字(0-7),則n為一個八進制轉義值。

\nm
標識一個八進制轉義值或一個向後引用。如果\nm之前至少有nm個獲得子運算式,則nm為向後引用。如果\nm之前至少有n個獲取,則n為一個後跟文字m的向後引用。如果前面的條件都不滿足,若n和m均為八進位數字(0-7),則\nm將匹配八進制轉義值nm。

\nml
如果n為八進位數字(0-3),且m和l均為八進位數字(0-7),則匹配八進制轉義值nml。

\un
匹配n,其中n是一個用四個十六進位數位表示的Unicode字元。例如,\u00A9匹配版權符號(©)。

http://ccckmit.wikidot.com/regularexpression
(?!abc) 不包含abc字串
<?php
preg_match('/^page_builder_(?!abc).+.php$/',_SELF_DOC_NAME)
?>

 

常用處理涵式

preg_match()

  if(!preg_match('/^page_builder_class.?.php$/',$str))
preg_match_all()
preg_replace()
preg_replace_callback()
//use 為callback所需要其他參數
// (.+) 會存為一個變數
$match[0] = ‘href=”www.yahoo.com”‘;
$match[1] = www.yahoo.com //這就是(.+) ,不只可有一個,方式依此類推
<?php
$html = preg_replace_callback('/href="(.+)"/isU',
function($match) use ($path){
 global $path;
 $url = get_str_between($match[0],'href="','"',true);
 if(!check_url($url)){
  return 'href="'.$path.$url.'"';
 }else{
  return $match[0];
 }
},$html);
?>

preg_match_all(‘~<!–.+?–>~s’, $v->outertext , $match);
foreach($match[0] as $name){
$adname = get_str_between($name,'[‘,’]’,true);
$v->outertext = str_replace($name, ‘[‘.$adname.’]’ , $v->outertext);
}

常用參數

i
不分大小寫

s
是圓點(.)匹配所有字符,包括換行符
如果沒有設定s,則不包括換行符.

U
是反轉了匹配數量的值使其不是默認的重複,而變成在後面跟上“?”才變得重複

<?php
preg_match('/^page_builder_(?!abc).+.php$/isU',_SELF_DOC_NAME)
?>

http://php.net/manual/zh/reference.pcre.pattern.modifiers.php

常用正規
preg_match_all(‘~<!–.+?–>~s’, $html , $match); //取HTML註解
 

相關網址:

字串處理及常規表示式(regular expression)
http://www.j2h.tw/bbs/bbs16/269.html

常用的PHP正規表示式
http://mro-php.blogspot.tw/2009/10/php_19.html

正規表示式 Regular Expressionhttps://atedev.wordpress.com/2007/11/23/%E6%AD%A3%E8%A6%8F%E8%A1%A8%E7%A4%BA%E5%BC%8F-regular-expression/

常用的PHP正規表示式
http://j796160836.pixnet.net/blog/post/29514227-%5B%E8%BD%89%E8%B2%BC%5D%E5%B8%B8%E7%94%A8%E7%9A%84php%E6%AD%A3%E8%A6%8F%E8%A1%A8%E7%A4%BA%[……]

閱讀更多

正規表示法


正規表示式說明及範例比對不成立之字串
/a/含字母 “a” 的字串,例如 “ab”, “bac”, “cba”“xyz”
/a./含字母 “a” 以及其後任一個字元的字串,例如 “ab”, “bac”(若要比對.,請使用 .)“a”, “ba”
/^xy/以 “xy” 開始的字串,例如 “xyz”, “xyab”(若要比對 ^,請使用 ^)“axy”, “bxy”
/xy$/以 “xy” 結尾的字串,例如 “axy”, “abxy”以 “xy” 結尾的字串,例如 “axy”, “abxy” (若要比對 $,請使用 $)“xya”, “xyb”
[13579]包含 “1” 或 “3” 或 “5” 或 “7” 或 “9” 的字串,例如:”a3b”, “1xy”“y2k”
[0-9]含數字之字串不含數字之字串
[a-z0-9]含數字或小寫字母之字串不含數字及小寫字母之字串
[a-zA-Z0-9]含數字或字母之字串不含數字及字母之字串
b[aeiou]t“bat”, “bet”, “bit”, “bot”, “but”“bxt”, “bzt”
[^0-9]不含數字之字串(若要比對 ^,請使用 ^)含數字之字串
[^aeiouAEIOU]不含母音之字串(若要比對 ^,請使用 ^)含母音之字串
[^^]不含 “^” 之字串,例如 “xyz”, “abc”“xy^”, “a^bc”


.


正規表示式的特定字元說明等效的正規表示式
d數字[0-9]
D非數字[^0-9]
w數字、字母、底線[a-zA-Z0-9_]
W非 w[^a-zA-Z0-9_]
s空白字元[ rtnf]
S非空白字元[^ rtnf]


.


正規表示式說明
/a?/零或一個 a(若要比對? 字元,請使用 ?)
/a+/一或多個 a(若要比對+ 字元,請使用 +)
/a*/零或多個 a(若要比對* 字元,請使用 *)
/a{4}/四個 a
/a{5,10}/五至十個 a
/a{5,}/至少五個 a
/a{,3}/至多三個 a
/a.{5}b/a 和 b中間夾五個(非換行)字元


.


字元說明簡單範例
避開特殊字元/A*/ 可用於比對 “A*”,其中 * 是一個特殊字元,為避開其特殊意義,所以必須加上 “”
^比對輸入列的啟始位置/^A/ 可比對 “Abcd” 中的 “A”,但不可比對 “aAb”
$比對輸入列的結束位置/A$/ 可比對 “bcdA” 中的 “A”,但不可比對 “aAb”
*比對前一個字元零次或更多次/bo*/ 可比對 “Good boook” 中的 “booo”,亦可比對 “Good bk” 中的 “b”
+比對前一個字元一次或更多次,等效於 {1,}/a+/ 可比對 “caaandy” 中的 “aaa”,但不可比對 “cndy”
?比對前一個字元零次或一次/e?l/ 可比對 “angel” 中的 “el”,也可以比對 “angle” 中的 “l”
.比對任何一個字元(但換行符號不算)/.n/ 可比對 “nay, an apple is on the tree” 中的 “an” 和 “on”,但不可比對 “nay”
(x)比對 x 並將符合的部分存入一個變數/(a*) and (b*)/ 可比對 “aaa and bb” 中的 “aaa” 和 “bb”,並將這兩個比對得到的字串設定至變數 RegExp.$1 和 RegExp.$2。
xy比對 x 或 y/a*b*/g 可比對 “aaa and bb” 中的 “aaa” 和 “bb”
{n}比對前一個字元 n 次,n 為一個正整數/a{3}/ 可比對 “lllaaalaa” 其中的 “aaa”,但不可比對 “aa”
{n,}比對前一個字元至少 n 次,n 為一個正整數/a{3,}/ 可比對 “aa aaa aaaa” 其中的 “aaa” 及 “aaaa”,但不可比對 “aa”
{n,m}比對前一個字元至少 n 次,至多 m 次,m、n 均為正整數/a{3,4}/ 可比對 “aa aaa aaaa aaaaa” 其中的 “aaa” 及 “aaaa”,但不可比對 “aa” 及 “aaaaa”
[xyz]比對中括弧內的任一個字元/[ecm]/ 可比對 “welcome” 中的 “e” 或 “c” 或 “m”
[^xyz]比對不在中括弧內出現的任一個字元/[^ecm]/ 可比對 “welcome” 中的 “w”、”l”、”o”,可見出其與 [xyz] 功能相反。(同時請注意 /^/ 與 [^] 之間功能的不同。)
[b]比對退位字元(Backspace character)可以比對一個 backspace ,也請注意 [b] 與 b 之間的差別
b比對英文字的邊界,例如空格例如 /bnw/ 可以比對 “noonday” 中的 ‘no’ ;
/wyb/ 可比對 “possibly yesterday.” 中的 ‘ly’
B比對非「英文字的邊界」例如, /wBn/ 可以比對 “noonday” 中的 ‘on’ ,
另外 /yBw/ 可以比對 “possibly yesterday.” 中的 ‘ye’
cX比對控制字元(Control character),其中 X 是一個控制字元/cM/ 可以比對 一個字串中的 control-M
d比對任一個數字,等效於 [0-9]/[d]/ 可比對 由 “0” 至 “9” 的任一數字 但其餘如字母等就不可比對
D比對任一個非數字,等效於 [^0-9]/[D]/ 可比對 “w” “a”… 但不可比對如 “7” “1” 等數字
f比對 form-feed若是在文字中有發生 “換頁” 的行為 則可以比對成功
n比對換行符號若是在文字中有發生 “換行” 的行為 則可以比對成功
r比對 carriage return
s比對任一個空白字元(White space character),等效於 [ fnrtv]/sw*/ 可比對 “A b” 中的 “b”
S比對任一個非空白字元,等效於 [^ fnrtv]/S/w* 可比對 “A b” 中的 “A”
t比對定位字元(Tab)
v比對垂直定位字元(Vertical tab)
w比對數字字母字元(Alphanumerical characters)或底線字母(”_”),等效於 [A-Za-z0-9_]/w/ 可比對 “.A _!9” 中的 “A”、”_”、”9″。
W比對非「數字字母字元或底線字母」,等效於 [^A-Za-z0-9_]/W/ 可比對 “.A _!9” 中的 “.”、” “、”!”,可見其功能與 /w/ 恰好相反。
ooctal比對八進位,其中octal是八進位數目/oocetal123/ 可比對 與 八進位的ASCII中 “123” 所相對應的字元值。
xhex比對十六進位,其中hex是十六進位數目/xhex38/ 可比對 與 16進位的ASCII中 “38” 所相對應的字元。

引用:https://atedev.wordpress.com/2007/11/23/%E6%AD%A3%E8%A6%8F%E8%A1%A8%E7%A4%BA%E5%BC%8F-regular-expression/

(?!abc) 不包含abc字串

<?php
preg_match('/^page_builder_(?!abc).+.php$/',_SELF_DOC_NAME)
?>

[……]

閱讀更多

PHP 陣列轉字串寫入資料庫 Array to string

下方陣列轉字串,字串再轉回陣列,下方提供範例下載

<?php
$arr = array(
'aa'=>'aa',
'bb'=>'bb',
'cc'=>'cc',
'arr'=>array(1,2,3)
);
$str = serialize($arr);
echo $str;
echo '<br/>===<br/>';
$rearr = unserialize($str);
var_dump($rearr);

output

a:4:{s:2:"aa";s:2:"aa";s:2:"bb";s:2:"bb";s:2:"cc";s:2:"cc";s:3:"arr";a:3:{i:0;i:1;i:1;i:2;i:2;i:3;}}
===
array(4) { ["aa"]=> string(2) "aa" ["bb"]=> string(2) "bb" ["cc"]=> string(2) "cc" ["arr"]=> array(3) { [0]=> int(1) [1]=> int(2) [2]=> int(3) } }

範例:
download[……]

閱讀更多