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

2015年5月6日 星期三

Ubuntu 安裝 phpmyadmin 並且換 Port (使用 apache)

開在 aws 的 Ubuntu 發現在連 3306 時還需要 pem 檔,有點麻煩 (因為把 pem 分享出去覺得不恰當),後來乾脆裝 phpmyadmin 可讓其他開發人員去 access database 的部分,因為第一次裝,想說紀錄一下。

但因為 80 已給 web 用,所以要調整 phpmyadmin 的 port,此文我假設已 8888 為主。

因為是測試機,為了方便,同一台 server 提供好多服務,到時候上線時,MySQL 獨立拆出使用一台 server 去服務,就沒這個問題。

ubuntu 上裝 phpmyadmin
sudo apt-get install phpmyadmin

(若已是 root 不需加 sudo)

修改 phpmyadmin 執行的 Port
安裝完成之後,比方說我要執行 phpmyadmin 在 8888 上的 port,要修改:

1. /etc/apache2/ports.conf
加上
Listen 8888
這一行。
(注意在 aws 那邊也要對外開放 8888)

2. 修改 /etc/apache2/apache2.conf
在 IncludeOptional sites-enabled/*.conf 這行之前 (要注意前後文的順序,總之 phpmyadmin 的 apache.conf 要在 site-enabled include 之前載入),加上 Include phpmyadmin 的conf:
# phpMyAdmin Configuration
Include /etc/phpmyadmin/apache.conf

# Include generic snippets of statements
IncludeOptional conf-enabled/*.conf

# Include the virtual host configurations:
IncludeOptional sites-enabled/*.conf

3.  修改 /etc/apache2/sites-available/000-default.conf (看你主要用哪個 conf)
在這個檔案加入新的 VirtualHost,如我開在 8888的 port 上:
<VirtualHost *:8888>
        Alias /phpmyadmin /usr/share/phpmyadmin
</VirtualHost>
Alias 的設定你可以參考 /etc/phpmyadmin/apache.conf 裡面的 Alias 這一行,寫的一模一樣就可以。


4. 重載與重啟 apache
sudo service apache2 restart

注意有沒有出現 fail,如果有,請參考 $ service apache2 restart [fail]

2015年2月10日 星期二

MySQL 分頁的 Store Procedure

之前在某專案上採用前後皆是接 API 的方式來撈資料,說是時程趕,所以幾乎所有的資料都是夠過 Call Store Precedure,當時在處理後台的列表部分,覺得分頁非常難寫...,後來找到很多 Source,不過都寫得太複雜了,最後給大家參考這篇 洞庭小虾 - mysql 分页存储过程 ,算是非常基本款的分頁寫法,不錯用了。

這個分頁的寫法很適用在只撈同一張 Table,或是查詢, 排序,皆可,因為查詢排序都是靠 GET/POST 參數去判斷怎麼串參數到 Store Precedure 而已,重點就是只能撈同一張 Table,這樣這隻 SP 就能走整個後台所有的列表。

但是如果某列表的邏輯需要 Join 其他 Table,那麼你就要複製這隻 SP,另外客製出只符合這個列表的 SP 了,也就是說,就很難拿出來共用了。

比方說產品列表,如果只單純撈產品那張 Table 的東西,那麼這隻 SP 適合用,但是如果產品列表還需要 join 『產品規格』列表的資料進來,那這隻 SP 你可能就要拿出來改一改了。

執行這隻 SP 要記得把 OUT 接出來,可以得到總數,進而算出總共有幾頁。

就是這樣,分頁好煩 (當時覺得 ORM 是天堂),想要一隻 SP 打整個後台的列表,我看是容易  GG 的成分比較高,就算只能寫成一隻,那應該很難維護,可能寫到連自己都看不懂,想到就頭麻...,如果大家有更好的方法也歡迎讓我知道,雖然我很不習慣寫 SP xdd。

2014年12月3日 星期三

MySQL 設定 group_concat_max_len 的最大長度

其實這篇的來由是延續昨天的 GROUP_CONCAT 用法,我沒想到 GROUP_CONCAT 出來的字串會有最大值的限制,以至於在某個頁面上,爬出來的 JSON 格式發現錯誤....。

查了一下 MySQL 的手冊才得知,GROUP_CONCAT 最大值預設是 1024 個字元。

因此,要改變這個最大值的設定,有兩種方法(恩...對我來說是兩種)

1. 修改 my.cnf 檔案,在 [mysqld] 的後面再加上 group_concat_max...

[mysqld]
socket=/tmp/mysql.sock
group_concat_max_len=6000
group_concat_max_len=val,再填入你要的最大值。
如果你是走這個方式,記得存檔後,重啟 MySQL。


2. 在程式端修改
因為我是用 node.js 在開發 web application,所以也就是搭配 co-mysql 的套件,反正各種 web 開發的程式語言大部份都有可以搭配的 mysql 連線跟使用方式,像我就是直接在程式寫下類似這樣的 query 就可以了:


yield $db.query("SET GLOBAL group_concat_max_len=6000");


完。
其實選擇 2. 的原因沒有其他的,只是覺得別人要 clone 這個專案時,我還要特地說明請他去修改 my.cnf ,我會覺得太煩雜而已。


這篇也寫得蠻清楚的:  mysql 环境变量之 group_concat_max_len。


2014年12月2日 星期二

用 MySQL 的 GROUP_CONCAT 組成 Object 格式字串

這邊文章寫得很詳細: MySQL 的 GROUP_CONCAT 函數

今天被 DISTINCT 整個很徹底,嚴格來說也不是整拉,因為我也沒用過,就求一個方便,希望把關聯的資料都 concat 進來,就不用一直撈其他的 table,哎,無力說明,很無奈 xdd。

不過我還是想留一下記錄,畢竟這個對我來說太常用了。

因為我不想在一個網頁上,一直額外的去 query 其他關聯的 table,所以我就想要把關聯的資料用同一隻 Query 就 Query 出來,但是關聯的表單,可能又是一對多,因此我就必須要 concat 那幾筆所有的資料為 Object 的格式(Object 格式只是為了方便我拆解資料而已.. ,也可以依照喜歡的字串去組合),然後就看到了 GROUP_CONCAT 這個功能。


這是我預期的結果:
{ id:"11", title:"第一次,維多利亞港", slogan:"浪漫夜景一日遊" },
{ id:"12", title:"山頂纜車", slogan:"鳥瞰香港" },
{ id:"13", title:"一點心美食", slogan:"便宜又好吃" }",


這是 Query :
SELECT
  .... 
  ...
  GROUP_CONCAT(
       DISTINCT CONCAT(
          '{id:"', titles.id, '", title:"',titles.title,'", slogan:"',titles.slogan,'"}'
       )
       ORDER BY titles.id ASC separator ', ' )  AS 
titles,
  .... 

  FROM XXX as XX
  LEFT JOIN ....
  WHERE ....  

如果不是跟這麼多 select  一起處理的話,簡單的寫法大概是參考這個: Export MySQL to Json 。

寫法類似這樣,也是能夠得到類似的結果,只是沒有跟其他 table 做 join 而已。

SELECT 
  CONCAT("[",
   GROUP_CONCAT(
       CONCAT("{ \"id\":  \" ",  id  , " \" "),
       CONCAT(", \"title\": \" ",  title), " \"}")
       ,"]")
AS json FROM `table_name` WHERE XXX = XXX;


結果是這樣 :  (因為我前後有加 "[", "]",因此 output 結果會直接變成一個 object 的 Array)
[
    { "id":  " 11 " , "title": " 第一次,維多利亞港 "},
    { "id":  " 12 " , "title": " 山頂纜車 "},
    { "id":  " 13 " , "title": " 一點心美食 "}
]

大概是這樣...
這樣的結果還算滿意,至少有達到我要的結果,至於付出多少時間也就值了 T_T 。

2014年10月16日 星期四

MySQL Error Code: 1175 錯誤

其完整的錯誤描述如下:
Error Code: 1175. You are using safe update mode and you tried to update a table without a WHERE that uses a KEY column To disable safe mode, toggle the option in Preferences -> SQL Queries and reconnect.


事件起因:
我想要刪除某個 id 在多對多 table 的所有 row。


解法:
在 Delete From ... 之前加上
SET SQL_SAFE_UPDATES = 0; 

即可解決。

2014年10月14日 星期二

MySQL Illegal mix of collations (utf8_unicode_ci,IMPLICIT) and (utf8_general_ci,IMPLICIT) ... 錯誤

在執行 MySQL 的 Stored Procedures 時,因參數帶入中文而有這樣的錯誤訊息。
簡單來說是跟語系的設定有關,但不管我怎麼修改 database 的 charset 或是 table 的語系,依舊沒有解決這樣的問題,因此在 stored procedures 裡面加了 COLLATE 的語法。

要注意的是 COLLATE 不是加在參數設定的地方,而是在 WHERE = 時為該 field 設定 COLLATE utf8_unicode_ci 的設定。

Example:  不能這樣寫
如果將 COLLATE 的設定寫在參數的地方,MySQL 將會回傳 Error 1235: This version of MySQL doesn't yet support 'COLLATE with no CHARACTER SET in SP parameters,... 的訊息。

DELIMITER $$
CREATE PROCEDURE `ls_cn_sp_getadminuser`(
      IN `_admin_account`  VARCHAR(255) COLLATE utf8_unicode_ci,
      IN `_admin_password` VARCHAR(255) COLLATE utf8_unicode_ci
                                  )
begin
  # 撈出該 adminUser 的資料
  SELECT *
  FROM   `ls_cn_admin_user`
  WHERE  `admin_account` = _admin_account
  AND    `admin_password` = _admin_password;

END


Example:改成這樣寫

DELIMITER $$
CREATE PROCEDURE `ls_cn_sp_getadminuser`(
     IN `_admin_account`  VARCHAR(255),
     IN `_admin_password` VARCHAR(255))
begin
  # 撈出該 adminUser 的資料
  SELECT *
  FROM   `ls_cn_admin_user`
  WHERE  `admin_account` = _admin_account COLLATE utf8_unicode_ci
  AND    `admin_password` = _admin_password COLLATE utf8_unicode_ci;END







2014年7月7日 星期一

使用 elasticsearch-river-jdbc 匯入 MySQL 到 elasticsearch

Github Repo: Elasticsearch-river-jdbc

(本文若有用到 ES,用來代表 elasticsearch 這個詞)

為什麼要用 Elasticsearch-river-jdbc?
因為我想知道怎麼把 MySQL 的資料轉進去,但是,Elastic Search 原生並不支援 MySQL,所以我們需要用一些特殊的方式,去觸發 Elasticsearch 去 reindexing (重新建立 index),而 elasticsearch-river-jdbc 正好是其中一種選擇。



Elasticsearch River
在 elasticsearch 中,river 這個字代表的是一個資料的來源,也是其他資料庫同步資料到 ES 的方法,通常他是以一種 plugin 或是說外掛的方式,裝在一個 ES 上的服務,透過讀取 river 中的資料並且把它 index 到 ES,像是現在官方有提供的 river 有 couchdb, rabbitmq, twitter, wikipedia。


下載與安裝方式
./bin/plugin --install jdbc --url http://xbib.org/repository/org/xbib/elasticsearch/plugin/elasticsearch-river-jdbc/1.2.1.1/elasticsearch-river-jdbc-1.2.1.1-plugin.zip

2013年6月9日 星期日

node.js 之學習 Express 的筆記(3)-搭起資料庫的橋樑(使用MySQL)

恩! 睽違已久的第三篇,終於出現了!!
最近不是偷懶,是太忙(><),
關於前面的幾集,還麻煩大家多多關照&指教。

既然node.js可以是一種使用JavaScript來做前端跟後端的事,那麼讓人開始思考如何使用Express跟資料庫做連結,昨天開始我起手做這件事情,沒想到接二連三的碰壁,這篇會介紹到基本的CURD的操作(是說...難的我也不會,我對SQL並沒有很熟)。 哦!對了,很多網路上的文章是使用MongoDB,不過因為我還是node.js新手,目前還是先選擇使用自己曾經用過的MySQL。




環境背景:


linux環境下(使用上週申請的MiCloud的smartOS作為練習用途的環境)
node.js Express + mysql(記得裝完Express之後要npm install mysql)
然後我的Express資料夾目錄名為miblog (只是個名稱)...

2012年12月15日 星期六

難以理解的SQL語法錯誤

今天在家複習php時,在做登入的功能 : (*acc是account的縮写)
明明是挺簡單的SQL語法結果一直出錯 ,太傻眼了@@,我都想搥牆了...

第一次下的SQL語法 :
$sql =sprintf("SELECT * FROM manager WHERE acc=$acc AND pwd=$pwd");

(把整句$sql語法echo出來)
得到的結果卻是 :
SELECT * FROM manager WHERE acc=win AND pwd=You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '' at line 1
結論 : 語法有問題。

第二次下的SQL語法 :
$sql =
sprintf("SELECT * FROM `manager` WHERE `acc`='".$acc."' AND `pwd`=admin_win LIMIT 1;");
(把整句$sql語法echo出來)
得到的結果卻是 :
SELECT * FROM `manager` WHERE `acc`='win' AND `pwd`=admin_win LIMIT 1;Unknown column 'admin_win' in 'where clause'
甚麼是 Unknown column 'admin_win' in 'where clause' ???
上網找了一下好像也沒什麼特別的解答,但簡單來說撈不到資料應該都是sql語法下錯
果然將整句SQL語法都echo出來就抓到問題了....
看一看才發現原來是admin_win少了 一對單引號把它刮起來

最後一次下的SQL語法 :
$sql =sprintf("SELECT * FROM `manager` where `acc`='".$acc."' and `pwd`='admin_win';");

成功撈到資料:
SELECT * FROM `manager` where `acc`='win' and `pwd`='admin_win';Resource id #6Array ( [id] => 2 [acc] => win [pwd] => admin_win [user_name] => WinWu [last_signin_time] => 0000-00-00 [create_date] => 2012-12-14 )

不曉得發生甚麼事情,就是一直跌跌撞撞,我記得第一種寫法我以前寫過是成功的.....
不管了,總之,完成了!~

2012年6月28日 星期四

note:使用mysql_fetch_assoc取出資料

(這只是個練習)
使用mysql_fetch_assoc取出資料
在資料庫產生一資料表
使用foreach顯示資料表的內容:
<?php
 $link = mysql_connect("localhost", "root", "root") or die("無法連結資料庫!");
 $db_selected = mysql_select_db("test", $link);
 mysql_query ("SET NAMES UTF8");
 
 
 $sql = "SELECT * FROM myword";  
 $result = mysql_query($sql) or die(mysql_error());

 if(mysql_num_rows($result)>0)  //如果資料筆數出過0,代表有資料
 {
  $i=0;    //初始值為0
  while($row = mysql_fetch_assoc($result))
  {

  $array[$i]=$row;
  foreach($array[$i] as $k)
  {
   echo $k."
";
  }
  $i++;
  }
  
 } 

?>


另一種用法(平常使用的):
<?php
 $link = mysql_connect("localhost", "root", "root") or die("無法連結資料庫!");
 $db_selected = mysql_select_db("test", $link);
 mysql_query ("SET NAMES UTF8");
 
 
 $sql = "SELECT * FROM myword";  
 $result = mysql_query($sql) or die(mysql_error());

 if(mysql_num_rows($result)>0)  //如果資料筆數出過0,代表有資料
 {
  $i=0;    //初始值為0
  while($row = mysql_fetch_assoc($result))
  {
   echo $i." ".$row["TITLE"]."
"; 
   $i++;
  }
 } 

?>


以上兩種寫法不同,但都是呈現一樣的結果,




2012年2月5日 星期日

PHP-極簡單之接收POST的資料&Insert到mysql資料表



 db_conn.php
<?php
$link=mysql_connect("localhost","root","root") or die ("連線失敗");
mysql_select_db("guestboard");
mysql_set_charset('utf8',$link);
?>
index.php
<html>
<body>
<form name="form1" method="POST" action="process.php">
帳號<input type="text" name="username" size="30"/><br/>
密碼<input type="text" name="password"size="30"/>
<input type="submit" value="送出"/>
<input type="reset" value="提交"/>
</form>
</body>
</html>
process.php
<?php
include ("db_conn.php");
$username = $_POST["username"];
$password = $_POST["password"];
$sql="INSERT INTO user (username, password) VALUES ('$username','$password')";
$result=mysql_query($sql);
echo $username;
echo $password;
?>


<script>
alert ("申請成功!");
</script>


PHP網頁處理:
GET POST 各有好處
若表單沒有設定method,則預設為GET
使用POST傳送表單,則接收的變數為$_POST
表單一定要包含在<body>標籤裡否則會傳送空值到資料庫。(有時候只會記得打html與form標籤卻忘了body標籤)
不論是$_GET或是$_POST都是超全域變數。


接收表單方式:
POST
$_POST[“欄位名稱”];
GET
$_GET[“欄位名稱”];

 (* $_POST 與 &_GET 最好都是英文大寫)



GET與POST優缺
GET
POST
不適合用來傳帳號密碼
適合較有隱密性的資料傳送
無法傳送大量資料,加上URL頂多255字元
可以傳送大量資料
資料會紀錄在網址上,適合做分頁
切換網頁不能在網址後面加上參數
如果不設定表單的method,會設定GET為預設值


BMI計算
分兩頁面;一頁為bmi.php另一頁為bmi_process.php(接收表單)。

bmi.php
<html>
<head>
</head>
<body>
<form name="form1" method="post" action="bmi_process.php">
BMI計算<br/>
身高: <input type="text" name="height" size="30"/>cm<br/>
體重: <input type="weight" name="weight" size="30"/>kg<br/>
<input type="submit" value="送出計算">
<input type="reset" value="重設">
</form>
</body>
</html>

bmi_process.php
<?php
$height=$_POST["height"];
$weight=$_POST["weight"];
$changm=$height/100;
$bmi=$weight/($changm*$changm);
echo "你好,你的BMI值是".$bmi."<br/>";
if($bmi<18.5)
        echo "BMI<18.5,你體重太輕了";
if($bmi>18.5 && $bmi<24){
        echo "此數值的BMI是正常的";
}
?>

加入javascript驗證欄位(其實也不是什麼很嚴謹的驗證,寫好玩的而已~)

補在bmi.php的<head>裡

<head>
<script>
function check(){
var write_h=document.form1.height.value;
var write_w=document.form1.weight.value;
if(write_h==""){
        alert ("請填入身高");
        return false;
}
if(write_w==""){
        alert ("請填入體重");
        return false;
}
}
</script>
</head>

2011年12月17日 星期六

MySQL Command Line Client環境指令

安裝appserv之後,從目錄底下打開MySQL Command Line Client
開這個的作用就是在處理資料庫,雖然裡面的指令就算不打開MySQL Command Line Client,使用phpmyadmin滑鼠點一點也是做得到,只是書上寫說如果是遇到作業環境是Linux,可能就要懂一下。這個功能我第一次看到xddd
所以打開MySQL Command Line Client之後的畫面第一步就是輸入你的密碼:
登入成功:
































比較常用到的mysql指令如下 : (注意分號 字母結尾es)
(1)show databases;   顯示你所有的資料庫
(2)create database [databasename];    建立一個資料庫。
比方說要建立一個名為booklist的資料庫create database  booklist ;
(3)drop database [databasename]; 刪除資料庫。
比方說要刪除一個名為booklist的資料庫 drop database   booklist ;
(4)use [databasename] ;  use的功能是用來切換資料庫的,假如你原本使用booklist資料庫,現在要切換成另外一個price的資料庫,就是use price;
(5)create table[table name](field type,field type,..) 建立表格,建立表格之前一定要先切換使用資料庫,不然就等於你根本沒告訴電腦你要使用哪一個資料庫,這樣表格要建在哪呢?~
(6)drop table [tablename];


查詢資料select
select *from [table name];

2011年12月15日 星期四

零碎的PHP筆記-album

(1)檔案大小限制:
當我們在做網路相簿的時候,考慮到使用者上傳照片的檔案限制,關於這個部分,php.ini的設定本,本身就有預設了,所以呢... 我們必須要依照他的預設值限制圖檔的大小,如memory_limit>post_max_size >upload_max_size


當我們上傳一個檔案的時候,從表單POST出去的檔案大小,最大是8MB,可以在phoinfo.php裡設定post_max_size設定,但是記住8MB並不是只一個檔案的最大限制大小,是指整個POST出去的大小。


(2)die與exit:
die敘述和exit類似,跳脫程式,也就是後面的程式碼就不執行了。die後面如果有括弧 ,括弧內的文字就是要印出來的文字。
PHP的die函數介紹-http://www.w3school.com.cn/php/func_misc_die.asp


(3)判斷是否為圖檔
函數getimagesize判斷檔案是不是圖檔。
$checkImg=getimagesize($_FILES['uploadfile']['tmp_name']);
if (!$checkImg)
die("此圖格式不是圖檔");

(4) big5轉utf8
試著上傳中文檔名的圖片檔會出現錯誤,utf8的網頁無法處理在big5系統的檔名,可以以iconv函數處裡,iconv只是將檔名轉成utf8 
[PHP]iconv UTF-8轉Big5 無法正常運作問題--> http://plus-now.com/?p=338


(5)Column 'FileType' cannot be null 錯誤
Column 'FileType' cannot be null 就是Column '欄位名稱' cannot be null ,出現這個錯誤表示你已經在mysql設定FileType可以不可以是空值,因此取消這個錯誤就是到phpmyadmin把FileType允許為空值。


(6)把其他檔案嵌入(包含)到目前的php檔案中:
include()
include_once()
require()
require_once() 
include比較能容納更多的功能,比方說require跟include相較之下,include可以放迴圈還有判斷式等等的


(7)把頁面導向某頁面/ 幾秒後導向某頁面
header(); 函式
ex:
<?php
header("location=index.php") ;
?>
重新讀取:
header("refresh:2") ;   //2秒後重新讀取頁面


(8)cookie 丟餅乾給瀏覽網站的人


(9)輸出網頁內容的方式
1. echo  
2.print
3.printf -->能輸出格式化的字串,前兩者不是格式化的字串


類別跟物件:
如果有寫過as3的人都知道比方說要使用Date  還要再用一個new,恩..這樣的說法有點爛...這真的是好久以前的事了, 比方說: 


var now : Date();
now = new Date();


以前在學的時候常不懂為甚麼要用new ,甚麼時候要用new,到最後也不想追究這個問題了,反正就習慣成自然。
像var now : Date 就是定義了變數now的類別的意思,但是這樣只是事先描述這個物體,但不是真的已經產生這個實體,所以才會再用個now真正建立這個實體。 

在網路上我也看過另一種說法,透過new呼叫Date的函式將Date的類別建立出來,這個說法是我暑假在google爬文看到了,這種說法沒有三兩三是看不懂的,就像那時候的我一樣~



















常數:
變數就是會動的,所以常數就是不會變動的,在PHP有內建的自訂的常數。不管是哪一種
(1)常數的名稱前面不可以有$ ,$是變數的,常數的前面沒有$
(2)常數的範圍屬於超級全域 (超級全域函數就是整個程式都可以用)
(3)內建函數通常都是大寫開頭  像PHP_VERSION就是
常見的預設常數有
PHP_VERSION. 
PHP_OS . 
E_ERROR .
 E_WARNING . 
E_NOTICE. 
TRUE.
 FALSE



IP:
$REMOTE_ADDR() 是PHP用來取得使用者IP的變數

Vue multiselect set autofocus and tinymce set autofocus

要在畫面一進來 focus multiselect 的方式: 參考: https://jsfiddle.net/shentao/mnphdt2g/ 主要就是在 multiselect 的 tag 加上 ref (例如: my_multiselect), 另外在 mounted...