PHP xmlrpc читать - PullRequest
       14

PHP xmlrpc читать

2 голосов
/ 24 марта 2012

Я хочу читать строки из таблицы, чтобы поместить тему в список PHP скрипт

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

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

Ответы [ 3 ]

2 голосов
/ 18 апреля 2012
<?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 голос
/ 16 апреля 2012

похоже, что у вас есть несколько проблем здесь ... Что касается этой строки:

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

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

$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 голосов
/ 25 июля 2012

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

Я написал свои собственные функции для добавления некоторых параметров. Используйте это так:

Предопределение: $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;
}
...