3

Java、PHP、および MySQL 間の接続で奇妙な問題が発生しています。

Java を介して Web サーバー上の MySQL データベースに直接アクセスできません。そこで、PHP スクリプトを実行するようにメカニズムを変換しました。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();
    }
    }

    }

フィールドSID INT(3)、SNAME VARCHAR(20)、SLNAME VARCHAR(20)を持つTESTという名前のテーブルがあります

テーブルには 2 つのエントリがあります。

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からの受信データの引用符がバックスラッシュで自動的にエスケープされます。マジッククォートの使用は推奨されておらず、PHP5.4.0以降非推奨になっています。それらを無効にして、コードに適切なサニテーションを追加します。外部入力から直接クエリを実行することは、セキュリティ上の大きなリスクです。

于 2012-11-22T05:48:49.657 に答える