2

受信情報を処理する PHP ページがあります。このページは、パラメーターを受け取り、サーバーで Java クラスを実行するコマンドを作成しますshell_exec()

Java クラスはパラメータを受け取り、MySQL でストアド プロシージャを呼び出し、必要な結果を返します。Java クラスを端末から独立してテストしましたが、完全に動作しています。

私の問題は、PHP から Java クラスを実行すると、ストアド プロシージャ呼び出しを定義している行まで実行され、そこで停止して返されることNULLです。

cSt = conn.prepareCall("{CALL prcName(?,?,?,?)}");

上記の行は a にtry catchあり、からのメッセージは出力されないため、実行中に例外はありませんcatch

プログラムはこの行まで実行され、NULL!が返されます。

PHPのページは次のとおりです。

<?php     
    $name= $_POST['name'];
    $contact= $_POST['contact'];

    $response =  shell_exec("java ClassName".$name." ".$contact);

    echo $response;
?>

Java クラス (一部):

public static void main(String[] args) {
        //connection to database
        int returnValue = methodName(args[0], args[1]);
        System.out.print(String.valueOf(returnValue));
        //close connection to db
}
public static int methodName(String name,String contact){
        int result = 5; 
        try {
            cSt = conn.prepareCall("{CALL prcName(?,?,?)}");
            cst.CallableStament().setString("name",name);
            cst.CallableStament().setString("contact",contact);
            cst.CallableStament().registerOutParameter("rtn", java.sql.Types.INTEGER);
            cst.CallableStament().execute();

            result = cst.CallableStament().getInt("rtn");           
        } catch (SQLException e) {e.printStackTrace();}
        return result;
    }

更新:問題がどこにあったかを絞り込み、最終的にドライバーを指定しているときClass.forName("com.mysql.jdbc.Driver"); にエラーが発生することがわかりました:

java.lang.ClassNotFoundException: com.mysql.jdbc.Driver
    at java.net.URLClassLoader$1.run(URLClassLoader.java:366)
    at java.net.URLClassLoader$1.run(URLClassLoader.java:355)
    at java.security.AccessController.doPrivileged(Native Method)
    at java.net.URLClassLoader.findClass(URLClassLoader.java:354)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:425)
    at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:308)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:358)
    at java.lang.Class.forName0(Native Method)
    at java.lang.Class.forName(Class.java:195)
    at Classname.Connect(classname.java:29)
    at classname.

更新 2: ドライバーを使用できるようにするために、CLASSPATH を追加しました/etc/profile/ が、この変更はログイン ユーザーのみに適用されることに気付きました。しかし、Apacheは実行中にユーザー「www-data」を使用しているshell_exec()ため、そのユーザーにクラスパスを割り当てる方法がわかりません。

4

1 に答える 1

1

実行するコマンドにクラスパスを追加するか、PHP スクリプトを実行する前に CLASSPATH を設定する必要があります。

$response =  shell_exec("java -classpath mysql.jar ClassName".$name." ".$contact);

ジャバ -h

-cp <class search path of directories and zip/jar files>
-classpath <class search path of directories and zip/jar files>
              A ; separated list of directories, JAR archives, # : separated list on Linux
              and ZIP archives to search for class files.

ところで、Web POST の内容に基づいてシェル コマンドを実行するのは非常に安全ではありません。誰かが; rm -f /あなたのシステムを一掃するために投稿したり、あなたをハッキングしたりする可能性があります。

于 2015-11-07T22:23:28.660 に答える