利用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;
}}