顯示具有 php 標籤的文章。 顯示所有文章
顯示具有 php 標籤的文章。 顯示所有文章

2024年6月24日 星期一

PHP 於windows平台啟動 Unable to load dynamic library 'ext\\php_curl.dll' 如何排除?

 

太久沒碰PHP 設定了  在要使用curl時才發現 出現 Unable to load dynamic library 'ext\\php_curl.dll' 問題,原以為是版本或extension 路徑沒指向對,瞎找了一陣子,但後來想想 其它的dll 都可以載入正常為啥就php_curl  和OpenSSL 不能呢?


後來查到原來PHP 在5.6.6 之後可能會有因 php_curl.dll 和 ssleay32.dll/libssh2.dll/libeay32.dll 有匹配的問題,導致模組無法正常啟動,這從LOG檔中只會和你說無法載入,但並沒告訴你是因為它所用到的LIB有問題而造成, 因此如果要修正此問題


就要在 Apache.conf 之中 於loadFile 時手動將會用到dll 設定載入上來,如下:


LoadModule php5_module "C:/php-5.6.40/php5apache2_4.dll"
AddType application/x-httpd-php .php
PHPIniDir "C:/php-5.6.40"
# load curl and open ssl libraries
LoadFile "C:/php-5.6.40/libeay32.dll"
LoadFile "C:/php-5.6.40/ssleay32.dll"
LoadFile "C:/php-5.6.40/libssh2.dll"

再重啟apache 即可正常載入使用

2020年5月7日 星期四

PHP程式更新後確沒有更新,有沒有想到是程式碼cache(opcache)?


最近在維護一個客戶的PHP系統
建置及虛擬空間都是別人的,所以很多設定都是不明確的

因此程式碼調整後更新上去,發現似乎沒有作用
花了不少時間確認自己的寫法,最後確認應該不是自己的問題
才想到會不會是 cache  造成?

寫了幾隻小程式,新寫的程式一丟上顯示符合預期
再改再丟上去更新後,顯示還是舊的版本,Shit 真的猜中了

再用個phpinfo() 來看看設定

嗯.....出現了以下錯誤

Warning:phpinfo() has been disabled

很好,沒有php 沒有啟用 phpinfo ,多半管這麼多的,一定設定了很多怪東東
上網查了一下php 的 cache 解決方案

最多人在提的就是 APC  及OPcache

先來試試APC,查了一下 除了設定參數外,可以用以下函式來清除快取,這種最好測試了

apc_clear_cache();
執行後出現了  undefined function ...所以看來不是啟用APC
再來換OPcache,查了一下,一樣他有函式就可以清除快取,執行如下:

opcache_reset();
用了,哈~真的就是它,程式總算可以正常了


相關參考連結:
http://blog.roachking.net/blog/2012/11/30/apc-for-faster-php/
https://www.php.net/manual/en/function.opcache-reset.php

2019年8月1日 星期四

Laravel 驗證訊息如何設定顯示自訂欄位名稱?



Laravel 的驗證功能蠻強大的,但一般的Example在寫時都沒有標示如何顯示自訂欄位名稱
導致在檢核欄位失敗要出現錯誤警訊時,只會顯示html 表單變數名稱,其實 Laravel的驗證模組就有包含這部份的設定了,只是在官網上似乎也沒有多做什麼說明,查了一下,使用上非常容易,只是大多的參考文件都是在強調如何設定自定的錯誤訊息,而非自定欄位名稱

好,那我們來看看要如何設定,如果使用$this->validate進行驗證,則範例如下:
$this->validate($request, [
                    'info' => 'required',
                    'data' => 'required',
                ], ['required' => '這是必填喔'],
                    [
                        'info' => '參考資訊',
                        'data' => '資料',
                    ]
                );


第一個參數傳入  request,  第二個傳入驗證欄位及驗證規則,第三個參數為自定義顯示錯誤,第四個參數就是自定義欄位名稱,就是這麼簡單,不過也花了不少時間去查
如果是使用Validator::make,可以使用setAttributeNames 進行設定,範例如下:

$niceNames = array(
    'info' => '參考資訊',
    'data' => '資料',
);

$validator = Validator::make(Input::all(), $rules);
$validator->setAttributeNames($niceNames);


參考連結:
https://segmentfault.com/q/1010000011839409
https://laravel.tw/docs/master/validation
http://blog.tonycube.com/2015/01/laravel-14-form.html
https://www.ccc.tc/article/laravel-validator-custom-crror-messages

2019年7月18日 星期四

PHP 日期格式字串的轉換EX: YYYY-MM-DD 轉換 MM/DD/YYYY

PHP 日期格式字串的轉換 像YYYY-MM-DD 轉換 MM/DD/YYYY 要如何進行呢?

原本想可能有點麻煩,沒想到出乎意料的容易
真是強大的語言呀

今天要來介紹的就是  strtotime,不過要換格式還是要搭配 date函式,在PHP date 一開始就可以使用制定的格式產出日期字串 ,以下就是Date的格式參數:

a am 或 pm
A  AM 或 PM
d 日,二位數,不足二位數補零; 如 01至 31
D 星期,三個英文字; 如 Fri
F 月份,全名; 如 January
g 小時,12 小時制; 如: 1 至 12
G 小時,24 小時制; 如: 0 至 23
h 小時,12 小時制,不足二位數補零; 如 01 至 12
H 小時,24 小時制,不足二位數補零; 如 00 至 23
i 分; 如: 00 至 59
j 日; 如: 1 至 31
l 星期,全名; 如: Friday
m 月,二位數,不足二位數補零; 如 01 至 12
M 月,三個英文字; 如: Jan
n 月; 如: 1 至 12
O 和格林威治標準時間的小時差異數
s 秒; 如: 00 至 59
S 日之後加的序數; 如: th、nd
t 月的總天數; 如: 28 至 31
T 本機的時區
U 自 1970/1/1 00:00:00 以來的秒數
w 星期,個位數字; 如 0 至 6
Y 年,四位數; 如: 1999
y 年,二位數; 如: 99
z 一年的第幾天; 如: 0 至 365

不在上列的字元將直接顯示。

看來和其它語言的Date Format差不多,但它只點搭配strtotime就更強大了,我們先來解答一下如何將 YYYY-MM-DD 格式的日期字串轉換 MM/DD/YYYY格式呢?
$date1=date("Y-m-d");
$showDate=date("m/D/Y",strtotime($date1));

簡簡單單短短一行就搞定了,原本還想說要自己先將字串 轉成日期變數再去重新定義日期格式產出字串,現在都不用了,而且strtotime判斷日期格式的字串功力還非常的強大,除此之外還有一些特別的日期運算能力,我就不多說直接看範例:

echo strtotime("now"), "\n";
echo strtotime("10 September 2000"), "\n";
echo strtotime("+1 day"), "\n";
echo strtotime("+1 week"), "\n";
echo strtotime("+1 week 2 days 4 hours 2 seconds"), "\n";
echo strtotime("next Thursday"), "\n";
echo strtotime("last Monday"), "\n";

這樣看的懂嗎? 很簡單吧,它還可以進行日期的加總或以設定的時間產出日期字串,除此之外也可以拿來進行日期格式的驗證,範例如下 :

$str = 'Not Good';
// previous to PHP 5.1.0 you would compare with -1, instead of false
if (($timestamp = strtotime($str)) === false) {
echo "The string ($str) is bogus";
} else {
echo "$str == " . date('l dS of F Y h:i:s A', $timestamp);
}

所以對日期格式的轉換或驗證是不是在PHP上更加的容易呢?

參考資料:
https://www.php.net/strtotime

2019年7月16日 星期二

如何排除 Laravel 問題:Cannot use object of type stdClass as array in Laravel



在使用DB查詢後取得查詢結果時出現這個錯誤Cannot use object of type stdClass as array ...
查了一下,發現在Laravel好像蠻多人都有遇到這個問題

$data = DB::table('users')->where('id',$id)->first();
if($data) {
    $user->isOpen=$datapen=$data['isOpen'];
 }

原以為他是Array,應該直接這樣取值即可,但就是會報錯
去查了一下原來要改用以下方式取值才不會報錯

$data = DB::table('users')->where('id',$id)->first();
if($data) {
    $user->isOpen=$datapen=$data->isOpen;
 }

不知為何原理,變成物件了? 但如果直接用dd  去看又說它是array
還是先記下來,以後有空再深入瞭解。

2019年7月3日 星期三

Laravel 如何登出系統?



記錄一下,在Laravel未登出前如果導向到登入頁
預設還是會登入的,所以要先手動登出系統才行

如果在Auth之中,則用以下指令即可
$this->guard()->logout();

如果是從Controller 或是其它地方,則可以直接使用Auth物件
if (Auth::check()) {

Auth::logout();

};

2019年4月4日 星期四

PHP 強大的substr

用久了其它語言再來用PHP
就會覺得 PHP真是強大

程式可以寫的也愈來愈少行,當然愈來愈寫的看不懂 哈
今天來讚嘆一下substr ,最近在處理PHP時才發現原來PHP的substr

之前在寫JAVA,當遇到要從字串截右方算起3字時,程式要寫成這樣


String data=new String("123456abcdef");
data.subString(data.Length()-3,data.Length());

javascript 要用以下寫法:

var data="123456abcdef";
data=data.substr(data.length - 3);

不然也有slice() 可以使用

var data="123456abcdef";
data=data.slice(-3);

而PHP更利害了,可以直接像javascript slice()的寫法就可以了

$data="123456abcdef";
$data=substr($data,-3);

簡簡單單又少人家一些程式碼
真怕寫久了,其它語言回去會有障礙 哈 哈