2015-11-07 112 views
2

我有一個處理傳入信息的PHP頁面,它使用shell_exec()這個參數並構造一個命令在服務器上執行一個Java類。從PHP執行java MySQL存儲過程

Java類獲取參數並調用MySQL中的存儲過程並返回所需的結果。我已經從終端獨立地測試了我的Java類,並且它工作正常。

我的問題是,當我從PHP執行Java類時,它會一直運行,直到我定義存儲過程調用的行並停止在那裏並返回NULL

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

的沒有例外,同時由於上述行執行處於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; 
    } 

UPDATE: 我已經從這個問題是地方縮小,最後發現,雖然specifiying司機通過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: 能夠使用驅動程序我在/etc/profile/ 添加了CLASSPATH但是我注意到,更改僅適用於登錄用戶。但是apache在運行shell_exec()的時候正在使用用戶「www-data」,我無法想出一個將類路徑分配給該用戶的方法。

+1

添加'e.printStacktrace()'獲取錯誤的詳細信息。 – Blip

+0

顯示更多代碼T. http://www.mysqltutorial.org/calling-mysql-stored-procedures-from-jdbc/ – Drew

+0

沒有錯誤!當我用'shell_exec()'調用它時,java程序就停在那條線上。我在調用存儲過程的方法中使用'system.out.print()'來知道哪裏停止工作。 – Tarounen

回答

1

在運行PHP腳本之前,您必須將類路徑添加到執行的命令,否則請設置CLASSPATH。

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

java -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. 

噢,順便說一下,執行基於網絡POST的內容的外殼命令是超級不安全的。有人可以發佈; rm -f /來消滅你的系統或其他東西來破解你。

+0

感謝您的信息。但是有沒有其他的方式來執行這些Java類從哪個shell命令? – Tarounen