2012-03-24 2 views
2

Я не буду читать строки из таблицы поставить тему в PHP Scripte список PHP XMLRPC чтения

$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; 

я получаю фатальную ошибку ошибка PHP: вызов функции члена scalarval() на не-объект

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 Фатальная ошибка: Вызов функции члена scalarval() на не-объект в t./est.php на линии 27!

Вы можете мне помочь?

+2

Какой ответ вы получите от сервера? Попробуйте это: 'print_r ($ val);' перед вызовом 'scalarval()'. –

ответ

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(); 

?> 

решена;)

+1

Не могли бы вы сказать нам, что изменилось, поэтому нам не нужно запускать 'diff', чтобы узнать? – SomeKittens

1

выглядит как у вас есть несколько вопросов здесь ... Что касается этой линии:

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

вам необходимо предоставить список идентификаторов, которые вы хотите читать. В вашем случае у вас есть ID = 3, вам все равно нужно обернуть все это как переменную proc xml; что-то вроде:

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

КСТАТИ, вы пытались войти в систему с помощью XML-RPC, просто чтобы убедиться, что соединение в порядке?

Что-то вроде:

$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,

Ивица

0

Может быть, это поможет тоже.

Я написал свои собственные функции, чтобы добавить некоторые параметры. Используйте его следующим образом:

Предварительное определение: $this->m_objXmlRpc_Message уже начато в классе. Поместите функции в класс.

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

// Поместите это в классе или переписать функции ....

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; 
} 
Смежные вопросы