엑셀 시트를 선택한 다음에 이름을 지정해서 복사하는 방법이다.

선택한 Sheet : 목록

복사할 Sheet : TEST


Sub Add_Sheet()
    Sheets("목록").Select
    ActiveSheet.Copy After:=Worksheets(Worksheets.Count)
    Worksheets(Worksheets.Count).Name = "TEST"
    
End Sub



시트가 있는지 검사한 다음에 없으면 복사하기

Sub Add_Sheet()
    Dim i As Integer
    Dim exists As Boolean
   
    For i = 1 To Worksheets.Count
        If Worksheets(i).Name = "TEST" Then
            exists = True
        End If
    Next i
   
    If Not exists Then
        Sheets("목록").Select
        ActiveSheet.Copy After:=Worksheets(Worksheets.Count)
        Worksheets(Worksheets.Count).Name = "TEST"
    Else
        MsgBox "시트가 이미 존재합니다"
    End If
    
End Sub



728x90
블로그 이미지

Link2Me

,

http://link2me.tistory.com/822  에 설명된 자료를 보면 되는데 이 코드는 MySQL DB 에 있는 데이터를 내보내기 하는 코드이다.

속도가 느려서 추천하고 싶은 코드는 아니지만 필요할 때가 있을 때 인터넷 검색하고 코드가 맞는지 테스트하고 싶지 않아서 적어둔다.


using Excel = Microsoft.Office.Interop.Excel;


private void ExportToExcelFromMySQL(string fileName, DataGridView dgv, bool elapsedtime)
{
    Excel.Application excelApp = new Excel.Application();
    if (excelApp == null)
    {
        MessageBox.Show("엑셀이 설치되지 않았습니다");
        return;
    }
    Excel.Workbook wb = excelApp.Workbooks.Add(true);
    Excel._Worksheet workSheet = wb.Worksheets.get_Item(1) as Excel._Worksheet;

    try
    {
        System.Diagnostics.Stopwatch sw = new System.Diagnostics.Stopwatch();  //동작시간 체크
        if (elapsedtime == true)
        {
            sw.Start();
        }

        using (var myConn = new MySqlConnection(GetConnectionString()))
        {
            myConn.Open();
            string strqry = "SELECT uid,eng,direct,is_direct,kor,(select classname from category where uid = data.category1) as cate1,(select classname from category where uid = data.category2) as cate2 ";
            strqry += "FROM data ";
            strqry += "where hidden=1 ";
            strqry += "ORDER BY uid DESC";
            using (var cmd = new MySqlCommand(strqry, myConn))
            {
                using (MySqlDataReader reader = cmd.ExecuteReader())
                {
                    if (reader.HasRows)
                    {
                        int r = 0;
                        while (reader.Read())
                        {
                             파일로 저장할 정보 기록
                            csvExport.Write(reader.GetString(0)); csvExport.Write(delimiter);
                            workSheet.Cells[r + 2, 1] = reader.GetString(0);
                            workSheet.Cells[r + 2, 2] = reader.GetString(1);
                            workSheet.Cells[r + 2, 3] = reader.GetString(2);
                            workSheet.Cells[r + 2, 4] = reader.GetString(3);
                            workSheet.Cells[r + 2, 5] = reader.GetString(4);
                            workSheet.Cells[r + 2, 6] = reader.GetString(5);
                            workSheet.Cells[r + 2, 7] = reader.GetString(6);
                            r++;
                        }
                    }
                    else
                    {
                        MessageBox.Show("데이터가 없습니다");
                    }
                }
            }
            myConn.Close();
        }

         // 엑셀 2003 으로만 저장이 됨
        wb.SaveAs(fileName, Excel.XlFileFormat.xlWorkbookNormal, Type.Missing, Type.Missing, Type.Missing, Type.Missing,
            Microsoft.Office.Interop.Excel.XlSaveAsAccessMode.xlExclusive, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing);

        wb.Close(Type.Missing, Type.Missing, Type.Missing);
        excelApp.Quit();
        releaseObject(excelApp);
        releaseObject(workSheet);
        releaseObject(wb);

        if (elapsedtime == true)
        {
            sw.Stop();
            MessageBox.Show("소요시간 : " + sw.Elapsed.ToString() + " 이고 엑셀파일 저장완료");
        }
        else
        {
            MessageBox.Show("CSV 파일이 저장되었습니다");
        }
    }
    catch (Exception ex)
    {
        MessageBox.Show(ex.Message);
        throw;   비정상적인 상황(예외)이 발생한 경우 이를 알리는 데 사용
    }
}

#region 메모리해제
private static void releaseObject(object obj)
{
    try
    {
        System.Runtime.InteropServices.Marshal.ReleaseComObject(obj);
        obj = null;
    }
    catch (Exception ex)
    {
        obj = null;
        throw ex;
    }
    finally
    {
        GC.Collect();
    }
}

#endregion


728x90

'C# > C# SQL' 카테고리의 다른 글

입문자를 위한 C# 과 MySQL 연동 방법 설명  (1) 2016.11.24
C# MySQL Update  (0) 2016.08.22
C# dataGridView CSV 파일로 저장  (0) 2016.01.29
C# MySqlDataReader Format  (0) 2016.01.28
C# SQLite 데이터 삭제 (transaction 반영)  (0) 2016.01.14
블로그 이미지

Link2Me

,

PHP 에서 MySQL 을 접속하고 DB 작업을 편리하게 하는 함수이다.

킴스큐 RB 빌더는 DB 접속 등 함수화를 해서 편하게 코딩하게 만들었다.

하지만 아쉬운 점은 Class 화를 하지 않아서 좀 불편한 면이 있다.

아래 Class 는 나의 사용 환경에 맞게 변경하거나 신규 기능을 추가하여 사용하고 있다.

본인만의 함수를 만들면 코딩이 간단해지고 직관적으로 이해할 수 있다.


MySQL 접속 환경이 MySQL 인가? MySQLi 인가? 에 따라 함수를 선택해서 사용하면 된다.


함수 사용법

===== dbconnect.php ======

include_once $_SERVER['DOCUMENT_ROOT'].'/db.info.php';
require_once $_SERVER['DOCUMENT_ROOT'].'/phpclass/dbClass.php';
$conn=new MySQLDbClass();
$DB_CONNECT = $conn->isConnectDb($DB);


===== db.info.php ===== 파일에는 접속 정보가 들어가 있다.

<?php
$DB['host'] = "localhost";
$DB['name'] = "DB명";
$DB['user'] = "DB접속ID";
$DB['pass'] = "DB패스워드";
$DB['port'] = "3306";
$DB['type'] = "MyISAM";
?>


===== dbClass.php ======

<?php
class MySQLDbClass {

    function isConnectDb($db) {
        $conn = mysql_connect($db['host'].':'.$db['port'],$db['user'],$db['pass']);

        mysql_query("SET CHARSET utf8");

        mysql_query("SET NAMES 'utf8' COLLATE 'utf8_general_ci'");

        if(!$conn){
            die('Not connected :' . mysql_error());
            exit;
        }
        $selc = mysql_select_db($db['name'],$conn); // 접근한 계정으로 사용할 수 있는 DB 선택
        // 연결 식별자($conn) 는 생략 가능하며, 생략시 가장 최근에 설정한 연결 식별자가 사용된다.
        return $selc ? $conn : false;
    }

    //DB-UID데이터
    function getUidData($table,$uid){
        return $this->getDbData($table,'uid='.(int)$uid,'*');
    }

    // DB Query Cutom 함수
    function getDbData($table,$where,$column){
        global $DB_CONNECT;
        $result = mysql_query('select '.$column.' from '.$table.($where?' where '.$this->getSqlFilter($where):''));
        $row = mysql_fetch_array($result);
        return $row;
    }

    // DB Query result 함수
    function getDbresult($table,$where,$column){
        global $DB_CONNECT;
        $result = mysql_query('select '.$column.' from '.$table.($where?' where '.$this->getSqlFilter($where):''));
        return $result;
    }

    //DB데이터 필드 개수
    function getDbColums($table,$where,$column){
        global $DB_CONNECT;
        $result = mysql_query('select '.$column.' from '.$table.($where?' where '.$this->getSqlFilter($where):''));
        return mysql_num_fields($result);
    }

    //DB데이터 레코드 총 개수
    function getDbRows($table,$where){
        global $DB_CONNECT;
        $sql = 'select count(*) from '.$table.($where?' where '.$this->getSqlFilter($where):'');
        //echo $sql;
        $rows = mysql_fetch_array(mysql_query($sql));
        return $rows[0] ? $rows[0] : 0;
    }

    //DB데이터 ARRAY -> 테이블에 출력할 데이터 배열
    // order by : 정렬 순서, limit : 화면에 출력할 개수, curPage : 현재 페이지
    function getDbArray($table,$where,$flddata,$orderby,$limit,$curPage){
        global $DB_CONNECT;
        $curPage = $curPage ? $curPage : 1; // 현재 페이지가 없으면 1로 설정
        $sql = 'select '.$flddata.' from '.$table.($where?' where '.$this->getSqlFilter($where):'').($orderby?' order by '.$orderby:'').($limit?' limit '.(($curPage-1)*$limit).', '.$limit:'');
        //echo $sql;
        $result = mysql_query($sql);
        return $result;
    }

    //DB select
    function getDbSelect($table,$where,$column){
        global $DB_CONNECT;
        $row = mysql_query('select '.$column.' from '.$table.($where?' where '.$this->getSqlFilter($where):''),$DB_CONNECT);
        return $row;
    }

    //DB삽입
    function getDbInsert($table,$key,$val){
        global $DB_CONNECT;
        mysql_query("insert into ".$table." (".$key.")values(".$val.")");
    }

    //DB업데이트
    function getDbUpdate($table,$set,$where){
        global $DB_CONNECT;
        mysql_query('set names utf8');
        mysql_query('set sql_mode=\'\'');
        mysql_query("update ".$table." set ".$set.($where?' where '.$this->getSqlFilter($where):''));
    }

    //DB삭제
    function getDbDelete($table,$where){
        global $DB_CONNECT;
        mysql_query("delete from ".$table.($where?' where '.$this->getSqlFilter($where):''),$DB_CONNECT);
    }

    //SQL필터링
    function getSqlFilter($sql){
        return $sql;
    }

}//end dbClass

class MySQLiDbClass {
    function isConnectDb($db)
    {
        $conn = mysqli_connect($db['host'],$db['user'],$db['pass'],$db['name'],$db['port']);
        mysqli_set_charset($conn, "utf8");  // DB설정이 잘못되어 euc-kr 로 되어 있으면 문제가 됨
        if (mysqli_connect_errno()) {
           printf("Connect failed: %s\n", mysqli_connect_error());
           exit();
        } else {
          return $conn;   
        }
    } // */

    //DB-UID데이터
    function getUidData($table,$uid)
    {
        return $this->getDbData($table,'uid='.(int)$uid,'*');
    }

    // DB Query Cutom 함수
    function getDbData($table,$where,$column) {
        global $DB_CONNECT;
        $result = mysqli_query('select '.$column.' from '.$table.($where?' where '.$this->getSqlFilter($where):''));
        $row = mysqli_fetch_array($result);
        return $row;
    }

    // DB Query result 함수
    function getDbresult($table,$where,$column) {
        global $DB_CONNECT;
        $result = mysqli_query('select '.$column.' from '.$table.($where?' where '.$this->getSqlFilter($where):''));
        return $result;
    }

    //DB데이터 ARRAY -> 테이블에 출력할 데이터 배열
    function getDbArray($table,$where,$flddata,$orderby,$limit,$curPage){
        global $DB_CONNECT;
        $sql = 'select '.$flddata.' from '.$table.($where?' where '.$this->getSqlFilter($where):'').($orderby?' order by '.$orderby:'').($limit?' limit '.(($curPage-1)*$limit).', '.$limit:'');
        $result = mysqli_query($sql);
        return $result;
    }

    //DB데이터 레코드 총 개수
    function getDbRows($table,$where){
        global $DB_CONNECT;
        $sql = 'select count(*) from '.$table.($where?' where '.$this->getSqlFilter($where):'');
        $rows = mysqli_fetch_array(mysqli_query($sql));
        return $rows[0] ? $rows[0] : 0;
    }

    //DB삽입
    function getDbInsert($table,$key,$val){
        global $DB_CONNECT;
        mysqli_query("insert into ".$table." (".$key.")values(".$val.")");
    }

    //DB업데이트
    function getDbUpdate($table,$set,$where){
        global $DB_CONNECT;
        mysqli_query('set names utf8');
        mysqli_query('set sql_mode=\'\'');
        mysqli_query("update ".$table." set ".$set.($where?' where '.$this->getSqlFilter($where):''));
    }

    //DB삭제
    function getDbDelete($table,$where)    {
        global $DB_CONNECT;
        mysqli_query("delete from ".$table.($where?' where '.$this->getSqlFilter($where):''),$DB_CONNECT);
    }

    //SQL필터링
    function getSqlFilter($sql)
    {
        return $sql;
    }

}//end dbClass

?>

728x90
블로그 이미지

Link2Me

,

C# MySQL Update

C#/C# SQL 2016. 8. 22. 06:42

dataGridView 에서 작업한 것을 수정한 결과를 Update 하는 코드이다.

여러개의 자료를 수정한 경우 신규 수정인지 기존 자료 수정인지 검사하는 로직이 구현되어 있다.


private void btnSave_Click(object sender, EventArgs e)
{
    int UpdateCnt = 0; int ModifiedCnt = 0;

    myConn = new MySqlConnection(GetConnectionString());
    if (myConn.State == ConnectionState.Closed)
    {
        myConn.Open();
        DBstatus.Text = "ON";
    }

    try
    {
        foreach (DataGridViewRow row in this.dataGridView1.Rows)
        {
            string uid = row.Cells["uid"].Value.ToString();
            string str1 = row.Cells["content"].Value.ToString();
            string str2 = row.Cells["code"].Value.ToString();
            string d_regis = DateTime.Now.ToString("yyyyMMddHHmmss");

            if (str1 == null || str1.Equals("")) { continue; }  // 수정이 없을 경우
            else if (str2 == Convert.ToString(0))  // 신규 수정
            {
                string strqry = "UPDATE data SET code='" + f2.getCode + "', content='" + str1.Trim() + "', d_modify='" + d_regis + "' Where uid =" + uid;
                MySqlCommand cmd = new MySqlCommand(strqry, myConn);
                cmd.ExecuteNonQuery();
                UpdateCnt++;
                cmd.Dispose();
            }
            else if (str2 == Convert.ToString(f2.getCode))  // 등록자와 동일한 것만 수정여부 검사
            {                       
                string strqry = string.Format("SELECT count(*) FROM data WHERE uid='{0}' and content='{1}'",uid, str1);
                MySqlCommand cmd = new MySqlCommand(strqry, myConn);
                cmd.CommandType = CommandType.Text;
                int RowCount = Convert.ToInt32(cmd.ExecuteScalar());
                cmd.Dispose();
                if (RowCount == 0)
                {
                    strqry = "UPDATE data SET code='" + f2.getCode + "', content='" + str1.Trim() + "', d_modify='" + d_regis + "' Where uid =" + uid;
                    MySqlCommand cmb = new MySqlCommand(strqry, myConn);
                    cmb.ExecuteNonQuery();
                    ModifiedCnt++;
                    cmb.Dispose();
                }
            }
        }
        GetAllItems();  //Refresh grid
        MessageBox.Show(UpdateCnt + "건 Updated " + ModifiedCnt + "건 수정 되었습니다...");
    }
    catch (Exception ex)
    {
        MessageBox.Show(ex.Message);
    }
    finally
    {
        if (myConn.State == ConnectionState.Open)
        {
            myConn.Close();
            DBstatus.Text = "OFF";
        }
    }

}



728x90
블로그 이미지

Link2Me

,

C# GetAsyncDataFromWeb

C#/통신 2016. 8. 21. 23:36

HttpWebRequest 방식으로는 데이터를 가져오는 크기에 한도가 있는 거 같다.

아래 방식으로 하면 데이터를 많이 가져온다.


// GET 방식으로 Web 에 있는 데이터를 가져온다.

void GetAsyncDataFromWeb(string url)
{
    var client = new HttpClient();
    var response = client.GetAsync(url).Result;
    string resultContent = response.Content.ReadAsStringAsync().Result;
}



// POST 방식으로 Web 에 있는 데이터를 가져온다.

void GetAsyncDataFromWeb(string url)
{
    var client = new HttpClient();
    var postData = new List<KeyValuePair<string, string>>();
    postData.Add(new KeyValuePair<string, string>("UserName", "Grace"));
    postData.Add(new KeyValuePair<string, string>("userID ", "12345"));
    var formContent = new FormUrlEncodedContent(postData);

    var response = client.PostAsync(url, formContent).Result;
    string resultContent = response.Content.ReadAsStringAsync().Result;
}


postData 값을 넘기는 방법은 여러가지가 있다.

http://stackoverflow.com/questions/3001108/namevaluecollection-vs-dictionarystring-string

에 Dictionary<string,string> 와 NameValueCollection 차이점에 대한 문의 내용인데 간략한 답변이 나온다.

728x90
블로그 이미지

Link2Me

,

스승도 없이 독학으로 취미로 프로그램을 배우다보니 막히면 중단되고 방법을 찾으면 약간 진도가 나간다.

배우면서 느끼는 것은 기본기가 중요하다는 점이다.

기능 검색하다가 우연히 http://raago.tistory.com/20 에서 함수명을 직관적으로 이해되게 작성하는 것이 정말 중요하다는 걸 새삼 느꼈다.

앞으로는 자료 검색을 하더라도 허투루 보지 않고 응용해서 내것으로 만들어야겠다.


자료 검색을 하면 대부분 POST 처리 부분이 좀 부족하게 검색된다.

POST 데이터 입력부분까지 고려해서 만들었다.

서버에서 던져주는 결과를 가져오는 함수니까 GetDataFromWeb 으로 하면 맞다.

결과 형식이 JSON이면 Deserialize 하는 것은 별도로 처리해야 한다.


string GetJDataFromWeb(string url, string postData)
 {
     try
     {
         var webRequest = (HttpWebRequest)WebRequest.Create(url);

         if (postData != null)
         {
             webRequest.Method = "POST";
             byte[] sendData = UTF8Encoding.UTF8.GetBytes(postData);
             webRequest.ContentType = "application/x-www-form-urlencoded";
             webRequest.ContentLength = sendData.Length;

             Stream dataStream = webRequest.GetRequestStream();
             dataStream.Write(sendData, 0, sendData.Length);
             dataStream.Close();
         }

         var webResponse = (HttpWebResponse)webRequest.GetResponse();
         if ((webResponse.StatusCode == HttpStatusCode.OK) && (webResponse.ContentLength > 0))
         {
             var readStrem = new StreamReader(webResponse.GetResponseStream(), Encoding.UTF8, true);

             string reader = readStream.ReadToEnd().Trim();

             readStrem.Close();

             webResponse.Close();

             return @reader.ReadToEnd().Trim();
         }
         else
         {
             MessageBox.Show(string.Format("Status code == {0}", webResponse.StatusCode));
             return null;
         }
     }
     catch (Exception ex)
     {
         MessageBox.Show(ex.Message);
         return null;
     }
 }


파일을 첨부하는 경우는 테스트를 못해봤지만, 파일 첨부한 경우에는 별도 함수를 만들어야 할 것으로 예상된다.


가져온 데이터 형식이 JSON String 인 경우 이 문자열을 Deserialize 하는 함수 부분은

string URL = "http://IPaddress/cat1comboBox.php";
string json = GetJSONFromWeb(URL, null);
if (json != null)
{
    JavaScriptSerializer serializer = new JavaScriptSerializer();
    // Json String 를 객체로 반환 (역직렬화)
    JsonHelper category1 = serializer.Deserialize<JsonHelper>(json);

    datagGridView1 에 연결하거나, comboBox 에 연결 처리 추가하면 된다.
}


구글링 결과가 대부분 외국 자료이다보니 영문 중심이라 한글을 제대로 보여주지 못한다.

JavaScriptSerializer serializer = new JavaScriptSerializer(); 는 한글을 제대로 표현해준다.


코드를 구현해서 실제 적용을 해보니 데이터를 많이 가져올 수 없다. ㅠㅠㅠ

728x90
블로그 이미지

Link2Me

,

C# comboBox 에서 POST 방식으로 서버에 값을 전달하고 서버에서 그 결과를 회신하는 코드에 대해 작성한다.


private void cat1comboBox1_SelectedIndexChanged_1(object sender, EventArgs e)
{
    if (cat1comboBox1.SelectedIndex > 0)
    {
        cat1name1 = ((KeyValuePair<string, string>)cat1comboBox1.SelectedItem).Key;
        cat1uid1 = ((KeyValuePair<string, string>)cat1comboBox1.SelectedItem).Value;
        cat2comboBox(cat1uid1, cat2comboBox1); // 두번째 comboBox 표시
    }
}

void cat2comboBox(string category1, ComboBox CB)
{
    Dictionary<string, string> cat2Source = new Dictionary<string, string>();
    cat2Source.Add("전체", "0");
    try
    {
        string URL = "http://IP주소/cat2comboBox.php";
        string json = POSTPHPJSON(URL, category1);
        if (json != null)
        {
            JavaScriptSerializer serializer = new JavaScriptSerializer();
            JsonHelper2 category2 = serializer.Deserialize<JsonHelper2>(json);

            foreach (var dr in category2.result)
            {
                cat2Source.Add(dr.classname, dr.uid);
            }

            CB.DataSource = new BindingSource(cat2Source, null);
            CB.DisplayMember = "Key";
            CB.ValueMember = "Value";

            CB.SelectedIndex = 0;  // 첫번째 아이템 선택
        }
    }
    catch (Exception ex)
    {
        MessageBox.Show(ex.Message);
    }

}

private void cat2comboBox1_SelectedIndexChanged_1(object sender, EventArgs e)
{
    if (cat2comboBox1.SelectedIndex > 0)
    {
        cat2name1 = ((KeyValuePair<string, string>)cat2comboBox1.SelectedItem).Key;
        cat2uid1 = ((KeyValuePair<string, string>)cat2comboBox1.SelectedItem).Value;
        MessageBox.Show(cat2name1 + " : " + cat2uid1);
    }
}

string POSTPHPJSON(string url, string Data)
{
    try
    {
        var webRequest = (HttpWebRequest)WebRequest.Create(url);
        var postData = string.Format("catagory1={0}", Data); 

        // 좀 더 정교한 함수로 처리하려면 이 부분은 함수 밖에서 처리하는게 좋다.

        webRequest.Method = "POST";
        byte[] sendData = UTF8Encoding.UTF8.GetBytes(postData);
        webRequest.ContentType = "application/x-www-form-urlencoded";
        webRequest.ContentLength = sendData.Length;

        Stream dataStream = webRequest.GetRequestStream();
        dataStream.Write(sendData, 0, sendData.Length);
        dataStream.Close();

        var webResponse = (HttpWebResponse)webRequest.GetResponse();
        if ((webResponse.StatusCode == HttpStatusCode.OK) && (webResponse.ContentLength > 0))
        {
            var reader = new StreamReader(webResponse.GetResponseStream(), Encoding.UTF8, true);
            return @reader.ReadToEnd().Trim();
        }
        else
        {
            MessageBox.Show(string.Format("Status code == {0}", webResponse.StatusCode));
            return null;
        }
    }
    catch (Exception ex)
    {
        MessageBox.Show(ex.Message);
        return null;
    }
}

public class cat2comboBox
{
    public string uid { get; set; }
    public string classname { get; set; }
}

public class JsonHelper2
{
    public List<cat2comboBox> result { get; set; }
}


728x90
블로그 이미지

Link2Me

,

C# comboBox 에 DB 테이블 정보를 가져와서 List Up 하는 방법이다.


MySQL DB를 직접 접속하는 방식이 아니라, Web 서버 정보를 JSON 으로 파싱해서 연동하는 방법이다.

기본 사항은 http://net-informations.com/q/faq/combovalue.html http://stackoverflow.com/questions/3063320/combobox-adding-text-and-value-to-an-item-no-binding-source 참조하면 도움된다.


코드는 일반적인 형태와 약간 다르게 처리할 수 밖에 없었다.

일반적인 경우에는 CB.DataSource = new BindingSource(cat1Source, null); 대신에 CB.DataSource = category1.result; 로 하면 된다.

하지만 이렇게 하면 전체 라는 구분자가 보이지 않는다.

그래서 별도로 Dictionary 를 이용해서 저장한 다음에 다시 매핑을 시켰다.

서버 파일을 변경하여 연동 에러가 발생하게 하여 미처 고려하지 못한 버그도 수정 반영하였다.

화면에 보이는 Text 만 고려하지 않고 value 까지 고려한 이유는 comboBox 아이템을 선택했을 때 uid 를 이용하여 DB 테이블 조회를 하기 위해서다.


using System;
using System.Web;
using System.Web.Script.Serialization;
using System.Net;
using System.Windows.Forms;
using System.Collections.Generic;
using System.IO;
using System.Data;
using System.Text;

private void Form1_Load(object sender, EventArgs e)
{
    cat1comboBox(cat1comboBox1); // DB 테이블 정보 가져오기
}

void cat1comboBox(ComboBox CB)
{
    CB.Items.Clear();
    Dictionary<string, string> cat1Source = new Dictionary<string, string>();
    cat1Source.Add("전체", "0");  // DB에는 전체가 없어서 추가
    try
    {
        string URL = "http://IP주소/cat1comboBox.php";
        string json = GetPHPJSON(URL);
        if (json != null)
        {
            JavaScriptSerializer serializer = new JavaScriptSerializer();
            JsonHelper category1 = serializer.Deserialize<JsonHelper>(json); // Json String 객체로 반환 (역직렬화)

            foreach (var dr in category1.result)
            {
                cat1Source.Add(dr.classname, dr.uid);
            }

            CB.DataSource = new BindingSource(cat1Source, null);
            CB.DisplayMember = "Key";
            CB.ValueMember = "Value";

            CB.SelectedIndex = 0;  // 첫번째 아이템 선택
        }               
    }
    catch (Exception ex)
    {
        MessageBox.Show(ex.Message);
    }
   
}

private void cat1comboBox1_SelectedIndexChanged_1(object sender, EventArgs e)
{
    if (cat1comboBox1.SelectedIndex > 0)
    {
        string key = ((KeyValuePair<string, string>)cat1comboBox1.SelectedItem).Key;
        string value = ((KeyValuePair<string, string>)cat1comboBox1.SelectedItem).Value;
        MessageBox.Show(key + " : " + value);
    }
}

string GetPHPJSON(string url)
{
    try
    {
        var webRequest = (HttpWebRequest)WebRequest.Create(url);
        var webResponse = (HttpWebResponse)webRequest.GetResponse();
        if ((webResponse.StatusCode == HttpStatusCode.OK) && (webResponse.ContentLength > 0))
        {
            var reader = new StreamReader(webResponse.GetResponseStream(), Encoding.UTF8, true);
            return @reader.ReadToEnd().Trim();
        }
        else
        {
            MessageBox.Show(string.Format("Status code == {0}", webResponse.StatusCode));
            return null;
        }
    }
    catch (Exception ex)
    {
        MessageBox.Show(ex.Message);
        return null;
    }
}


public class cat1comboBox
{
    public string uid { get; set; }
    public string classname { get; set; }      
}

public class JsonHelper
{
    public List<cat1comboBox> result { get; set; }
}

728x90
블로그 이미지

Link2Me

,

PHP 서버에서 가져온 데이터 형식이라고 가정한다.

Local 에서 JSON 형식으로 데이터를 만들 이유는 없을 것이다.


public static string DeserializeNames()
{
    jsonData = "{\"name\":[{\"last\":\"Smith\"},{\"last\":\"Doe\"}]}";
    JavaScriptSerializer serializer = new JavaScriptSerializer();
    JsonHelper myNames = serializer.Deserialize<JsonHelper>(jsonData);
    return ser.Serialize(myNames);
}

//Class descriptions
public class name
{
   public string last { get; set; }
}

public class JsonHelper
{
   public List<name> { get; set; }
}



두개는 같이 사용 가능하다.

List<name> myNames = ser.Deserialize<List<name>>(jsonData);
JsonHelper myNames = ser.Deserialize<JsonHelper>(jsonData);


PHP 서버에서 JSON 을 가져오는 소스코드는

string GetJSONFromPHP(string url)
{
    HttpWebRequest request = (HttpWebRequest)WebRequest.Create(url);
    try
    {
        WebResponse response = request.GetResponse();
        using (Stream responseStream = response.GetResponseStream())
        {
            StreamReader reader = new StreamReader(responseStream, Encoding.UTF8, true);
            return @reader.ReadToEnd().Trim();
        }
    }
    catch (WebException ex)
    {
        WebResponse errorResponse = ex.Response;
        using (Stream responseStream = errorResponse.GetResponseStream())
        {
            StreamReader reader = new StreamReader(responseStream, Encoding.GetEncoding("utf-8"));
            String errorText = reader.ReadToEnd();
        }
        throw;
    }
}



jsonData = "{\"name\":[{\"last\":\"Smith\"},{\"last\":\"Doe\"}]}"; 대신에


using System.Web.Script.Serialization;
jsonData = GetJSONFromPHP(string url); 를 사용하면 된다.


dataGridView1 에다가 연결하는 방법은

JavaScriptSerializer serializer = new JavaScriptSerializer();
JsonHelper myNames = serializer.Deserialize<JsonHelper>(json);
dataGridView1.DataSource = myNames.name;


또는

JavaScriptSerializer serializer = new JavaScriptSerializer();
List<name> myNames = ser.Deserialize<List<name>>(jsonData);
dataGridView1.DataSource = myNames.ToArray();


로 하면 된다.    



728x90
블로그 이미지

Link2Me

,

어제 하이라이트를 보니까 박해민은 야구의 흐름을 읽는 눈이 부족하다.

역전에 역전을 거듭하는 상황에서 마지막 9회 두산 마무리 이현승은 흔들리고 있었다.

선두타자를 볼넷으로 내준 상황에서 박해민은 흔들리는 이현승의 심리를 읽어서 투수를 많이 던지게 했어야 하는데 성급하게 하다가 더블 플레이를 당했다.

경기가 순식간에 싸늘하게 식어버리게 만들었다.

수비 잘하는 박해민이 아니라 타격 잘하는 박해민으로 좀 더 성장하려면 야구의 흐름을 읽는 능력은 기본이 되어야 한다.

골프는 나혼자 맨탈 잡고 하면 되는 운동이지만, 야구는 상대방과의 두뇌싸움을 하면서 하는 상대적인 게임이다.

전 타석에서 안타를 쳤지만 그때 투수가 아니라 다른 투수다. 그러니까 신중하게 타격을 했어야 하는데 상대팀에게 승리를 헌납하는 상황을 만드는 박해민은 많이 반성해야 한다.


현대 야구는 똑똑한 선수를 원하고 있다. 운동만 열심히 하는 선수는 성장할 수 없다.

KIA 김호령이 맞는 타구음을 듣고 방향이 어디인지 판단하고 달려가 공을 잡는다고 하는데, 더 야구 잘하는 박해민이지만 이런 부분은 배워야 하는 부분이라고 본다. 박해민이 제 1의 특급 중견수로 성장하기 위해서는 수비도 좀 더 노력하고, 타격에서 수싸움을 잘하도록 연구 및 노력해야 한다.


특급 마무리가 빠지고, 특급 불펜이 빠지면서 삼성야구는 시험대에 올랐다.

8회, 9회를 지우는 투수가 있다가 이제는 8회 9회에 역전을 당하는 경우가 빈번해진 삼성은 부족한 부분이 어디인지 적나라하게 들어나고 있다.


류중일 감독의 나믿너믿 야구가 잘하는 선수만 주구장창 믿고 기용해서 2군 선수들을 성장하게 만들지 못하고 팀전체가 탄탄하지 못하는 상황이 되어 버렸다.

투수진이 강했을 때에는 나믿너믿 야구로 4번의 우승을 이끌 수 있었는데, 도박사건으로 한순간에 투수력이 약해진 올해는 삼성야구가 부족한 부분이 어디고, 감독과 코치가 무엇을 준비해야 하는지를 보여주고 있다.


권오준이 긁히는 날이었다면 권오준에게 경기를 좀 더 끌고 가는게 좋았을 것이다.

불펜투수들이 매일 매일 감독이 원하는데로 컨디션을 유지해주면 좋겠지만 그렇지 못하다.

삼성은 올해는 그냥 포기하고 선수들 다양하게 기용하면서 선수발굴하는데 힘쓰는게 나을 거 같은데 아직도 선수 활용폭이 좁다.

728x90
블로그 이미지

Link2Me

,

어제는 김기태 감독이 제대로 야구를 했다.

좀 이기고 있으면 후보선수로 바꿔서 야구하면서 역전패를 많이 했다.

최영필 투수가 3이닝을 정말 잘 막아줬고, 고효준 투수가 제대로 긁힌 날이다.


곽정철 투수가 부진하다 싶으니까 고효준 투수로 바꾸었고, 고효준 투수가 직구 위력만으로 정말 잘 막아냈다.

9회 한기주를 올렸는데 한기주는 아직 제구력이 부족하다. 경기 경험을 쌓게 해주는 측면에서는 좋지만, 박빙의 상황에 올릴 투수는 못된다.

만루 상황에서 1구를 볼을 주니까 바로 임창용으로 교체한 것은 이번 경기는 꼭 이기겠다는 강력한 의지를 보여준 대목이다.

어제 경기만큼은 김감독을 칭찬해주고 싶다. 정말 경기 흐름이 뒤바뀌려는 순간 순간에 투수교체를 통해서 넥센의 의지를 꺽었다.

감독이 팬을 위해 야구를 하는 것은 정말 한 경기를 소중하게 생각하고 경기에 임해야 한다.

화요 극강 두산을 만들어준 것도 김감독이 똘짓을 한 덕분이다. 많은 점수차로 이기고 있는 상황에 선수 교체하고 한기주 올려서 홈런 맞고 역전패를 하게 만들때는 정말 열 많이 받더라.


어제처럼 투수가 긁히는 날이 있다. 그날 그 선수가 잘하면 그날은 그 선수를 좀 더 오래 던지게 하고 몇일 쉬게 만들어 주는게 낫다. 매이닝 불펜투수 교체해서 볼질하다 홈런 쳐맞는 상황을 만드는 것은 감독의 잘못이다.

어제는 최영필, 고효준을 효과적으로 활용했기 때문에 승리할 수 있었다고 본다.


가장 압권인 작전은 신종길 타석에서 위장 번트한 것이다.

3루수를 앞으로 나오게 하면서 발빠른 김호령, 윤정우 더블 스틸은 염경엽 감독에게 되갚아준 장면이다.

http://sports.news.naver.com/kbaseball/vod/index.nhn?uCategory=kbaseball&category=kbo&id=223713&firstVid=223713&autoPlay=true


염경엽 감독은 한국야구를 성장시키는데 큰 역할을 하고 있다.


노수광 선수 부상은 상당히 아쉽다. 삼성 선수들이 도루를 위해 별도의 장갑을 사용하는 것처럼 도루하는 선수는 생각을 하고 야구를 했어야 했는데 아쉽다.

KIA 구단은 지금이라도 삼성처럼 주루장갑 구매해서 선수에게 제공해야 한다.

유리 주찬이라는 오명을 쓰던 김주찬이 도루를 거의 포기하면서 부상이 거의 없다. 도루는 그만큼 위험하다.

노수광 선수가 아직 경험이 부족해서 손가락 골절 부상을 당했다고 본다. 빠른 쾌유를 빈다.

야구를 대하는 자세가 절실한 노수광 선수는 이번 부상을 계기로 어떻게 해야 부상없이 야구를 할 것인지 좀 더 고민하고, 더 성장했으면 좋겠다.

발이 빠른 장점을 극대화 하기 위해서 도루를 하려고 한다면, 부상당한 기간동안 비디오를 통해서 잘하는 특급 선수들 도루 상황을 면밀하게 분석하고 부상 당하지 않는 방법 등을 연구하면 좋을 거라 본다.

부상 당한 본인이 가장 아쉽겠지만 부상 당한 것이 본인을 더 특급 선수로 만들기 위한 과정이라고 생각하면 더 많은 것을 얻을 수 있을 것이다.

728x90
블로그 이미지

Link2Me

,

ajax 에 대한 기본 개념이 잘 설명된 곳은 https://www.w3schools.com/jquery/jquery_ajax_intro.asp 다.

ajax 의 강력한 특징은 페이지 전체를 refresh 하지 않고서도 수행되는 비동기성이다. 이러한 비동기성을 통해 사용자의 Event가 있으면 전체 페이지가 아닌 일부분만을 업데이트 할 수 있게 해준다.


jQuery ajax 의 다른 형태로 .get 또는 .post 처리가 가능하다.

형태가 심플하여 더 편할 수 있다. 아래 코드는 100% 동작하는 걸 확인하고 적어둔다.

대부분 자료들이 대략적인 컨셉만 적혀있고 참고로 사용할만한 샘플이 없는 거 같아서 적었다.

나와 같은 초보자들은 제대로 동작하는 샘플이 있어야만 그 다음에 응용 또는 활용이 가능하다.


$.get()함수, $.post() 함수는 url, url 파라미터, 요청의 성공시 응답을 받기 위한 콜백함수가 있다.

$.post(url, {userID:input_value}, function(data) {

     // 통신이 성공했을 때 실행하는 함수

}, 'json');


url 파라미터는 key 와 value 쌍으로 구성된다. 파라미터가 여러개이면 콤마로 구분한다.


===== idCheck.php ====

<!DOCTYPE html>
<head>
<meta charset=UTF-8" />
<meta name="robots" content="noindex,nofollow"/> <!-- 검색엔진에서 검색 제외 -->
<meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0, user-scalable=no"/>
<meta http-equiv="X-UA Compatible" control="IE=edge,chrome=1" /> <!--브라우저 호환성 설정 -->
<title>ID Join Check</title>
<!-- 모바일 웹 페이지 설정 -->
<link rel="shortcut icon" href="img/icon.png" />
<link rel="apple-touch-icon" href="img/icon.png" />
<!-- 모바일 웹 페이지 설정 끝 -->

<link rel="stylesheet" type="text/css" href="css/common.css"/>
<script type="text/javascript" src="http://code.jquery.com/jquery.min.js"></script>
<script type="text/javascript" src="js/idCheck.js"></script>
</head>
<body>
    <h1 class="title">아이디 중복검사</h1>
    <div class="exec">
        <form>
            <input type="text" name="userID" />
            <input type="button" id="checkid" value="중복검사" />
        </form>
    </div>
    <div class="console"></div>
</body>
</html>


===== idCheck.js =====

$(function(){
    $("#checkid").click(function(e) {

        e.preventDefault(); // a 링크, form submit 실행 방지

        var input_value = $("input[name='userID']").val();
       
        // 입력 여부 검사
        if(!input_value) {
            alert("아이디를 입력하세요");
            $("input[name='userID']").focus();
            return false;
        }

        var url = 'idCheck_ok.php';
        $.post(url, {userID:input_value}, function(msg) {
            if (msg.result==1) { // idCheck_ok.php 의 결과값
                $(".console").html("<span style='color:blue'>사용할 수 있는 아이디 입니다.</span>");

                // alert('사용할 수 있는 아이디 입니다.'); 로 대신해도 된다.

            } else {
                $(".console").html("<span style='color:red'>사용할 수 없는 아이디 입니다.</span>");

                // alert('사용할 수 없는 아이디 입니다.'); 로 대신해도 된다.

                // 이 경우에는 $("input[name='userID']").val(''); 로 입력값을 초기화해도 좋다.

            }
        },'json');
       
    });
});



https://link2me.tistory.com/954 참조하면 javascript 로 Form 제어하는 개념을 이해할 수 있다.

위의 예제에는 form method, action 을 생략해서 원하는 결과를 얻지 못할 수 있다.

form method를 생략하면 GET방식으로 동작된다.

form action 을 추가하고 동작할 경우에는 반드시 e.preventDefault(); // a 링크, form submit 실행 방지

를 추가해줘야 제대로 원하는 결과를 얻을 수 있다.


===== idCheck_ok.php ====

# PHP 기본 개념 이해는 http://link2me.tistory.com/1110 게시글을 참조하시라.

# ajax 를 이용하면 파일 A --> 파일 B로 이동하지 않고 결과를 얻을  수 있다.

<?php
session_start();
if(isset($_POST['userID']) && !empty($_POST['userID'])) {
    $userID = trim($_POST['userID']);

    require_once $_SERVER['DOCUMENT_ROOT'].'/dbconnect.php'; // db접속 성공
    require_once $_SERVER['DOCUMENT_ROOT'].'/phpclass/loginClass.php';

    $c=new LoginClass();
    $rs = $c->UserIDJoinCheck($userID);
    if($rs == '0') {
        echo '{"result":"1"}';
    } else {
        echo '{"result":"0"}';
    }
}
?>

===== loginClass.php ====

<?php
class LoginClass {
    function UserIDJoinCheck($userID) {
        if(!isset($userID) || empty($userID)) {
            return '-1';
        } else {
            global $db;           
            $userID = preg_replace("/[\s\t]+/","", $userID); // 공백이나 탭 제거(사용자 실수 방지)

            $sql = "select id, count(id) ";
            $sql.= "from rb_s_mbrid where id= '".$userID."' ";
            if($result = mysqli_query($db,$sql)) { //성공
                $row = mysqli_fetch_row($result);
                if($row[1] == '0') return 0;
                return $row[1];
            } else {
                return '-1';
            }
        }
    }

}//end class LoginClass

?>


===== 테이블 구조 =====

CREATE TABLE IF NOT EXISTS `rb_s_mbrid` (
  `uid` int(11) NOT NULL AUTO_INCREMENT,
  `site` int(11) NOT NULL DEFAULT '0',
  `id` varchar(50) NOT NULL DEFAULT '',
  `pw` varchar(50) NOT NULL DEFAULT '',
  `code` int(6) NOT NULL DEFAULT '0',
  PRIMARY KEY (`uid`),
  KEY `site` (`site`),
  KEY `id` (`id`),
  KEY `code` (`code`)
) ENGINE=MyISAM  DEFAULT CHARSET=utf8 AUTO_INCREMENT=1 ;

도움되셨다면 공감 또는 ... 눌러주세요.

728x90
블로그 이미지

Link2Me

,

너무나도 재미있게 봤던 본 시리즈 !!!

본 아이덴티티, 본 슈프리머시, 본 얼터메이텀

그 이후 본 레거시라고 멧데이먼 대신 다른 배우를 주연으로 해서 나온 영화는 본 시리즈라고 보면 안된다.

본인이 누구인지 기억을 못한 상태에서 쫓기던 본이 기억을 거의 되찾으면서 본 얼티메이텀이 끝났다.



제이슨 본(2016)에서는 기억을 되찾은 본의 아버지가 폭발로 살해되는 장면에서 기억이 제대로 돌아오지 않는 상태에서 아버지와 관련된 범인이 기억나지 않고 가물 가물하다.

본 아이덴티티(2002)의 당시 첨단기술과 지금의 첨단기술이 현격하게 달라졌다는 점이 영화의 재미를 떨어뜨리는 요인일 수도 있다. 본 아이덴티티가 나온 시대에는 GPS를 이용한 기술수준이 낮았던 시대에서 추척하는 기술이 그 당시의 최선이었지만 지금 시대에는 GPS 를 이용하여 위치를 실시간으로 추척하다보니 미리 대기하고 저격을 하는 장면은 흥미를 떨어뜨릴 수도 있겠다. 하지만 지금 과학기술은 드론으로 저공비행을 하면서 적을 공격할 수도 있는 시대가 되었다.

멀웨어로 해킹을 감지하고 추적하는 첨단 IT기기들로 긴박감을 업그레이드 시켰다.

극장에서 영화보는 내내 긴장감을 갖고 영화를 봤다.

옥의 티라면 마지막 부분에서 개연성있게 처리하지 못한 장면이 좀 아쉬웠다.


※ GPS 위성은 군사용 코드와 일반용 코드로 구분되어 있다. 군사용은 공개되지 않았다. 1990년대 후반에 GPS 위성 일반코드를 공개한 이후 DGPS 등으로 오차 100m 의 거리를 10m 이내로 줄일 수 있게 발전했다.


728x90

'영화 > 미국영화' 카테고리의 다른 글

실버라이닝 플레이북 2012 --- ★★★★☆  (0) 2015.11.22
블로그 이미지

Link2Me

,

맛살리안 카페에 한글자막이 있어 오랫만에 인도영화를 한편 감상했다.

국민 배우 아미타브 바찬이 아버지 바바 역을, 디피카 파두콘이 딸 피쿠 역을 맡았다.
이들과 동행하는 라나는 이르판 칸이 연기한다. 이름만으로도 무게감이 느껴지는 이들 세 배우의 호흡이 좋다.
아미타브 밧찬은 고집불통의 노인으로 완벽하게 빙의했고, 뚱한 표정의 디피카 파두콘은 아웅다웅하는 부녀의 모습을 재미있게 그려냈다.
이르판 칸은 부녀 사이에 끼어 중재자 역할을 맡으며 존재감을 발휘했을 뿐 아니라 아미타브 바찬과 함께 큰 웃음을 선사한다.


영화는 늙은 아버지와 과년한 딸을 다룬 잔잔한 가족 드라마다.

변비에 시달리는 바바는 노년에 홀아비가 되어 딸 피쿠에게 의존한다. 건축 사무소를 다니는 피쿠는 그런 아버지를 보살피느라 사생활이 없다.

괴팍한 아버지 때문에 두 달 동안 가정부가 5번이나 바뀌었다. 아버지는 변비때문에 일상의 대화가 전부 변비관련된 대화만 한다. 아빠 때문에 출근시간에 쫓기고, 택시를 급하게 몰아달라고 하면서 택시 사고가 나는 통에 택시 운전사들은 피쿠 태우는 걸 무척 꺼린다. 샤이드가 택시업체 사장인 라나(이르핀 칸) 편 들었다고 피쿠는 기분 나쁘다고 며칠을 쉰다고 하면서 오토릭샤를 타고 집에 가버린다.

딸애에게 관심있어 하는 청년에게 아버지는 "얘는 나처럼 엄청 변덕스러워, 숫처녀도 아니야" 라며 딸에게 관심을 갖지 말라며 결혼은 필요없고 감정만 같이 나눌 애인만 찾고 있다고 한다.

딸의 충고를 듣지 않고 무리하다가 의식을 잃은 바바는 다시 깨어나자 고향인 콜카타에 가고 싶다고 말한다.
그리고 딸은 아버지와 함께 갑작스런 여행을 떠나게 된다.

변비로 까탈을 부리는 아버지가 비행기와 기차 여행을 거부하자
딸은 평소 이용하던 라나의 업체에 예약 전화를 걸어 택시 여행을 하려고 한다.
하지만 출발 당일, 약속한 시간이 되어도 차는 오지 않고, 화가 난 피쿠는 라나에게 항의한다.

델리에서 콜카타까지는 무려 1500km가 넘는 거리로, 모두들 괴팍한 노인, 신경질적인 딸과 동행하기를 꺼려했던 것이다.
라나는 어쩔 수 없이 직접 차를 몰고 부녀의 여행에 동참한다.
특히 이들이 여정을 시작하며 바바의 배변 전용 의자를 차 위에 싣는 장면은 압권이다.

택시 여행중에 나눈 대화는 생략한다.

영화를 직접 봐야만 그 맛을 알게 될거니까....



※ 인도에서는 결혼전에 남자든 여자든 순결해야 한다. 결혼 날짜를 받은 상태에서도 혼전 관계는 허용되지 않는다고 보면 된다.

힌두교는 2000년 넘게 인도의 근간을 이루는 종교로서 인도에서 85%가 믿는 종교다. 상위 5%에 해당하는 브라만 지배 계층이 사회를 유지시키기 위해 만든 교리가 윤회사상이다.

결혼하면서 7번 불 주위를 도는데, 7번 태어나도 나는 당신과 결혼하겠다는 의미이며, 현재 계급으로 태어난 이유는 전생에서 내가 선행을 했으면 더 높은 계급으로 태어날 수 있고 악행을 저질러서 현재의 계급으로 태어났다는 숙명론을 받아들이게 만들었다. 물론 인도 사회도 점점 변해가고 있기는 하지만 변화의 속도는 무척 느린편이다.

회사 일이 우선이 아나라 가족이 먼저인 경우가 허다하다. 이런 점을 알고 영화를 봐야 영화에 대한 이해도가 높아진다.

인도영화 산업은 볼리우드를 비롯하여 5개 영화산업단지가 있다.

인도의 공용어는 영어와 힌디어 이지만 지역에 따라 힌두어를 전혀 사용하지 않는 곳도 많다.

힌디어의 어순은 우리말과 거의 같다. 그래서 영어자막을 우리말 식으로 번역한 것도 많아서 정식 영어자막이라고 보고 이해하려고 하면 힘든 경우가 많다.

남인도에서는 친족간에 결혼하는 풍습이 지금도 성행한다. 남인도 영화를 보면 사촌간에 결혼하는 걸 다루는 영화도 꽤 된다. 신라시대 성골문화가 남인도 문화라고 보면 된다.

728x90

'영화 > 인도영화' 카테고리의 다른 글

인도관련 서적  (0) 2018.12.29
내가 번역해 본 인도영화 자막 몇개  (0) 2018.11.29
인도영화 한글자막 구할 수 있는 곳  (0) 2015.03.14
종교를 다룬 인도영화 PK  (0) 2015.01.11
블로그 이미지

Link2Me

,
PHP 로 파싱하는 것은 아직 안해봤다. PHP 로 파싱하는 걸 알면 여러모로 편리할 거 같기는 하다.

다른 Web 사이트에 있는 정보를 가져와서 재가공 해야 하는 경우에 Snoopy.class.php 를 활용하면 된다.


Snoopy 클래스 다운로드 http://sourceforge.net/projects/snoopy/files/latest/download


네이버지식인 답변에 올라온 것을 적어둔다.

답변자 출처 : http://dolgo.net/php/questions/85

<?php
include_once 'snoopy/Snoopy.class.php';
$snoopy = new Snoopy;
$getUrl = "http://www.645lotto.net/lotto645Confirm.do?method=byWin&drwNo=710";
$snoopy->fetch($getUrl);
$pattern='/img src="\/img\/common\/ball_(.*?).png/';
preg_match_all($pattern,$snoopy->results,$out); 
for($i=0;$i<=6;$i++){
    echo $out[1][$i]."\n";
}
?>


분석

- $snoopy = new Snoopy; // Class화된 PHP는 객체 생성을 해야 함

- 확장자를 do를 사용하는 것은 PHP 인지 JSP 인지 식별할 수 없게 하기 위함이다.

- 로또번호 회차 표시부분을 수정하면 매번 다르게 보일 것이다.

- fetch($getUrl) : 입력받은 주소의 html소스를 텍스트 형식으로 $results에 저장

- fetchlinks($URI) : fetch와 비슷하지만 링크만을 배열의 형태로 $results에 저장

- fetchtext($URI) : fetch와 비슷하지만 스크립트를 제외한 텍스트만 $results에 저장

- fetchform($URI) : fetch와 비슷하지만 폼 부분을 html형식으로 $results에 저장

- submit($URI, $formvars="", $formfiles="") : 폼에 여러 변수를 붙여서 전송 가능

- setcookies() : 종종 쿠키정보를 유지해야하는 경우가 있을 때 사용

- preg_match 정규식을 사용해서 이제 본문 필요 요소만을 추출



728x90

'Web 프로그램 > JSON, 파싱 다루기' 카테고리의 다른 글

Parse JSON with PHP (JSON 파싱)  (2) 2017.11.27
PHP Array 활용 JSON  (0) 2017.05.11
[PHP] MySQL Data to JSON using PHP  (0) 2016.12.22
XML 데이터 생성 처리  (0) 2016.06.06
PHP 와 XML 연동처리  (0) 2016.06.04
블로그 이미지

Link2Me

,