2011年12月14日 星期三

透過php與sql連結取得資料回來的方法

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

1 則留言: