利用appserv與php從sql資料庫取得資料
例如我想搜尋一個名單資料表中編號欄位為「N01」的資料
就會打sql:select * from namelist where num='N01'
那N01就是我要從程式送出的變數
然後抓php印出來的結果
這裡示範程式回傳的是字串,不過它會把php裡echo出來的東西都存在同一個變數裡
我把要印的排好後echo出來、存回來後用split字串處理來分割存成陣列,再去運用
流程:
一個輸入條件的edittext、一個送出訊息的按鈕、一個印出結果的textView
按按鈕後用HttpPost送出post訊息、php取回資料、分割字串成陣列
sql的一些設定:
(1)下載並安裝appserv(我用2.5.10)
(2)若是從mysql取資料就不用特別設定,
若是從mssql則要:
1.下載mssql的驅動:Microsoft Drivers for PHP for SQL Server
2.解壓縮後裡面所有的dll檔案複製到C://Windows/System32還有C://Appserv/php5/ext裡面
3.改變appserv的php.ini檔,把以下的內容放到php.ini裡的Windows Extensions那邊的後面
(有一推extension=xxxx.dll的地方)
extension=php_pdo_sqlsrv_52_nts_vc6.dll
extension=php_pdo_sqlsrv_52_ts_vc6.dll
extension=php_pdo_sqlsrv_53_nts_vc6.dll
extension=php_pdo_sqlsrv_53_nts_vc9.dll
extension=php_pdo_sqlsrv_53_ts_vc6.dll
extension=php_pdo_sqlsrv_53_ts_vc9.dll
extension=php_sqlsrv_52_nts_vc6.dll
extension=php_sqlsrv_52_ts_vc6.dll
extension=php_sqlsrv_53_nts_vc6.dll
extension=php_sqlsrv_53_nts_vc9.dll
extension=php_sqlsrv_53_ts_vc6.dll
extension=php_sqlsrv_53_ts_vc9.dll
而且extension前面不能加『;』
並把裡面;extension=php_mssql.dll的分號去掉
4.記得重開appserv的服務
5.連mssql跟連mysql的語法也不一樣
<? //連接資料庫 $serverName = "伺服器名稱"; //$connectionInfo寫法必須使用array $connectionInfo = array("Database"=>"資料庫名稱","Uid"=>"帳號","Pwd"=>"密碼","CharacterSet" => "UTF-8"); //在這個版本,參數多了CharacterSet,可以選定UTF-8內碼 $conn = sqlsrv_connect( $serverName, $connectionInfo); if ( $conn === false ) { sqlsrv_errors(); } ?>我試著把這段程式碼用include的來代替連結,不過不曉得為什麼好像行不通
所以我用另外一個php把伺服器名稱、資料庫名稱、帳號密碼等變數宣告在裡面
然後要連接的時候再把那個php用include載入,在這裡使用變數
就不用在把php放到別台的時候又要一個個改
6.執行mssql的語法範例
<? //範例 $sql="select * from SystemUser"; //sqlsrv_query($conn,$sql) $conn是上面那段連結伺服器的變數 $result=sqlsrv_query($conn,$sql)or die("sql error".sqlsrv_errors()); //用迴圈印出內容,後面加一個分割用的辨識符號 while ($avc=sqlsrv_fetch_array($result)){ echo $avc["欄位名稱"].":"; } ?>
android程式:
public class phpTest extends Activity{ private EditText posttxt; private Button postBtn; private TextView postResult; String msg; String txt; //php的網址 private String postUrl="http://localhost:8080/phptest.php"; @Override public void onCreate(Bundle savedInstanceState) { //中略 //按鈕點擊事件 postBtn.setOnClickListener(new OnClickListener(){ public void onClick(View v) { msg = posttxt.getEditableText().toString(); String result; result = sendPostDataToInternet(msg); //使用「:」進行切割 String[] names = result.split(":"); //組合結果 for(int i=0;i<=names.length;i++){ txt=txt+"和"+names[i]; } postResult.setText(txt+""); } } private String sendPostDataToInternet(String strTxt) { /* 建立HTTP Post連線 */ HttpPost httpRequest = new HttpPost(postUrl); /* * Post運作傳送變數必須用NameValuePair[]陣列儲存 */ List<NameValuePair> params = new ArrayList<NameValuePair>(); params.add(new BasicNameValuePair("data", strTxt)); try { /* 發出HTTP request */ httpRequest.setEntity(new UrlEncodedFormEntity(params, HTTP.UTF_8)); /* 取得HTTP response */ HttpResponse httpResponse = new DefaultHttpClient() .execute(httpRequest); /* 若狀態碼為200 ok */ if (httpResponse.getStatusLine().getStatusCode() == 200) { /* 取出回應字串 */ String strResult = EntityUtils.toString(httpResponse .getEntity()); // 回傳回應字串 return strResult; } } catch (ClientProtocolException e) { Toast.makeText(this, e.getMessage().toString(), Toast.LENGTH_SHORT) .show(); e.printStackTrace(); } catch (IOException e) { Toast.makeText(this, e.getMessage().toString(), Toast.LENGTH_SHORT) .show(); e.printStackTrace(); } catch (Exception e) { Toast.makeText(this, e.getMessage().toString(), Toast.LENGTH_SHORT) .show(); e.printStackTrace(); } return null; }}