2015年10月1日 星期四

[php]處理透明背景圖檔

就在要處理圖片之前加入這段就好了
imagesavealpha($source_img, true);
$color = imagecolorallocatealpha($source_img, 0, 0, 0, 127);
imagefill($source_img, 0, 0, $color);

ex:
$imgInfo = getimagesize($source_img);
$width = $imgInfo[0];
$height = $imgInfo[1];

$image_new = imagecreatetruecolor(800, ($height * (800/$width)));

imagesavealpha($image_new , true);
$color = imagecolorallocatealpha($image_new , 0, 0, 0, 127);
imagefill($image_new , 0, 0, $color);

imagecopyresampled($image_new, $source_img, 0, 0, 0, 0, 800, ($height * (800/$width)), $width, $height);

return $image_new;

2015年9月21日 星期一

Facebook API v2.4 get email 與 reloadapi

第一種:
FB.api('me/?fields=email,name,id',

第二種:
FB.api('/me', function (user) {.....},
{ fields: 'id,first_name,last_name,email,gender,name'});

API reload
FB.XFBML.parse()

2015年7月29日 星期三

[AWS][RDS] time_zone 時區設定

自架的MySQL因為有ADMIN權限
設定上沒有什麼太大的問題 

但自從用AWS的RDS後
它竟然沒有辦法設定時區
所以就用偷吃步的方向,做一個PROCEDURE

然後再每次SQL 交易前先CALL一下這個PROCEDURE


DEFINER=`root`@`%`

如果出現沒SUPER權限,記得把上面語法拿掉

DELIMITER //
CREATE DEFINER=`root`@`%` PROCEDURE `store_time_zone`()
IF NOT (POSITION('rdsadmin@' IN CURRENT_USER()) = 1) THEN
SET SESSION time_zone = '+8:00';
END IF//
DELIMITER ;

2015年6月25日 星期四

[C#][php] POST json data TO a PHP page

原本只是很簡單的,跨頁傳值從C#到php
沒想到搞了半天,php那端一直接收不到json值


string json = "{\"user\":\"test\"," +
                "\"n\":\"2\"}";
var webAddr = "http://";
var httpWebRequest = (HttpWebRequest)WebRequest.Create(webAddr);
httpWebRequest.Method = "POST";
httpWebRequest.ContentType = "application/json";
httpWebRequest.ContentLength = json.Length;

using (var streamWriter = new StreamWriter(httpWebRequest.GetRequestStream()))
{
     streamWriter.Write(json);
     streamWriter.Close();
}

var httpResponse = (HttpWebResponse)httpWebRequest.GetResponse();
using (var streamReader = new StreamReader(httpResponse.GetResponseStream()))
{
     var result = streamReader.ReadToEnd();
     //return result;

}


找了很久,原來是php那端看不懂,C#這邊傳過去的json格式
在php接收那端需加上

// Error handling is left as an exercise
$input = json_decode(file_get_contents('php://input'), true);

這樣就行了,然後這是php端的改法
C#端也有另一種寫法


string postData = "user=" + HttpUtility.UrlEncode("test") +
                  "&n=" + HttpUtility.UrlEncode("2");

byte[] byteArray = Encoding.ASCII.GetBytes(postData);

string postData = "json=" +
                HttpUtility.UrlEncode(serializer.Serialize(p));

php端:

$json_array = json_decode($_POST['json']);

2015年5月25日 星期一

[mysql] RDS 中文 全文檢索

我使用的版本是5.6.XX

一開始也是一樣,先建FULLTEXT

ALTER TABLE 表名 ADD FULLTEXT(欄位1, 欄位2...)

然後就可以開始搜尋了…

SELECT *
FROM TABLE
WHERE MATCH (欄位1) AGAINST ('旅行*' IN BOOLEAN MODE)

word* 列出所有以word開頭的字,這個星號不能改變位置只能放最後

因為無法判定文字斷句,只好用 * 來補強…
但對中文字來說,還是非常不足…

如果大大有其他方法,請不要吝嗇告知一下,非常感謝QQ

2015年5月21日 星期四

[mysql] utf9mb4 4byte utf8

中文字其實是很麻煩的

今天就遇到了一個,越南的一個城市

北"𣴓"省,中間這字就是用utf8 4byte存的
導至一般的utf8 會有問題

一開始以為把mysql的字符集改成 utf8mb4

結果手動新增還是錯誤

最後查了一下,改完字符集後

還要再執行

SET NAMES utf8mb4;

2015年5月8日 星期五

[php]圖片壓縮

/*
PHP 圖片壓縮
$file 為檔案位置
$quality 為壓縮比例
$tofile 為儲存位置
*/

$file ="test.jpg";
$quality = 50;

switch (exif_imagetype($file)) {

    case IMAGETYPE_PNG :
        $img = imagecreatefrompng($file);
        break;
    case IMAGETYPE_JPEG :
        $img = imagecreatefromjpeg($file);
        break;
    default:
        throw new InvalidArgumentException("錯誤發生");
        exit();
        break;
}

@imagejpeg($img, $tofile, $quality);

//印在畫面上
//header('Content-Type: image/jpeg');
//@imagejpeg($img, NULL, $quality);

//釋放記憶體
@imagedestroy($img);

2015年5月1日 星期五

[編碼]windows,linux編碼問題

今天把Server換成Linux,

結果之前在Windows沒出現過的問題,

都出現了XD

檔案大小寫,一般來說以小寫為主

再來就是上線後

<head></head>

的東西都跑到

<body></body>

中間多了一個很大的空白,把東西都擠下來

好在有同事幫忙,原來是檔案編碼問題

存成UTF-8有兩種,一種檔首有含BOM,這個就會造成上面問題

所以要把檔案存成UTF-8檔首沒有含BOM的格式。

2015年4月27日 星期一

正規表示式

日期格式 yyyy-mm-dd
/^([0-9]{4})[./]{1}([0-9]{1,2})[./]{1}([0-9]{1,2})$/g

[php]取得圖片尺吋

PS:必須要安裝 GD 函式庫

<?php
$arr = getimagesize("圖片位置");

/**
 * $arr[0] 寬
 * $arr[1] 高
 * $arr[2] 格式
 * $arr[3] 寬和高,內容為: width="xxx" height="yyy"
 */
?>

2015年3月19日 星期四

[mysql] 之於MSSQL XML PATH

在MSSQL中,要合併多筆資料到同一個欄位

可以用 XML PATH來實現

SELECT T1.id, T1.type
          ,(SELECT [DESC] + ''
          FROM   @TABLE AS T2
          WHERE  T2.id = T1.id  FOR XML PATH('')) AS [DESC]
FROM @TABLE AS T1
GROUP BY id, type


而在MYSQL中,可以用GROUP_CONCAT來實現

SELECT date_format(T.T1,'%Y%m') AS d
              ,GROUP_CONCAT(T.ID) AS id
FROM @TABLE AS T
GROUP BY date_format(T.T1,'%Y%m')

2015年3月17日 星期二

[php] CI 同時連MSSQL與MYSQL

在\application\config\database.php裡加上

$db['default']['hostname'] = 'SQL伺服器名稱';
$db['default']['username'] = '使用者名稱';
$db['default']['password'] = '使用者密碼';
$db['default']['database'] = '資料庫名稱';
$db['default']['dbdriver'] = 'mysql';
$db['default']['dbprefix'] = '';
$db['default']['pconnect'] = TRUE;
$db['default']['db_debug'] = TRUE;
$db['default']['cache_on'] = FALSE;
$db['default']['cachedir'] = '';
$db['default']['char_set'] = 'utf8';
$db['default']['dbcollat'] = 'utf8_general_ci';
$db['default']['swap_pre'] = '';
$db['default']['autoinit'] = TRUE;
$db['default']['stricton'] = FALSE;

$db['default']['hostname'] = 'SQL伺服器名稱';
$db['default']['username'] = '使用者名稱';
$db['default']['password'] = '使用者密碼';
$db['default']['database'] = '資料庫名稱';
$db['default']['dbdriver'] = 'sqlsrv';
$db['default']['dbprefix'] = '';
$db['default']['pconnect'] = TRUE;
$db['default']['db_debug'] = TRUE;
$db['default']['cache_on'] = FALSE;
$db['default']['cachedir'] = '';
$db['default']['char_set'] = 'utf8';
$db['default']['dbcollat'] = 'utf8_general_ci';
$db['default']['swap_pre'] = '';
$db['default']['autoinit'] = TRUE;
$db['default']['stricton'] = FALSE;

怎麼連接MSSQL請看[php]CI 連接 MSSQL(使用apache)

第一個為預設
$this->load->database();

第二個就要改成
$this->load->database("資料庫名稱",TURE);

接下來

在你要轉換資料庫的語法上面加
$this->msdb= $this->load->database('資料庫名稱', TRUE);
$this->msdb->query('SELECT top 10 * FROM test_db')->result();

原本的就
$this->load->database();
$this->db->query('SELECT top 10 * FROM test_db')->result();

[php]CI 連接 MSSQL(使用apache)

還是要抱怨一下!
都換PHP了,竟然還要連MSSQL

在網路上試了幾個方法
最後終於成功啦!!

先去微軟官網,依照你的php版本,下載不同的Drivers
Microsoft Drivers for PHP for SQL Server

再去微軟官網,下載
Microsoft® ODBC Driver 11 for SQL Server® - Windows

修改\php\php.ini

把原本的
;extension=php_mssql.dll
改成
extension=php_pdo_sqlsrv_XXXXX.dll
extension=php_sqlsrv_XXXXX.dll

也可以不修改它,直接增加這兩行
修改得話,記得前面的";"號要拿掉,這是註解的意思

再把
mssql.secure_connection = On  <=Off 改成On

Apache 重啟!很重要!,但我只說一遍!


接下來換CI的config設定

\application\config\database.php

$db['default']['hostname'] = 'SQL伺服器名稱';
$db['default']['username'] = '使用者名稱';
$db['default']['password'] = '使用者密碼';
$db['default']['database'] = '資料庫名稱';
$db['default']['dbdriver'] = 'sqlsrv';
$db['default']['dbprefix'] = '';
$db['default']['pconnect'] = TRUE; -> FALSE
$db['default']['db_debug'] = TRUE;
$db['default']['cache_on'] = FALSE;
$db['default']['cachedir'] = '';
$db['default']['char_set'] = 'utf8';
$db['default']['dbcollat'] = 'utf8_general_ci';
$db['default']['swap_pre'] = '';
$db['default']['autoinit'] = TRUE;
$db['default']['stricton'] = FALSE;

如果
$db['default']['pconnect'] = TRUE;

不做修改的話
需修改
\system\database\drivers\sqlsrv\sqlsrv_driver.php

function db_pconnect()
{
retrun $this->db_connect(TRUE);
}


同一個檔案,一定要修改的
function affected_rows()
{
return @sqlsrv_rows_affected($this->conn_id);
}


這樣就OK啦!

2015年3月4日 星期三

[php]時間格式取到毫秒

在C#就
.ToString("yyyyMMddHHmmssfff")

就可以顯示到毫秒了

在PHP沒有這個功能,但有一個 microtime() 函數可以用

<?php
     echo(microtime());
?>

0.25139300 1138197510

前面後面單位都是秒,所以要只顯示一個數字的話 microtime(TRUE)就可以了

到重點了,那PHP如何顯示成跟C#一樣

list($usec, $sec) = explode(" ", microtime());

$date = date("YmdHisx",$sec);

echo str_replace('x', substr($usec,2,3), $date);

這樣就行啦!

2015年2月13日 星期五

[php]Object search value LIKE list.where

在C#中有

List.Where(x => x.value == value).ToList();

那在PHP中也有類似的

value = 5;
$Result = array_filter (
    $Object, function($x) use (value) {
        if(($x['value']) == value)
        return $x;
    }
);

回傳是一組Object


2015年2月9日 星期一

[php]二進位唯一表示法

一般用於checkbox,多筆資料存入同一欄位

("蘋果":"1")
("梨子":"2")
("檸檬":"4")
("西瓜":"8")
("草莓":"16")
("橘子":"32")

選擇"西瓜","草莓","梨子"儲存值為:8 + 16 + 2 = 26


取出時:
$i = 26;
while ($i >= 1) {
    echo pow(2,floor(log($i,2)));
    $i -= pow(2,floor(log($i,2)));
}

2015年1月16日 星期五

64-BIT SQL 查詢 32-BIT SQL 2000 LINKED SERVER錯誤(MSG 7311)

在64-bit 的SQL 用戶端對32-bit 的SQL 2000 或SQL 7.0的linked server作查詢時,會有如以下的錯誤訊息:
OLE DB provider "SQLNCLI10" for linked server "XXXXX" returned message "Unspecified error". OLE DB provider "SQLNCLI10" for linked server "XXXXX" returned message "The stored procedure required to complete this operation could not be found on the server. Please contact your system administrator.". Msg 7311, Level 16, State 2, Line 1 Cannot obtain the schema rowset "DBSCHEMA_TABLES_INFO" for OLE DB provider "SQLNCLI10" for linked server "XXXXX". The provider supports the interface, but returns a failure code when it is used.

一般解法為:
解法是32-bit的SQL 2000或SQL 7.0需升級SP3或SP4,
並手動執行附在SP3及SP4裡的nstcat.sql升級stored procedure
(預設路徑C:\Program Files\Microsoft SQL Server\MSSQL\Install)。

小弟查到的解法為:

從64位元的SSMS去Query 32位元的Linked server時,會回傳錯誤。
但昨天意外發現Open Query可以避掉這個error.

Select * From OPENQUERY(LinkedServerName,'select * from XXXXX')