2012-11-22 124 views
3

我在Java,PHP和MySQL之間有一個奇怪的連接問題。使用PHP從Java連接到MySQL

我並沒有對通過Java Web服務器直接訪問我的MySQL數據庫。所以,我轉換了這個機制來運行一個PHP腳本,它爲我完成了這項工作,並將結果返回給我的Java應用程序。

它的工作非常適合大多數的查詢。但是當查詢包含查詢中的字符字段時,我沒有得到預期的結果。

我包括PHP和Java代碼片斷以供參考。

請找我的事,我哪裏做錯了......

PHP腳本在服務器上...

<?php 
$query=$_POST["query"]; 
echo" Query = ".$query."\n"; 
if($query){ 
$link=mysql_connect("mysql2.000webhost.com","a7946109_other","mypassword"); 
if($link){ 
mysql_select_db("a7946109_other"); 
$result=mysql_query($query); 
if($result){ 
while($row=mysql_fetch_row($result)){ // for each row in results 
foreach($row as $value){       // for each column in row 
echo "\t".$value; 
} 
echo"\n"; 
} 
} 
}else{ 
echo " MySQL connect failed ! \n"; 
} 
}else{ 
echo " No Query ! \n"; 
} 
exit(); // exit without auto_append_file 
?> 

Java程序...

import javax.swing.*; 
import java.awt.*; 
import java.io.*; 
import java.net.*; 
import java.applet.*; 
import java.security.*; 

public class MySQL_POST { 
    public static void main(String r[]){ 
    HttpURLConnection conn=null; 
    try{ 
    URL url=new URL("mywebsite.com/postdb.php"); 
    String agent="Applet"; 
    String query="query=" + r[0]; 
    String type="application/x-www-form-urlencoded"; 
    conn=(HttpURLConnection)url.openConnection(); 
    conn.setDoInput(true); 
    conn.setDoOutput(true); 
    conn.setRequestMethod("POST"); 
    conn.setRequestProperty("User-Agent", agent); 
    conn.setRequestProperty("Content-Type", type); 
    conn.setRequestProperty("Content-Length", ""+query.length()); 

    OutputStream out=conn.getOutputStream(); 
    out.write(query.getBytes()); 
    BufferedReader in = new BufferedReader(new InputStreamReader(conn.getInputStream())); 
    String inputLine; 
    while((inputLine=in.readLine())!=null){ 
     System.out.print(inputLine+"\n"); 
    }; 
    in.close(); 
    int rc = conn.getResponseCode(); 
    System.out.print("Response Code = "+rc+"\n"); 
    String rm=conn.getResponseMessage(); 
    System.out.print("Response Message = "+rm+"\n"); 
    }catch(Exception e){ 
    e.printStackTrace(); 
    }finally{ 
    conn.disconnect(); 
    } 
    } 

    } 

我有一個表名爲TEST,與域SID INT(3),SNAME VARCHAR(20),SLNAME VARCHAR(20)

它得到了兩架E表中的ntries。

當我執行使用Java以下查詢,我得到不同類型的輸出如下。

> java MYSQL_POST "SELECT * FROM TEST" 

Query = SELECT * FROM TEST 
1 Test1 Test1L 
2 Test2 Test2L 
Response Code = 200 
Response Message = OK 

這是我想要的。

> java MYSQL_POST "SELECT SNAME FROM TEST WHERE SID = 1" 

Query = SELECT SNAME FROM TEST WHERE SID = 1 
Test1 
Response Code = 200 
Response Message = OK 

這也如我所料。

這裏是一個奇怪的。

> java MYSQL_POST "SELECT SID FROM TEST WHERE SNAME = 'Test1'" 

    Query = SELECT SID FROM TEST WHERE SNAME = \'Test1\' 
Response Code = 200 
Response Message = OK 

不會導致任何結果,如預期應該是1

的查詢,其中涉及類似SNAME = 'Test1'或任何其他或不工作的字符。除了這些查詢外,其他的都很好。

請任何人都幫我解決這個問題。

在此先感謝。

+0

您是否嘗試過使用'''代替 – Abubakkar

+0

是的,但它也會導致相同的結果...沒有結果。:( – Rajesh

+0

WHERE SNAME = \'Test1 \''顯然不是有效的查詢,反斜槓是 – deceze

回答

5

運行PHP腳本的服務器具有magic quotes設置上。這會自動在POST/GET/etc中使用反斜槓傳入數據中的引號。不推薦使用魔術引號,並且自PHP 5.4.0起已棄用它們。 Disable them,併爲您的代碼添加適當的衛生設施 - 從外部輸入直接執行查詢存在巨大的安全風險。

+0

非常感謝。這解決了我的問題。 – Rajesh