Uncaught Исключение SoapFault: [soapenv: Сервер] Перед запуском набора результатов - PullRequest
0 голосов
/ 06 января 2019

Я разрабатываю веб-сервис для веб-сайта электронной коммерции и возвращаю все продукты, основанные на некотором поставщике из java, в клиент php, но он выдает мне эту ошибку

Fatal error: Uncaught SoapFault exception: [soapenv:Server] Before start of result set in C:\wamp\www\eshop\viewProductsSupplier.php:194 Stack trace: #0 C:\wamp\www\eshop\viewProductsSupplier.php(194): SoapClient->__soapCall('viewProducts', Array) #1 {main} thrown in C:\wamp\www\eshop\viewProductsSupplier.php on line 194

Я пытался проверить, выполняется запрос или нет, но все нормально

// php код

$soapclient = new SoapClient('http://localhost:8090/Eshop_ecommerce/services/Eshop_ecommerce?wsdl', ['trace' => 1]);
            session_start();
            $id=array('id'=>@$_SESSION['supplierId']);
            $response=$soapclient->__soapCall("viewProducts",$id);
            if (isset($response->Name))
            {
                print $response;
            }
            else
            {
                print "Data is null";
            }

// Java-код

ViewProductsResponse res = new ViewProductsResponse();
                Class.forName(driver);
                conn = DriverManager.getConnection(url,username,password);
                stmt = conn.createStatement();
                String Query=null;
                String in=viewProducts.getViewProductsRequest();
                if(!in.isEmpty())
                {
                    Query="SELECT * FROM product";
                }
                else
                {
                    Query="SELECT * FROM product WHERE product_supplier_id='"+viewProducts.getViewProductsRequest()+"'";
                }
                ProductArray pa=new ProductArray();
                ResultSet result= stmt.executeQuery(Query);
                //System.out.println(result);
                while(result.next())
                {
                    Product p= new Product();
                    //System.out.println(result.getString("product_id"));
                    p.setId(result.getString("product_id"));
                    p.setName(result.getString("product_name"));
                    p.setPrice(result.getString("product_price"));
                    p.setStock(result.getString("product_stock"));
                    String supplierNameQuery="SELECT supplier_id,supplier_name FROM supplier WHERE supplier_id='"+result.getString("product_supplier_id")+"'";
                    ResultSet resultSupplierName = stmt.executeQuery(supplierNameQuery);
                    p.setSupplierName(resultSupplierName.getString("supplier_name"));
                    String catQuery="SELECT * FROM product_category WHERE category_id='"+result.getString("product_category_id")+"'";
                    ResultSet resCat= stmt.executeQuery(catQuery);
                    p.setCategoryName(resCat.getString("category_name"));
                    pa.setProduct(p);
                    res.setProducts(pa);
                }
                //res.setViewProductsResponse("Data Entered");
                return res;

где, как я ожидаю, будут напечатаны все полученные продукты

1 Ответ

0 голосов
/ 06 января 2019

A ResultSet , возвращаемый из Оператор # executeQuery расположен перед первой строкой (см. Связанный JavaDoc). Чтобы такие ResultSet могли указывать на первую строку, их необходимо переместить на нее, например, используя метод next () . Это сделано для внешнего SELECT, но не для двух внутренних. Кроме того, необходимо проверить возвращаемое значение из next() call, чтобы увидеть, есть ли вообще какая-либо строка в этом ResultSet.

Это может быть достигнуто, например, так:

 if(resultSupplierName.next()) {
     p.setSupplierName(resultSupplierName.getString("supplier_name"));
 }
 if(resCat.next()) {
     p.setCategoryName(resCat.getString("category_name"));
 }

Обратите внимание, что опубликованный код имеет другие открытые проблемы, например, ресурсы JDBC не закрыты. Я настоятельно рекомендую посмотреть либо на JEE, либо на Spring (учитывая, что код явно запускается на сервере приложений) или, по крайней мере, на this . Далее код склонен к SQL-инъекции

...