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);

這樣就行啦!