2012-03-24 6 views
2

Ich werde nicht Zeilen aus der Tabelle lesen Thema in einer Liste PHP Scripte zu setzenphp xmlrpc lesen

$url_obj='http://'.$host.':8069/xmlrpc/object'; 
$sock=new xmlrpc_client($url_obj); 
$msg=new xmlrpcmsg('execute'); 
$arrVal=array('user_id', 'name'); 
$msg->addParam(new xmlrpcval($db, "string")); 
$msg->addParam(new xmlrpcval(1, "string")); 
$msg->addParam(new xmlrpcval($pwd, "string")); 
$msg->addParam(new xmlrpcval("res.partner", "string")); 
$msg->addParam(new xmlrpcval("read", "string")); 
$msg->addParam(new xmlrpcval(3, "int")); 
//$msg->addParam(new xmlrpcval($arrVal, "struct")); 
print_r("message msg="); 
print_r($msg); 
$resp= $sock->send($msg); 
$val=$resp->value(); 
$read=$val->scalarval(); 
echo $read; 

ich den Fehler PHP Fatal error erhalten: Call auf eine Elementfunktion scalarval() auf einem Nicht-Objekt

message msg=xmlrpcmsg Object 
(
    [payload] => 
    [methodname] => execute 
    [params] => Array 
    (
     [0] => xmlrpcval Object 
      (
       [me] => Array 
        (
         [string] => database 
        ) 

       [mytype] => 1 
       [_php_class] => 
      ) 

     [1] => xmlrpcval Object 
      (
       [me] => Array 
        (
         [string] => 1 
        ) 

       [mytype] => 1 
       [_php_class] => 
      ) 

     [2] => xmlrpcval Object 
      (
       [me] => Array 
        (
         [string] => ****** 
        ) 

       [mytype] => 1 
       [_php_class] => 
      ) 

     [3] => xmlrpcval Object 
      (
       [me] => Array 
        (
         [string] => res.partner 
        ) 

       [mytype] => 1 
       [_php_class] => 
      ) 

     [4] => xmlrpcval Object 
      (
       [me] => Array 
        (
         [string] => read 
        ) 

       [mytype] => 1 
       [_php_class] => 
      ) 

     [5] => xmlrpcval Object 
      (
       [me] => Array 
        (
         [int] => 3 
        ) 

       [mytype] => 1 
       [_php_class] => 
      ) 

    ) 

    [debug] => 0 
    [content_type] => text/xml 
) 
PHP Fatal error: Call to a member function scalarval() on a non-object in t./est.php on line 27 

PHP Fatal error: Aufruf an eine Elementfunktion scalarval() auf einem nicht-Objekt in t./est.php auf Leitung 27!

können Sie mir helfen?

+2

Welche Antwort haben Sie an den Server? Versuchen Sie folgendes: 'print_r ($ val);' bevor Sie 'scalarval()' aufrufen. –

Antwort

2
<?php 

include_once("lib/xmlrpc.inc"); 

class OpenERPXmlrpc { 

    private $user, $password, $database, $services, $client, $res, $msg, $id; 

    function __construct($usr, $pass, $db, $server) { 

     $this->user = $usr; 
     $this->password = $pass; 
     $this->database = $db; 
     $this->services = $server; 

     $this->client = new xmlrpc_client($this->services.'common'); 

     $this->msg = new xmlrpcmsg('login'); 
     $this->msg->addParam(new xmlrpcval($this->database, "string")); 
     $this->msg->addParam(new xmlrpcval($this->user, "string")); 
     $this->msg->addParam(new xmlrpcval($this->password, "string")); 

     $this->res = &$this->client->send($this->msg); 

     if(!$this->res->faultCode()){ 

     $this->id = $this->res->value()->scalarval(); 

     } 
     else { 

     echo "Unable to login ".$this->res->faultString(); 
     exit; 
     } 
    } 

    function read($post = null) { 

     $this->client = new xmlrpc_client($this->services.'object'); 

     if(empty($post)) { 

     $ids_read = array(new xmlrpcval('1', 'int'), new xmlrpcval('2', 'int')); 

     $key = array(new xmlrpcval('id','integer') , new xmlrpcval('name', 'string')); 

     $this->msg = new xmlrpcmsg('execute'); 
     $this->msg->addParam(new xmlrpcval($this->database, "string")); 
     $this->msg->addParam(new xmlrpcval(1, "int")); 
     $this->msg->addParam(new xmlrpcval($this->password, "string")); 
     $this->msg->addParam(new xmlrpcval("res.partner","string")); 
     $this->msg->addParam(new xmlrpcval("read", "string")); 
     $this->msg->addParam(new xmlrpcval($ids_read, "array")); 
     $this->msg->addParam(new xmlrpcval($key, "array")); 

     $this->res = &$this->client->send($this->msg); 

     if(!$this->res->faultCode()) { 

      $read_html = '<table width="20%" border="0" cellpadding="4" cellspacing="4" align="center"> 
         <tr> 
          <th>Id</th> 
          <th>Name</th> 
         </tr> 
        '; 

      $scalval = $this->res->value()->scalarval(); 

      foreach ($scalval as $keys => $values) { 

       $value = $values->scalarval(); 

       $read_html .= ' 
        <tr> 
         <td>'.$value['id']->scalarval().'</td> 
         <td>'.$value['name']->scalarval().'</td> 
        </tr> 
        <tr><td colspan="2"></td></tr> 
         '; 
      } 

      $read_html .= ' 
        </table> 
        '; 

      return $read_html; 
     } 
     else { 
      return "Not read recode from partner table <br />".$this->res->faultString(); 
     } 
     } 
    } 

} 

$cnt = new OpenERPXmlrpc('admin', 'a', 'test_6_1', 'http://localhost:8069/xmlrpc/'); 

echo $cnt->read(); 

?> 

gelöst;)

+1

Würde es Ihnen etwas ausmachen, uns genau zu sagen, was sich geändert hat, damit wir nicht ein 'diff' ausführen müssen, um es herauszufinden? – SomeKittens

1

sieht aus wie Sie hier einige Probleme haben ... Wie für diese Linie:

$msg->addParam(new xmlrpcval(3, "int")); 

Sie müssen eine Liste von IDs zur Verfügung zu stellen, die Sie aus lesen möchten. In Ihrem Fall haben Sie ID = 3 kaufen Sie müssen noch alles als xml proc-Variable umschließen; so etwas wie:

$msg->addParam(new xmlrpcval(array(new xmlrpcval(3, "int")), "array")); 

Btw, müssen Sie nur noch über XML-RPC einzuloggen versucht, um sicherzustellen, dass die Verbindung in Ordnung ist?

Etwas wie:

$sock = new xmlrpc_client($server_url.'common'); 
$msg = new xmlrpcmsg('login'); 
$msg->addParam(new xmlrpcval($dbname, "string")); 
$msg->addParam(new xmlrpcval($user, "string")); 
$msg->addParam(new xmlrpcval($password, "string")); 
$resp = $sock->send($msg); 
$val = $resp->value(); 
$id = $val->scalarval(); 

Cheers,

Ivica

0

Vielleicht wird dies auch helfen.

Ich schrieb meine eigenen Funktionen, um einige Parameter hinzuzufügen. Verwenden Sie es wie folgt:

Voreinstellung: $this->m_objXmlRpc_Message ist bereits in einer Klasse initiiert. Setzen Sie die Funktionen in eine Klasse.

$this->addParam($p_sSessionID); //String 
$this->addParam($p_aUserParams, "struct"); //Ass. Array 

// dies in der Klasse Setzen oder die Funktionen neu schreiben ....

protected function addParam($p_xParam,$p_sType="string") 
{ 
    //check type, default is string 
    //if type is wrong, then it will be string 
    switch($p_sType) 
    { 
     case "string": 
     case "int": 
     case "boolean": 
     case "double": 
     case "dateTime.iso8601": 
     case "base64": 
      break; 
     case "array": 
     case "struct": 
      $p_xParam = $this->createArray($p_xParam); 
      break; 
     default: $p_sType = "string"; 
    } 
    $param = new xmlrpcval($p_xParam, $p_sType); 
    $this->m_objXmlRpc_Message->addParam($param); 
} 

protected function createArray($p_xParam) 
{ 
    foreach($p_xParam as $key => $value) 
    { 
     $p_xParam[$key] = new xmlrpcval($value); 
    } 
    return $p_xParam; 
}