質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
MySQL

MySQL(マイエスキューエル)は、TCX DataKonsultAB社などが開発するRDBMS(リレーショナルデータベースの管理システム)です。世界で最も人気の高いシステムで、オープンソースで開発されています。MySQLデータベースサーバは、高速性と信頼性があり、Linux、UNIX、Windowsなどの複数のプラットフォームで動作することができます。

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

Xcode

Xcodeはソフトウェア開発のための、Appleの統合開発環境です。Mac OSXに付随するかたちで配布されています。

Swift

Swiftは、アップルのiOSおよびOS Xのためのプログラミング言語で、Objective-CやObjective-C++と共存することが意図されています

Q&A

解決済

1回答

2407閲覧

データベースから取得したデータをテーブルビューに表示させたい!!

SERA0_0b

総合スコア1

MySQL

MySQL(マイエスキューエル)は、TCX DataKonsultAB社などが開発するRDBMS(リレーショナルデータベースの管理システム)です。世界で最も人気の高いシステムで、オープンソースで開発されています。MySQLデータベースサーバは、高速性と信頼性があり、Linux、UNIX、Windowsなどの複数のプラットフォームで動作することができます。

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

Xcode

Xcodeはソフトウェア開発のための、Appleの統合開発環境です。Mac OSXに付随するかたちで配布されています。

Swift

Swiftは、アップルのiOSおよびOS Xのためのプログラミング言語で、Objective-CやObjective-C++と共存することが意図されています

1グッド

1クリップ

投稿2022/01/05 18:34

前提・実現したいこと

php経由でデータベースから取得したデータをswiftを使ってtableviewに一覧表示させたいです。
以下に記載されてるMySQLのデータ内のlidの列に保存されてるデータをswiftのテーブルビューに表示させたいです。
下に画像を載せましたが、プログラムを実行するとテーブルビューの部分が真っ白になって何も出てきません。
テーブルビューのコードの辺りがおかしいのか、JSONデータを解析する所あたりで間違っているのか、よくわからなくて困っております。
解決方法をご教示頂ければ幸いです。

エラーメッセージはありません。

該当のソースコード

swift

1import UIKit 2 3class CourseViewController: UIViewController, UITableViewDelegate, UITableViewDataSource { 4 5 let URL_COURSE_DATA = "https://hogehoge/dbApi.php" 6 7 var courses: [String] = [] 8 9 var sid:String! = "000" 10 11 override func viewDidLoad() { 12 super.viewDidLoad() 13 let requestURL = NSURL(string: URL_COURSE_DATA) 14 let request = NSMutableURLRequest(url: requestURL! as URL) 15 request.httpMethod = "POST" 16 let postParameters = "sid="+sid!; 17 request.httpBody = postParameters.data(using: String.Encoding.utf8) 18 let task = URLSession.shared.dataTask(with: request as URLRequest){ 19 data, response, error in 20 if error != nil { 21 print("error is (error!)") 22 return; 23 } 24 do { 25 let myJSON = try JSONSerialization.jsonObject(with: data!, options: .mutableContainers) as? [String:[String:String]] 26 if let parseJSON = myJSON { 27 28 for (key, value) in parseJSON { 29 print(key) 30 31 for (key2, value2) in value{ 32 print(key2) 33 self.courses.append(value2) 34 35 36 } 37 38 } 39 40 41 42 } 43 44 }catch{ 45 print(error) 46 } 47 } 48 49 task.resume() 50 51 52 53 // Do any additional setup after loading the view. 54 } 55 56 func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int { 57 return courses.count 58 } 59 60 func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { 61 // セルを取得する 62 let cell: UITableViewCell = tableView.dequeueReusableCell(withIdentifier: "coursecell", for: indexPath) 63 // セルに表示する値を設定する 64 cell.textLabel!.text = courses[indexPath.row] 65 return cell 66 }

PHP

1<?php 2//dbApi.php 3//dbOperation.phpは下に記載してあります。 4 $response = array(); 5 6 if($_SERVER['REQUEST_METHOD']=='POST'){ 7 8 $sid = $_POST['sid']; 9 10 require_once 'dbOperation.php'; 11 $db = new dbOperation(); 12 13 if($db->selectSQL($sid)){ 14 15 $response = $db->selectSQL($sid)->fetchAll(); 16 }else{ 17 18 $response['error'] = true; 19 } 20 21 }else{ 22 23 $response['error'] = true; 24 } 25 26 echo json_encode($response); 27?>

PHP

1<?php 2//dbOperation.php 3//config.phpにはデータベース名やデータベースhostの設定を記述 4//dbConnect.phpにはPDOでの接続処理を記述 5 class dbOperation{ 6 7 private $conn; 8 9 function __construct(){ 10 11 require_once 'config.php'; 12 require_once 'dbConnect.php'; 13 14 $db = new dbConnect(); 15 $this->conn = $db->connect(); 16 } 17 18 public function selectSQL($sid){ 19 20 $sql = "select lid from course where sid = ?"; 21 $result = $this->conn->prepare($sql); 22 $result->execute(array($sid)); 23 return $result; 24 } 25 } 26?>

MySQL

1sid | lid 2000 | hogehoge 3000 | hagehage 4000 | hugehuge

試したこと

テーブルビューのデリゲートやデータソースのアウトレットは紐付けました。

補足情報(FW/ツールのバージョンなど)

最終的にMySQLのlidに格納されてるhogehogeとかの一覧をテーブルビューで表示したいです。
イメージ説明
実行したらテーブルビューの部分が真っ白くなって何も出てきません。

abebebe0715👍を押しています

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

hoshi-takanori

2022/01/05 19:17

まず、どこがうまくいってないのかを突き止める必要がありますね。 ・PHP + データベース: Postman や curl コマンドなどで直接アクセスして確認 ・Swift 通信処理: dataTask の結果 (data, response, error) や JSON への変換結果を print やデバッガなどを使って確認 ・テーブルビューの表示: とりあえず通信部分をいったん外して、ダミーのデータを直接セットして表示を確認
hoshi-takanori

2022/01/05 19:18

っと、よくみたら tableView を reloadData してないのでは。
m.ts10806

2022/01/05 21:11

PHPをデバッグするところからですね。
guest

回答1

0

自己解決

以下のように変更したら正しく表示されるようになりました。
アドバイス頂きありがとうございました。

swift

1import UIKit 2 3class CourseViewController: UIViewController, UITableViewDelegate, UITableViewDataSource { 4 5 let URL_COURSE_DATA = "https://example.com/dbApi2.php" 6 @IBOutlet weak var tableView: UITableView! 7 8 var courses: [[String: Any]] = [] { 9 didSet{ 10 tableView.reloadData() 11 } 12 } 13 14 var sid:String! = "" 15 16 override func viewDidLoad() { 17 super.viewDidLoad() 18 let requestURL = NSURL(string: URL_COURSE_DATA) 19 let request = NSMutableURLRequest(url: requestURL! as URL) 20 request.httpMethod = "POST" 21 let postParameters = "sid="+sid!; 22 request.httpBody = postParameters.data(using: String.Encoding.utf8) 23 let task = URLSession.shared.dataTask(with: request as URLRequest){ 24 data, response, error in 25 do { 26 let coursesDataArray = try JSONSerialization.jsonObject(with: data!, options: JSONSerialization.ReadingOptions.allowFragments) as! [Any] 27 print(coursesDataArray) 28 let coursesData = coursesDataArray.map { (coursesData) -> [String: Any] in 29 return coursesData as! [String: Any] 30 } 31 DispatchQueue.main.async() { () -> Void in 32 self.courses = coursesData 33 } 34 } catch { 35 print(error) 36 } 37 } 38 task.resume() 39 } 40 41 func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int { 42 return self.courses.count 43 } 44 45 func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { 46 47 let cell = UITableViewCell(style: .subtitle, reuseIdentifier: "coursesCell") 48 49 let course = self.courses[indexPath.row] 50 cell.textLabel?.text = (course["lid"] as! String) 51 return cell 52 }

php

1<?php 2//dbApi.php 3 $response = array(); 4 5 if($_SERVER['REQUEST_METHOD']=='POST'){ 6 7 $sid = $_POST['sid']; 8 9 require_once 'dbOperation2.php'; 10 $db = new dbOperation(); 11 12 if($db->selectSQL($sid)){ 13 14 $response = $db->selectSQL($sid)->fetchAll(PDO::FETCH_ASSOC); 15 }else{ 16 17 $response['error'] = true; 18 } 19 20 }else{ 21 22 $response['error'] = true; 23 } 24 25 echo json_encode($response); 26?>

投稿2022/01/06 13:27

SERA0_0b

総合スコア1

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問