1

私はこのコードを 16 時間近く使用してきましたが、結果はまだまったく意味がありません。

私がやっていることは、POST パラメーターを URL に送信する Java プログラムを作成することです。また、Firefox でフォームを使用して同じ方法をテストしています。

問題は、Firefox で、送信されている値をテストしてエコーアウトすることです。また、等しいはずであることがわかっている値に対して値をテストしますが、Java が値を送信すると false を返しますが、Firefox は true を返します。これはなぜですか?

PHP コード:

    $player = array('code' => "code");
    $msg = "neither";

    if(isset($_POST['player']))
    {
        $player = getPlayer(DB_HOST, DB_USERNAME, DB_PASSWORD, DB_NAME, DB_TABLE_NAME, $_POST['player']);
        $msg = "?player=" . $_POST['player'] . " post";
    }

    function getPlayer($DbHost, $DbUsername, $DbPassword, $DbName, $DbTableName, $name)
    {
        try
        {
            $dsn = "mysql:host=$DbHost;dbname=$DbName"; //Data Source Name = MySQL
            $dbc = new PDO($dsn, $DbUsername, $DbPassword); //Connect to DB

            $query = "SELECT * FROM $DbTableName WHERE name = :name";
            $result = $dbc->prepare($query); //Prepare query

            if($name == "pathurs")
            {
                echo 'true:' . $name;
            }
            else
            {
                echo 'false:' . $name;
            }

            $result->bindParam(':name', $name, PDO::PARAM_STR);

            $result->execute(); //Execute Query

            while($row = $result->fetchObject()) //Loop through results
            {
                $array = array();

                //Convert stdClass($row) to array($array)
                foreach($row as $key => $value)
                {
                    $array[$key] = $value;
                }

                $dbc = null;
                return $array;
            }
        }
        catch(PDOException $e)
        {
            echo $e->getMessage();
        }
    }

    echo "code:" . $player['code'] . $msg . $_POST['player'];

Java コード:

public String getContent(String url, String params)
    {
        String result = "";

        try
        {
            this.url = new URL(url);
            try
            {
                URLConnection con = this.url.openConnection();
                con.setDoOutput(true);

                PrintStream ps = new PrintStream(con.getOutputStream());
                ps.println(params);

                InputStream is = con.getInputStream();
                BufferedReader in = new BufferedReader(new InputStreamReader(is));
                String line = "";

                while((line = in.readLine()) != null)
                {
                    result += line;
                }

                System.out.println(result);
            }
            catch(IOException e)
            {
                e.printStackTrace();
            }
        }
        catch(MalformedURLException e)
        {
            e.printStackTrace();
        }

        return result;
    }

Firefox の出力:

true:pathurscode:code?player=pathurs postpathurs

Java プログラム出力:

false:pathurscode:?player=pathurs postpathurs

(20 行目の PHP コードで)比較すると$name == "pathurs"、Firefox では true になるのに、Java では false になるのはなぜですか? 両方ともPHPページでテストされ、両方とも文字列であり、両方が次の形式に等しいことをエコーで出力するのを見るのは意味がありません'pathurs'

私が何か間違ったことはありますか?Java が情報を送信するときにのみ発生し、Firefox が送信するときに発生しない理由は、現在のところわかりません。PDOクエリを次のように置き換えてテストしました:

$query = "SELECT * FROM $DbTableName WHERE name = 'pathurs'";

両方の出力で完全に機能します。これは私をさらに混乱させます。誰かが助けてくれることを願っています!

前もって感謝します!

4

2 に答える 2

4

それはあなたが使用しているためです:

ps.println(params);

つまり、params の後に改行文字を送信しています。player=pathurs\n

試す:

ps.print(params);
于 2013-02-05T23:05:01.380 に答える
-1

コードで比較が行われている場所はわかりませんが、Java について次のように説明できます。

Java で 2 つの文字列を比較する場合は、== を使用しないでください。文字列クラスの .equals メソッドを使用するか、compareTo などを使用してください。その理由は、Java では、2 つの文字列が同じオブジェクトを参照している場合にのみ == になるためです。文字列を作成するとき、Javaはしばしばこれを独自に行います。「name」という文字列を作成し、プログラムの他の場所で「name」という別の文字列を作成すると、周りを見回して「ねえ、彼はすでにname, let's use a pointer to that"" これは人々を混乱させる可能性があります。これは == がしばしば t​​rue になるようにするためですが、信頼性は低くなります。

私の推測では、文字列の 1 つがプログラムの外部から受信されているため、同じ文字列オブジェクトを参照していないため、== ではありません。

質問を誤解した場合は、お詫び申し上げます:)

于 2013-02-05T23:00:39.300 に答える