PHP PHPMailer無法透過Gmail發信,在帳號密碼正確的情況下

我打算用PHPMailer透過Gmail來發信,

但今天一直遇到很怪的問題,帳號密碼都確定正確,
該Google帳密可以登入Gmail,證明帳密是沒錯的,
但還是一直拋出SMTP Error: Could not authenticate.的錯誤訊息,
非常悶,搞好久,最後發現應該是密碼強度問題,
其實我密碼強度已經設很強咧,到底要多強!!
我是用下方亂碼、密碼產生器所產生的密碼,理應不會有問題,
但還是一直拋出SMTP Error: Could not authenticate.的錯誤訊息,
我用下方的「亂碼、密碼產生器」改到第五次才成功,
挑有英文自母大小寫+數字+符號的字串當密碼,
終於成功了 ,呼~搞半天,由此可證:
網頁能登入Gmail不代表該帳密能透過外部的SMTP來發Gmail信,
好像由外部的SMTP來發信的密碼強度有一定規則,
應該是要超強,才有辦法用PHP透過Gmail SMTP來發信
以下為官方的說明文件

Gmail說明 – 用戶端不接受我的使用者名稱和密碼
https://support.google.com/mail/answer/14257

Gmail說明 – 選用安全強度高的密碼
https://support.google.com/accounts/answer/32040

亂碼、密碼產生器http://lab.sp88.com.tw/genpass/

[……]

閱讀更多

PHP SQL 篩選時間

需要用日期來篩選指定日期區間的資料,剛好看到艾倫郭寫的這一篇,用了BETWEEN我覺得還蠻好用的,此篇文章也寫了好幾種方式,十分受用~


若SQL Server裡的 table 裡有一個日期欄位,只會放日期,那麼您可以寫成
SELECT …. FROM xxx WHERE xxx=’2008/1/15′SELECT …. FROM xxx WHERE xxx BETWEEN ‘2008/1/15’ AND ‘2008/1/20’

若日期欄位有包含時間, 由於時間可能值為 2008/1/15 23:59:59.50 如果您想找 2008/1/15 這一天裡的所有記錄(不拘時間), 卻將篩選條件寫成
SELECT …. FROM xxx WHERE xxx=’2008/1/15′ –>會找不到符合的記錄
SELECT …. FROM xxx WHERE xxx BETWEEN ‘2008/1/15’ AND ‘2008/1/16’ –>會連 2008/1/16 的記錄也被找到
SELECT …. FROM xxx WHERE xxx >= ‘2008/1/15’ AND xxx<= ‘2008/1/15 23:59:59’ –>若記錄值是2008/1/15 23:59:59.50 ,會找不到
因此,可以寫成
SELECT …. FROM xxx WHERE xxx >= ‘2008/1/15’ AND xxx < ‘2008/1/16’
就沒什麼問題了

本文出自
http://www.allenkuo.com/EBook5/view.aspx?TreeNodeID=13&id=374
[……]

閱讀更多

PHP imagettftext(): Could not find/open font 解決方法

新的主機PHP版本換成5.5.9版本
原本可用的驗証碼圖驗程式跑出 E_WARNING 的 error reporting如下

imagettftext(): Could not find/open font

無法開啟字型檔,導致圖片無法正常顯示,解法如下:
在imagettftext()前加入putenv(‘GDFONTPATH=’ . realpath(‘.’));

putenv(‘GDFONTPATH=’ . realpath(‘.’));
imagettftext( … );


搞定!!

參考網址
http://stackoverflow.com/questions/6089393/imagettftext-cannot-open-font-file

[……]

閱讀更多

PHP 解決 Deprecated: mysql_connect(): The mysql extension is deprecated and will be removed in the future: use mysqli or PDO instead in

解決方法一:

停用PHP顯示錯誤訊息

這絕對不是個好方法,我個人是不推薦使用,雖然這方法一勞永逸,但在開發PHP時,你將會知道錯誤訊息有多麼美好,Debug時才不會像無頭蒼蠅般,除非程式已經在一個很穩定的階段,不然非必要,不要關閉全部錯誤訊息,還是留給程式可以去設定是否顯示錯誤訊息的彈性。
以下介紹幾種PHP停用錯誤訊息的方法:

在PHP文件中加入,停用PHP錯誤訊息

如果還是出現錯誤訊息,請試下列方法

在.htaccess檔案中加入下面這一行 ( Apache專用 )

如果還是出現錯誤訊息,請試下列方法

在 PHP.ini 中找到 display_errors 這一行,沒這一行則添加,將值改為off。

解決方法二:

PHP排除特定錯誤層級

如果短期間沒打算繼續升級的話,還是可以在PHP5.5 使用 mysqli_connect() ,但停用所有錯誤訊息好像又太極端,下面這方法可以設定錯誤訊息級別,隱藏某些特定的錯誤級別,選擇排除顯示某指定錯誤級別,排除的錯誤級別將不會顯示在錯誤訊息上,排除E_DEPRECATED,mysql_connect()就可以繼續撐拉。

以下例子顯示所有錯誤,除了下列這幾個錯誤級別:

E_DEPRECATED棄用E_NOTICE注意E_WARNING警告E_STRICT嚴格

解決方法

mysql_connect 改用 mysqli_connect()

這是最正規的方式拉,也是最推薦的,就是乖乖升級吧,雖然升級的過程中會有一段陣痛,有點痛,以下提供很簡單的範例。

mysqli_connect() 範例如下

mysqli_connect() 建表SQL如下

[……]

閱讀更多

PHP Deprecated: Function set_magic_quotes_runtime() is deprecated 解決方法

set_magic_quotes_runtime()於 PHP5.3後棄用

在 PHP.net 官方文件中有提到,set_magic_quotes_runtime()於PHP5.3已經棄用,雖然不會造成Fatal error而中斷程式,但會發送E_DEPRECATED的過時警告

Deprecated: Function set_magic_quotes_runtime() is deprecated

替代方案:

set_magic_quotes_runtime(0);

意思同上,以下列方法替代棄用的set_magic_quotes_runtime()

ini_set("magic_quotes_runtime", 0);
這一段主要是修改 php.ini 中 magic_quotes_runtime 參數
用以將SQL語句自動加上跳脫字元反斜線,以防止SQL注入隱碼攻擊(SQL injection)

PHP 5.4起,使用此函數會拋出Fatal error,終止程式運行

Fatal error: Uncaught Error: Call to undefined function set_magic_quotes_runtime()

相容性:

有時在寫PHP並不一定確定針對某一版本去寫,另外目標主機環境百百款,PHP版本也很不固定,每次要針對版本再改就會很麻煩,我覺得相容性就變得很重要,解決方法如下:

把舊版本程式有使用到

set_magic_quotes_runtime(0);

都改為就可以了

ini_set("magic_quotes_runtime", 0);
另外在前面加上@,加上@的意思就是強制不拋錯誤訊息,如下
@set_magic_quotes_runtime(0);
不過我覺得還是不要使用@強制不拋錯誤訊息的作法,
因為有很多時候Debug還是需要錯誤訊息,
當然還有其他方法,其他方法可參考官網文件,

參考資料:

[……]

閱讀更多