3

我在 Java、PHP 和 MySQL 之间有一个奇怪的连接问题。

我无法通过 Java 直接访问网络服务器上的 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)

它在表中有两个条目。

当我使用 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'或任何其他字符或不工作的字符。除了这些查询,其他都很好。

请任何人帮助我解决这个问题。

提前致谢。

4

1 回答 1

5

运行 PHP 脚本的服务器开启了魔术引号设置。这会使用反斜杠自动转义来自 POST/GET/etc 的传入数据中的引号。不推荐使用魔术引号,它们自 PHP 5.4.0 起已被弃用。禁用它们并为您的代码添加适当的卫生 - 直接从外部输入执行查询是一个巨大的安全风险。

于 2012-11-22T05:48:49.657 回答