從 MySQL 讀取資料至 AppInventor
資料庫!可以用來存放會員的基本資料、購物網站的商品庫存、網路上的留言板… 等等,不管學習哪種程式語言,幾本上都會使用到資料庫,而 MySQL 更是學習資料庫者,必會接觸到的其中一種(或是 MariaDB),這次要來教,如何把 MySQL 資料庫裡的資料,讀取到 App Inventor 顯示!
以往看到的相關教學書籍,很多都是在自己的電腦架一個伺服器(如:XAMPP),然後再去執行、連接,但是這樣做出來的範例,只能在自己的電腦上執行,別人是看不到的,除非你有固定IP 可以設定,所以這次我們來使用免費虛擬主機 000WebHost,將我們寫好的 PHP 檔案,放在它們的伺服器執行。
沒用過 000WebHost 的話,可以參考我的「申請免費虛擬主機 000WebHost 並安裝 OpenCart 購物車系統 – JB 程式筆記 (jbprogramnotes.com)」,先去辦一個帳號,並創建一個網站。接著再繼續教學
P.S. 新建立的 000WebHost 免費虛擬主機,又被刪掉了!所以改將檔案放到我自己的虛擬主機,目前已更新完畢。
- 開啟妳的 000WebHost 網站後台,將 PHP 版本改成 7.3。
2. 建立一個資料庫(等等資料庫的名稱、使用者姓名和伺服器,要填到我們的 PHP 檔案裡。)
建立好後,點紫色的 Manage 框,再點 PhpMyAdmin。(我們要來建立資料表,和新增幾筆資料。)
進到 phpMyAdmin 後,滑鼠點選左方資料庫(id15424044_appinventor 這個),然後於右方輸入資料表名稱(member),欄位數為 3,好了之後再點右方的執行按鈕。
名稱請依序輸入 id、name、password,類型都是 VARCHAR,長度隨便妳填,空值方框請打勾,好了之後按右下方的儲存按鈕。
接著我們來新增幾筆資料
點上方的 SQL,然後再點下方的 INSERT 按鈕。(Insert Into 是要新增資料的 SQL 語法)
把 [value-1],[value-2],[value-3] 改成妳要填入的資料,如下:
“Gundam”,”鋼彈”,”1234″
填完後再按執行
INSERT INTO `member`(`id`, `name`, `password`) VALUES ("Gundam","鋼彈","1234")
好了之後按瀏覽,就可以看到剛剛新增的資料,這裡請再多新增幾筆。
資料庫的操作就到這邊,接下來來撰寫 PHP 程式碼,請開啟記事本。
3. 請輸入以下程式碼,記得將 $db_username、 $db_password 和 $db_uname 改成自己的;這裡我用 PDO 的連線方式,檔名請存成「connMySQL.php」。
<?php
$db_host = "localhost";
$db_username = "id15424044_james";
$db_password = "abc123456789D!";
$db_name = "id15424044_appinventor";
try {
$pdo = new PDO("mysql:host={$db_host};dbname={$db_name};charset=utf8", $db_username, $db_password);
} catch(PDOException $e) {
print "資料庫連結失敗";
die();
}
?>
這是連線到資料庫的程式碼,好了之後先將檔案上傳到 000WebHost,上傳完後輸入網址看看,如果網頁一片空白,就是連線成功。
可以參考我的 ->
https://jbprogramnotes.com/AppInventor/PHPFiles/connMySQL.php
接著撰寫讀取的程式碼,請開新一個檔案,並輸入以下程式碼:
<?php
include("connMySQL.php");
$sql_query = "SELECT * FROM member";
$result = $pdo->query($sql_query);
foreach($result as $row) {
echo "<p>";
echo $row["id"], ":";
echo $row["name"], ":";
echo $row["password"];
echo "</p>";
}
?>
檔名請存成「MysqlRead.php」
程式一開始先引入剛剛寫的程式(include(“connMySQL.php”);),如果有連線成功再繼續執行下去。
變數 sql_query 存放 SQL 語法(SELECT * FROM member 是讀取 member 資料表的所有資料)。
$pdo 是剛剛在 connMySQL.php 裡指定的,用 -> 符號呼叫 query 方法,帶入的參數是變數 sql_query,最後將結果再給變數 result。
foreach 迴圈裡,將 result 資料逐一給變數 row,因為讀取是一列一列的,所以我用 row 名稱,然後要取出資料就用 row[“欄位名稱”]。
裡面 echo 可以縮成一行啦!但為了方便閱讀,所以用成好幾行。
用 p 標籤包住是為了等等在 Inventor 分割資料用的
寫好後一樣上傳至 000WebHost 主機,要跟 connMySQL.php 放在同一個資料夾,上傳完後可以執行看看,看能不能讀取到資料。
以我的為例:
https://jbprogramnotes.com/AppInventor/PHPFiles/MysqlRead.php
接下來要開始製作 App,請開啟 App Inventor 並新增一個專案。
4. 請拖拉按鈕、標籤及網路元件
切換到程式設計,程式方塊如下:
網路元件的網址是檔案 MysqlRead.php 的所在位置,以我的為例就是:
https://jbprogramnotes.com/AppInventor/PHPFiles/MysqlRead.php
當網路元件取得文字後,先判斷回應程式碼是否為 200,200 就是成功,來看一下結果。
如果妳在標籤的元件屬性,有設定 HTML 格式的話,p 標籤就會看不見。
接著我們來切割資料,並存到 List。
請增加一個變數 List,並建立空清單。
將讀取的程式方塊修改如下:
先將回應內容的 <p> 全部取代掉,剩下的每筆資料間只剩 </p> 隔著,然後再用分解方塊,就可以將它變成清單了!
在清單裡的資料,還可以再分割,符號就用全形的冒號,趕快調整成自己獨特的呈現方式吧!
這次的教學就到這邊,有哪裡看不太懂的,歡迎留言詢問!
13 則留言
Tom
安安 站長,
請問一下為什麼用瀏覽器時會出現亂碼?
使用APPS時會出現一些HTML語法?
跟不是用000WebHost有關系嗎?
https://ibb.co/6yCVFTV
http://grandfa.epizy.com/MysqlRead.php
JamesBang
會出現亂碼的話,你要看一下,你的資料庫建立時用的編碼,如果是照我的程式碼打的話,在連線時我是用 utf8,也可以試著在你的 php 檔案中設定編碼格式。
我剛剛試著用你的網址,也出現一樣的情形,我想應該是你用的伺服器的問題,跟用不用 000WebHost 沒什麼關係的!它只是虛擬主機而已
你使用的網站在連線時,可能會先跑它們自己的 JavaScript,你圖片中的回應內容的最後一段,有用 noscript 標籤提示你「This site requires Javascript to work, please enable Javascript in your browser or use a browser with Javascript support」,所以用網路瀏覽器元件,就可以看到內容!但如果要透過 Web 元件,去擷取資料,你可能要換個主機試試看!
Tom
感謝站長回覆,我轉了用000webhost就沒有事了。
你這個網頁的教學文章很豐富,你肯定是個編程高手,我從這裡學到很多東西,多謝站長無私分享:)
另外我想學多一點關於PHP的語法,你可否分享多一點有關PHP的文章?感謝: )
JamesBang
謝謝你的支持!我還沒有到高手那麼厲害啦~~
只是一些玩具玩久了,會一點小技巧而已!
沒問題!!本來就有打算寫 PHP 的教學,之後有時間會不定時更新文章。謝謝
Yura
可以請問一下類似這樣的讀取
文字數量會有限制嗎?
假使資料庫內資料量很大的時候(例如數千筆會員帳號密碼)
也能照文中方法順利讀進來嗎?
若讀進來後再逐一去比對使用者輸入的帳號密碼完成一個登入程式
這樣是否會是一個較沒效率的做法?
目前正在嘗試app inventor連結資料庫的部分 對這類問題一點概念也沒有
JamesBang
妳好!雖然我自己是沒一次讀過那麼多筆資料,但我想應該是沒問題的!!
在教學範例裡,我 SQL 是下「SELECT * FROM member」,這個就是從 member 的資料表讀取所有的資料,只要在這個資料表裡的,不論筆數,應該全部都能讀取到才對。
但妳如果要把資料先全部讀到 App Inventor,然後再一筆一筆去做比對,這當然是很沒效率的做法!所以應該要下 SQL 去抓妳要的會員資料,例如:「SELECT * FROM member where login=帳號 and password=密碼」。
不過如果是對 PHP 不太熟悉的話,可以考慮用 Google 試算表,可是 Google 試算表裡不能用密碼,所以妳的欄位名稱要改掉。
Yura
感謝站長回覆
登入程式的瓶頸已經順利度過了
不過後續位於同個項目中的程式碼我又卡住了
我又另寫了一個.php來執行另一項讀取工作 但include同樣一個connMySQL.php
之後再測試的時候我發現資料在讀取的時候有時候會回傳MySQL sever has gone away的warning
導致我的app inventor 接不到正常預想的回傳文字使程式出錯
想在冒昧請教這類問題該如何解決呢
是因為我沒有在執行完時關閉資料庫連線呢或是這是000WebHost免費版的缺點呢
(我是使用000WebHost內的database)
JamesBang
妳好!
會發生 MySQL server has gone away 的情況有幾種,但因為沒實際看到妳的狀況,所以也不太清楚該如何幫妳解決。
妳可以參考以下網站的解決辦法:
http://missions5.blogspot.com/2018/10/mysql-server-has-gone-away.html
https://gtstudy.pixnet.net/blog/post/43173127
不過我想妳也很有可能是超出了 000WebHost 的限制
https://i.imgur.com/DPZcIgQ.png
下面這個網站有寫關於 000WebHost 的限制項目
https://www.000webhost.com/forum/t/website-limitations-free-plans/179628
有時候 000WebHost 的系統突然停止時也會發生 MySQL server has gone away,畢竟是免費的,像我剛剛去查看,它的 DB 就是 Down 的狀態。
https://i.imgur.com/TkzkVrz.png
https://status.000webhost.com/
Jun
你好!我將程式碼放在自己的資料庫裡,connMySQL.php有照您的方式修改,網頁有出現一片空白,但在MysqlRead.php這裡卻沒辦法顯示資料也是一片空白。我有將兩隻程式碼放在一起能不能幫我看看呢?
connMySQL.php:https://upload.cc/i1/2022/03/24/h71v30.png
MysqlRead.php:https://upload.cc/i1/2022/03/24/jOPm6K.png
資料庫:https://upload.cc/i1/2022/03/24/EW41Qo.png
JamesBang
你好
因為你的資料表叫「DHT」,所以要把你 MysqlRead.php 的第四行改成「SELECT * FROM DHT」
tim
MysqlRead.php 沒辦法顯示是哪裡的問題?
TIM
https://upload.cc/i1/2022/03/24/EDwNts.png
Jun
我有按照您的方式將connMySQL.php修改成自己的,有部分有成功網頁是一片空白,但是在MysqlRead.php讀取時沒辦法顯示也是一片空白,可能是哪裡出現問題了?
connMySQL.php:https://upload.cc/i1/2022/03/24/h71v30.png
MysqlRead.php:https://upload.cc/i1/2022/03/24/jOPm6K.png
資料庫:https://upload.cc/i1/2022/03/24/EW41Qo.png