MIS WAMP手動安裝及設定教學 Apache2.4 + PHP7 for windows10

手動安裝 Apache2.4 + PHP7 for windows10

首先,我該選x64或x86安裝呢?

何謂 x64 和 x86,可閱讀下方網址文章,本篇不多做解釋
x86和x64到底有什麼差異? http://www.ithome.com.tw/node/56880

注意 !!!

若安裝x64版本,PHP & Apache 都需要選擇x64版本,反之亦然

安裝 PHP7 for windows

本例下載 PHP 7.0 VC14 x64 Thread Safe

php-7.0.10-Win32-VC14-x64.zip

解壓縮至 PHP 的存放目錄
本例解壓縮至 C:php-7.0.10-Win32-VC14-x64

設定 php.ini PHP.ini 為PHP的設定檔

PHP安裝目錄中尚無 PHP.ini
但於安裝目錄中有下列2個檔案
php.ini-development 為開發環境用參考設定檔
php.ini-production    為正式環境用參考設定檔
本例複製 php.ini-development 更名為 php.ini 置於於PHP安裝目錄中 文字編輯器開啟 php.ini

以下為常用設定

視需求調整參數,至於設定內容就不於本篇討論

「C:/php-7.0.10-Win32-VC14-x64/」為PHP安裝目錄

注意!!!!!!!!!!

分隔路徑的斜線,要用「/」而不是 windows 檔案總管的「\」

所以是
「C:/php-7.0.10-Win32-VC14-x64/」

不是
「C:\php-7.0.10-Win32-VC14-x64\

儲存 httpd.conf

Apache安裝為 windows 服務,開機自動啟動

開啟 Win10 的 「命令提示字元(系統管理員)」

// 測試設定檔是否正確

錯誤會跳錯誤訊息,正確會顯示syntax OK,接著安裝服務

// 安裝服務,反之解除安裝為 httpd.exe -k uninstall

測試是否正確運行

在網站根目錄C:/AppServ/www下建立一個index.php檔案

運行 http://127.0.0.1
看到下列畫面,代表安裝成功

呼~打完收工!!

[……]

閱讀更多

[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%[……]

閱讀更多