Pagina 1 di 2 1 2 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 14
  1. #1
    Utente di HTML.it
    Registrato dal
    Jul 2012
    Messaggi
    21

    Errore "Cannot use object of type stdClass as array"

    Sto cercando di far stampare il risultato ottenuto da una chiamata Soap.
    Infatti sto sviluppando un piccolo web services che utilizza java e php e comunicano tramite axis2.
    Avevo realizzato delle funzioni in Java che restituivano degli ArrayList di ArrayList, ma solo alla fine mi sono reso conto che non erano supportati da axis2 e da jax-rpc, quindi ho fatto restituire delle matrici, cioè

    codice:
    String[][] nomeFunzione();
    Pensavo di aver risulto, perché avevo letto che axis2 non aveva problemi con gli array.
    Quindi in php ho pensato di utilizzare array di array per leggere il risultato recuperato tramite chiamata Soap, però ricevo questo errore: "Cannot use object of type stdClass as array.
    Il pezzo di codice PHP che mi da errore è questo:
    Codice PHP:
    $client = new SoapClient('');
    $result=array(array());
    $result=$client->listaNovita();
    [
    B]if($result[0][0]=='') { [/B
    Se faccio un
    Codice PHP:
    print_r($result); 
    ottengo
    codice:
    stdClass Object ( [return] => )
    Sapete aiutarmi?
    Come accedo ai all'oggetto?

    Grazie a tutti per l'eventuale risposta.

  2. #2
    Utente di HTML.it
    Registrato dal
    Apr 2004
    Messaggi
    3,709
    un $result->result va? vedi un po'...

  3. #3
    Utente di HTML.it
    Registrato dal
    Jul 2012
    Messaggi
    21
    Originariamente inviato da eiyen
    un $result->result va? vedi un po'...
    Intendi $result->return nel print_r?

    Se così fosse ho già provato; non stampa nulla ma non restituisce neanche errore.

  4. #4
    Utente di HTML.it
    Registrato dal
    Apr 2004
    Messaggi
    3,709
    ma var_export($result->result) cosa fornisce?

  5. #5
    Utente di HTML.it
    Registrato dal
    Jul 2012
    Messaggi
    21
    Allora,
    Codice PHP:
    print_r($result->result); 
    Notice: Undefined property: stdClass::$result in /var/www/saed/index.php on line 155
    mentre
    Codice PHP:
    var_export($result->result); 
    Notice: Undefined property: stdClass::$result in /var/www/saed/index.php on line 155
    NULL

    EDIT:
    purtroppo ho capito dove sta il problema. E' la funzione in java che ha qualche problema.
    Questo il codice incriminato:
    codice:
    public String[][] listaNovita() {
    		int numero = 0;
    		String risultato[][] = null;
    		if (!connectDatabase()) {
    			return risultato;
    		}
    		try {
    			String query = "SELECT count(titolo) AS numero FROM libri_table;";
    			PreparedStatement prstmt = con.prepareStatement(query);
    			ResultSet rs = prstmt.executeQuery();
    			if (rs.next() != false) {
    				numero = rs.getInt("numero");
    			}
    			prstmt.close();
    			rs.close();
    		} catch (SQLException e) {
    			System.out
    					.println("Errore. TRaaaaaaaaaaa Impossibile eseguire l'operazione richiesta.\n");
    			e.printStackTrace();
    			return risultato;
    		}
    		if (numero == 0) {
    			return risultato;
    		}
    		if(numero>0 && numero <=4) {
    			risultato = new String[numero][2];
    		}
    		if(numero>4) {
    			risultato = new String[3][2];
    		}
    		ResultSet rs;
    		try {
    			String query = "SELECT titolo,autore,data_inserimento FROM libri_table ORDER BY data_inserimento DESC;";
    			PreparedStatement prstmt = con.prepareStatement(query);
    			rs = prstmt.executeQuery();
    			if (rs == null) {
    				risultato[0][0] = "";
    				return risultato;
    			}
    			while (rs.next()) {
    				for (int i = 0; i <= numero; i++) {
    					for (int j = 0; j <= 2; j++) {
    						if (j == 0) {
    							risultato[i][j] = rs.getString("titolo");
    						} else if (j == 1) {
    							risultato[i][j] = rs.getString("autore");
    						} else if (j == 2) {
    							risultato[i][j] =(rs.getTimestamp("data_inserimento")).toString();
    						}
    					}
    				}
    			}
    			prstmt.close();
    			rs.close();
    		} catch (SQLException e) {
    			System.out
    					.println("Errore. Impossibile eseguire l'operazione richiesta.\n");
    			e.printStackTrace();
    			return risultato;
    		}
    		return risultato;
    	}
    Questo è l'errore che ho in java.
    codice:
    [ERROR] 2
    java.lang.reflect.InvocationTargetException
    	at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    	at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
    	at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    	at java.lang.reflect.Method.invoke(Method.java:601)
    	at org.apache.axis2.rpc.receivers.RPCUtil.invokeServiceClass(RPCUtil.java:212)
    	at org.apache.axis2.rpc.receivers.RPCMessageReceiver.invokeBusinessLogic(RPCMessageReceiver.java:117)
    	at org.apache.axis2.receivers.AbstractInOutMessageReceiver.invokeBusinessLogic(AbstractInOutMessageReceiver.java:40)
    	at org.apache.axis2.receivers.AbstractMessageReceiver.receive(AbstractMessageReceiver.java:114)
    	at org.apache.axis2.engine.AxisEngine.receive(AxisEngine.java:181)
    	at org.apache.axis2.transport.http.HTTPTransportUtils.processHTTPPostRequest(HTTPTransportUtils.java:172)
    	at org.apache.axis2.transport.http.AxisServlet.doPost(AxisServlet.java:146)
    	at javax.servlet.http.HttpServlet.service(HttpServlet.java:641)
    	at javax.servlet.http.HttpServlet.service(HttpServlet.java:722)
    	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:305)
    	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210)
    	at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:225)
    	at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:123)
    	at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:472)
    	at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:168)
    	at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:98)
    	at org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:927)
    	at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:118)
    	at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:407)
    	at org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1001)
    	at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:585)
    	at org.apache.tomcat.util.net.JIoEndpoint$SocketProcessor.run(JIoEndpoint.java:310)
    	at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1110)
    	at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:603)
    	at java.lang.Thread.run(Thread.java:722)
    Caused by: java.lang.ArrayIndexOutOfBoundsException: 2
    	at Libreria.Server.listaNovita(Server.java:1939)
    	... 29 more
    Sarà il caso di spostare il post nella sezione java?!

  6. #6
    Utente di HTML.it
    Registrato dal
    Jul 2012
    Messaggi
    21
    Dunque, ho fixato la parte in java ma ci sono ancora dei problemi sulla parte in PHP.
    Java restituisce sempre la solita String[][].
    PHP fa questo:
    Codice PHP:
    $client = new SoapClient('http://localhost:8080/Libreria/services/Server?wsdl');                     $result=array(array());
    $result=$client->listaNovita();
    var_dump($result); 
    L'ultima istruzione mi stampa a video
    codice:
    object(stdClass)#2 (1) { ["return"]=> object(stdClass)#3 (1) { ["array"]=> array(3) { [0]=> string(8) "ciaociao" [1]=> string(9) "ciaaaoooo" [2]=> string(21) "2012-07-25 23:19:59.0" } } }
    Mi sto chiedendo ora, come faccio a leggere i valori contenuti in questo oggetto?
    Ho provato con diverse soluzioni trovate su internet ma nessuna ha funzionato. Nella maggior parte dei casi si trattata di array associativi e per selezionare il valore facevano
    Codice PHP:
    $result->'nomecampo'->'nomecampo' 
    Dato che il mio non è un array associativo ho provato con l'indice ma non funziona e ricevo questo
    Notice: Undefined property: stdClass::$0 in /var/www/saed/index.php on line 157 Notice: Trying to get property of non-object in /var/www/saed/index.php on line 157
    La riga 157 è questa:
    Codice PHP:
    if($result->{'0'}->{'0'}=='') { 
    Questa è una dei miei innumerevoli tentativi di leggere il valore e più o meno ho avuto sempre lo stesso errore.

    In che modo posso parserizzare il contenuto che ricevo in $result?

    EDIT:
    Allora, facendo così
    Codice PHP:
    var_dump($result->return->array[0]); 
    ricevo
    string(8) "ciaociao"
    C'è modo di levare la parte iniziale e le virgolette?

    RIEDIT:

    Basta fare così:
    Codice PHP:
    echo $result->return->array[0]; 
    Però come mai tutte le righe restituite da un
    Codice PHP:
    var_dump($result
    sono uguali alla prima riga dell'array, quando invece la tabella da cui va a prendere i dati java contiene valori differenti?

  7. #7
    Secondo me intanto sbagli a costruirti la risposta, perchè usi indici numerici (piuttosto complessi da gestire, nel momento in cui cambi qualcosa) e soprattutto mescoli il tipo di risultato: una stdClass che contiene array...tanto vale tutto stdClass o tutto array.
    Detto questo, se vuoi trasfromare una stdClass in array ti basta
    Codice PHP:
    $result=$client->listaNovita(); 
    $result = (array) $result
    e quindi, avendo un array (eventualmente multidimensionale) lo puoi gestire come tale.


  8. #8
    Utente di HTML.it
    Registrato dal
    Jul 2012
    Messaggi
    21
    In che modo posso evitare di utilizzare indici numerici? A me è sembrata l'unica soluzione dal momento che Java non gestisce array associativi.
    Al cast non avevo mai pensato; fondamentalmente perché non sapevo con che diavolo di oggetto avevo a che fare.
    Un altra domanda: mi hai scritto come gestire l'oggetto tutto come array, se invece volessi gestirlo come stdClass come dovrei fare? L'accesso ai valori come dovrebbe avvenire? Ho provato ma non sono riuscito, sono dovuto ricorrere agli indici di un array per acchiappare il valore.

    Grazie tanto per la tua risposta!

  9. #9
    Originariamente inviato da lezan
    In che modo posso evitare di utilizzare indici numerici? A me è sembrata l'unica soluzione dal momento che Java non gestisce array associativi.
    ah sì? Questa non la sapevo!

    Originariamente inviato da lezan
    Al cast non avevo mai pensato; fondamentalmente perché non sapevo con che diavolo di oggetto avevo a che fare.
    Un altra domanda: mi hai scritto come gestire l'oggetto tutto come array, se invece volessi gestirlo come stdClass come dovrei fare? L'accesso ai valori come dovrebbe avvenire? Ho provato ma non sono riuscito, sono dovuto ricorrere agli indici di un array per acchiappare il valore.

    Grazie tanto per la tua risposta!
    Per gestire tutto come stdClass basta fare il cast come stdClass... (stdClass) $variabile.
    Per poi accedere ai valori è sufficiente usare $stdClass->variabile, $stdClass->variabile->variabile2 eccetera.
    Una domanda. Perchè hai scelto di usare una chiamata SOAP in php e una elaborazione Java? Non conveniva usare solo Php, magari sfruttando newSoap?




  10. #10
    Utente di HTML.it
    Registrato dal
    Jul 2012
    Messaggi
    21
    Originariamente inviato da Dascos
    ah sì? Questa non la sapevo!
    Per quanto ne sono non esistono array associativi.
    L'alternativa sono le HashMap, ma sono comunque impossibili da utilizzare con soap.

    Per gestire tutto come stdClass basta fare il cast come stdClass... (stdClass) $variabile.
    Per poi accedere ai valori è sufficiente usare $stdClass->variabile, $stdClass->variabile->variabile2 eccetera.
    Il cast ad array lo fa, però poi non mi fa accedere ai campi, dicendo che gli indici non sono definiti.
    Ho provato con indici numerici, come un normale array.
    Invece il cast ad stdClass non me la fa proprio fare, mi da errore.
    Una domanda. Perchè hai scelto di usare una chiamata SOAP in php e una elaborazione Java? Non conveniva usare solo Php, magari sfruttando newSoap?
    Se intendi nuSoap, ti rispondo subito: mi è stato detto di farlo con soap.

    Io mi trovo abbastanza bene nell'utilizzare questa sintassi per accedere al contenuto
    Codice PHP:
    $result->return[$i]->array[$j
    forse perché negli altri modi ottengo soltanto degli errori.
    Ho notato però che in questo modo sorgono problemi se c'è soltanto una riga all'interno dell'oggetto.
    Se, invece, ci sono più righe, non c'è problema.
    Questo è un mistero e non riesco proprio a capirne le motivazioni.

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.