swift

【swift4】ロリポップサーバーのMySQLからPHPを使ってJSON形式でデータを参照する

ロリポップサーバーのMySQLからPHPを使ってjson形式でデータを参照します。







環境
・MacBook Air macOS Sierra version 10.13.1
・Xcode version 9.2
・Swift version 4.0.3
・MySQL 5.6.23
・PHP 5.6


概要
データベースからデータを取得して表示する


参考資料
lolipopで、PHP-MySQLを使用してDBに接続する
http://nanoappli.com/blog/archives/972

UiTableViewCellの特定のセルだけ更新する方法 – とりあえずphpとかhttp://kimagureneet.hatenablog.com/entry/2015/04/29/125034


準備
データーベースホスト : mysqlxxx.phy.lolipop.jp
ユーザー名 : LAxxxxxxxx
パスワード : yyyyyyyy
データベース名 : LAxxxxxx-dbname
テーブル名 : hhhhhhhhhh

データの構造 :




データの内容 :




PHPファイル : test.php
通信先のURL: https://xxxxxxx.xxx/test.php

ブラウザからアクセスすると以下のように表示される




SwiftyJSONを入れる
cocoapodsセットアップからSwiftyJSON動作確認まで – Qiita
https://qiita.com/daikuro/items/1e3758f58783e12e8a52

test.php
<?php

$result = array();

try{
	//データーベースホスト
	$server   = "mysqlxxx.phy.lolipop.jp";
	//ユーザー名              
    $user     = "LAxxxxxxxx";
    //パスワード                           
    $pass     = "yyyyyyyy";
    //データベース名                           
    $database = "LAxxxxxx-dbname";         

    $dbh = new PDO("mysql:host=" . $server . "; dbname=" . $database . ";charset=utf8;", $user, $pass );

	if ($dbh == null) {
        // echo('接続失敗');
    } else {
        // echo('接続成功');

        $sql = 'SELECT * FROM hhhhhhhhhh ORDER BY date';

		foreach ($dbh -> query($sql) as $key => $row) {
			if ($key == 0){
				$result = array(
							array(
				    			"date" => $row["date"],
				    			"title" => $row["title"],
				    			"contents" => $row["contents"]
				    		)
						);
			}else{
				$result = array_merge($result,array(
												array(
													"date" => $row["date"],
							    					"title" => $row["title"],
							    					"contents" => $row["contents"]
							    				)
											)
										);
			}
		}
    }
	//データベース接続切断
	$dbh = null;
}catch(PDOException $e){
	// echo('Connection failed:'.$e->getMessage());
	die();
}
echo json_encode($result, JSON_UNESCAPED_UNICODE);
?>


ViewController.swift
import UIKit
import SwiftyJSON

class ViewController: UIViewController, UITableViewDelegate, UITableViewDataSource {

    var tableView: UITableView = UITableView()
    
    //タップしたセル
    var tapCell: [NSIndexPath:Bool] = [:]
    //日付
    var dateArray:[String] = []
    //タイトル
    var titleArray:[String] = []
    //内容
    var contentsArray:[String] = []
    
    //通信先のURL
    let urlString = "https://xxxxxxx.xxx/test.php"
    
    override func viewDidLoad() {
        super.viewDidLoad()
        
        //============================================
        //一覧
        //============================================
        tableView.frame = CGRect(x: 0, y: 0, width: UIScreen.main.bounds.size.width, height: UIScreen.main.bounds.size.height)
        tableView.delegate   = self
        tableView.dataSource = self
        tableView.register(ContentsTableViewCell.self, forCellReuseIdentifier: "Cell")
        self.view.addSubview(tableView)
        
        tableView.tableFooterView = UIView()
        //データを取得する
        self.getData()
    }
    
    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
        // Dispose of any resources that can be recreated.
    }
    
    /*********************************
     * データを取得する
     **********************************/
    func getData(){
        //GET用のリクエストを生成
        var request   = URLRequest(url: URL(string:self.urlString)!)
        // GETのメソッドを指定
        request.httpMethod = "GET"
        request.addValue("application/json", forHTTPHeaderField: "Content-Type")

        let task = URLSession.shared.dataTask( with: request, completionHandler: { data, response, error in
            if (error == nil) {
                let json = JSON(data: data!)
                for (index,subJson):(String, JSON) in json {
                    if(index == "0"){
                        self.dateArray = [subJson["date"].stringValue]
                        self.titleArray = [subJson["title"].stringValue]
                        self.contentsArray = [subJson["contents"].stringValue]
                    }else{
                        self.dateArray.append(subJson["date"].stringValue)
                        self.titleArray.append(subJson["title"].stringValue)
                        self.contentsArray.append(subJson["contents"].stringValue)
                    }
                }
                //メインスレッドで実行
                DispatchQueue.main.async {
                    self.tableView.reloadData()
                }
            } else {
                print(error!)
            }
        })
        task.resume()
    }
    
    /*********************************
     * セルの高さ
     **********************************/
    func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat {
        //デフォルトの高さ
        var result: CGFloat = 68
        let row = NSIndexPath(row: indexPath.row, section: 0)

        if (tapCell.keys.contains(row)) {
            if (tapCell[row])! {
                //縦サイズを計算するためのUILabel
                let label:UILabel = UILabel()
                label.frame = CGRect(x: 10, y: 40, width: UIScreen.main.bounds.size.width - 20, height: 0)
                label.text = "\(dateArray[indexPath.row])  \(contentsArray[indexPath.row])"
                label.font = UIFont(name:"Arial", size:13)
                label.numberOfLines = 0
                label.textAlignment = .left
                label.sizeToFit()

                //タップしたものが閉じているときは開く(ContentsTableViewCellのお知らせ内容のy:40 + 余白:10)
                result = label.bounds.height + 50
            }else{
                //タップしたものが開いているときは閉じる
                result = 68
            }
        }
        print("result:",result)
        return result
    }

    /*********************************
     * セクションの数
     **********************************/
    func numberOfSections(in tableView: UITableView) -> Int {
        return 1
    }
    
    /*********************************
     * セルの個数を指定するデリゲートメソッド(必須)
     **********************************/
    func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        return titleArray.count
    }
    
    /*********************************
     * セルに値を設定するデータソースメソッド(必須)
     **********************************/
    func tableView(_ cellForRowAttableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
        let cell = cellForRowAttableView.dequeueReusableCell(withIdentifier: "Cell", for: indexPath) as! ContentsTableViewCell
        
        let row = NSIndexPath(row: indexPath.row, section: 0)
        cell.cellTitle.text = titleArray[indexPath.row] + "v"

        if (tapCell.keys.contains(row)) {
            if (tapCell[row])! {
                cell.cellContent.text = "\(dateArray[indexPath.row])  \(contentsArray[indexPath.row])"
                cell.cellTitle.text = "\(titleArray[indexPath.row])  ^"
            }else{
                cell.cellContent.text = ""
                cell.cellTitle.text = "\(titleArray[indexPath.row])  v"
            }
        }
        return cell
    }
    
    /*********************************
     * セルが選択されたとき
     **********************************/
    func tableView(_ table: UITableView, didSelectRowAt indexPath:IndexPath) {
        let row = NSIndexPath(row: indexPath.row, section: 0)
        //初回タップ
        if (tapCell.count == 0) {
            tapCell[row] = true
        }else{
            //過去にタップしたものがあれば更新
            if (tapCell.keys.contains(row)) {
                if (tapCell[row])! {
                    tapCell[row] = false
                }else{
                    tapCell[row] = true
                }
            }else{
                //過去にタップしたものがなければ追加
                tapCell[row] = true
            }
        }
        //タップした行だけ更新する
        tableView.reloadRows(at: [row as IndexPath], with: UITableViewRowAnimation.fade)
    }
}


ContentsTableViewCell.swift
import UIKit

class ContentsTableViewCell: UITableViewCell {

    let cellTitle = UILabel()
    let cellContent = UILabel()
    
    override func awakeFromNib() {
        super.awakeFromNib()
    }
    
    override func setSelected(_ selected: Bool, animated: Bool) {
        super.setSelected(selected, animated: animated)

        //============================================
        //タイトル
        //============================================
        cellTitle.frame = CGRect(x: 10, y: 10, width: UIScreen.main.bounds.size.width - 20, height: 20)
        cellTitle.font = UIFont(name: "Arial", size:15)
        cellTitle.numberOfLines = 1
        cellTitle.textAlignment = .left
        self.addSubview(cellTitle)

        //============================================
        //内容
        //============================================
        cellContent.frame = CGRect(x: 10, y: 40, width: UIScreen.main.bounds.size.width - 20, height: 0)
        cellContent.font = UIFont(name:"Arial", size:13)
        cellContent.numberOfLines = 0
        cellContent.textAlignment = .left
        cellContent.sizeToFit()
        self.addSubview(cellContent)
    }
}
githubにコードがあります。





関連記事

  1. swift

    【swift2.2】初心者がswiftで作ったカレンダーアプリ ⑤プログラムを書く

    カレンダーを表示するシンプルなアプリを作ります。目次①プロ…

  2. swift

    【swift3.0】MPVolumeView 縦スライダー操作中にシステム音量を表示させずに音量を変…

    縦スライダー操作中にシステム音量を表示させずに音量を変更させます。…

  3. swift

    【swift2.2】初心者がswiftで作ったカレンダーアプリ ⑥確認する

    目次①プロジェクトを作成②Storyboardにパーツを配置、…

  4. swift

    【swift2.2】初心者がswiftで作ったカレンダーアプリ ③IBOutlet、IBAction…

    カレンダーを表示するシンプルなアプリを作ります。目次①プロ…

  5. swift

    【swift2.2】初心者がswiftで作ったカレンダーアプリ ~目次~

    カレンダーを表示するシンプルなアプリを作ります。G…

  6. swift

    【swift3】正規表現で特殊文字を検索して置換する

    正規表現で特殊文字を検索して置換します。環境・Ma…

コメント

  1. この記事へのコメントはありません。

  1. この記事へのトラックバックはありません。

This blog is kept spam free by WP-SpamFree.

カテゴリー

おすすめ記事

アーカイブ

PAGE TOP