You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

NuSoap调用数据库遇数组转字符串及mysqli结果错误求助

NuSoap Web服务调用getHistoriqueNotification时出现数组转字符串与mysqli_result错误,单独测试正常

我在尝试用NuSoap搭建的Web服务从数据库拉取通知历史列表时碰到了麻烦:单独测试getHistoriqueNotification函数能拿到正确的数组结果,但通过Web服务调用这个函数时,直接抛出两个错误:

Notice: Array to string conversion in C:\wamp64\www\gcm\database.php on line 105
PHP Warning: mysqli_fetch_assoc() expects parameter 1 to be mysqli_result, boolean given in C:\wamp64\www\gcm\database.php on line 112

单独调用函数的正常返回结果如下:

Array ( [0] => Array ( [titre] => list des docs [dateHeure] => 2018-04-16 [detail] => hello ) )

相关代码片段

getHistoriqueNotification函数代码

function getHistoriqueNotification(){ 
    $com = new DbConnect(); 
    $message=array(); 
    $sql = "select alr_alertes.TITRE,alr_alertes.PHOTO,alr_historiques.DETAIL,alr_historiques.DATEHEURE,alr_alertes.CODE from alr_alertes,alr_historiques WHERE alr_alertes.ALRT_UID=alr_historiques.ALRT_UID" ; 
    $result = mysqli_query($com->getDb(),$sql); 
    while($row=mysqli_fetch_assoc($result)){ 
        $message[] = array( 
            'titre' =>$row['TITRE'], 
            'dateHeure' =>$row['DATEHEURE'], 
            'detail' =>$row['DETAIL'], 
            'code' =>$row['CODE'] 
        ); 
    } 
    return ($message); 
}

NuSoap Web服务实现代码

<?php 
// Pull in the NuSOAP code 
require_once('lib/nusoap.php'); 
require_once 'config.php'; 
require_once 'database.php'; 

// Create the server instance 
$server = new soap_server(); 
$server->configureWSDL('Myservice_wsdl', 'urn:Myservice_wsdl'); 
$server->soap_defencoding = 'UTF-8'; 

$server->wsdl->addComplexType('Notifications', 'complexType', 'struct', 'all', '', array( 
    'titre' => array('name' => 'titre', 'type' => 'xsd:string'), 
    'dateHeure' => array('name' => 'dateHeure', 'type' => 'xsd:date'), 
    'detail' => array('name' => 'detail', 'type' => 'xsd:string'), 
    'code' => array('name' => 'code' , 'type' => 'xsd:string') 
) ); 

$server->wsdl->addComplexType('notificationArray', 'complexType', 'array', '', 'SOAP-ENC:Array', array(), array( 
    array('ref'=>'SOAP-ENC:arrayType','wsdl:arrayType'=>'tns:Notifications[]') 
), 'tns:Notifications' ); 

$server->register('getHistoriqueNotification', 
    array(), 
    array('result'=>'tns:notificationArray'), 
    'urn:MyService_wsdl', 
    'urn:MyService_wsdl#getHistoriqueNotification', 
    'rpc', 
    'encoded', 
    'Some comments about function 1' 
); 

$server->service(file_get_contents("php://input")); 
?>

我希望能解决这些错误,让Web服务正常返回数据列表。


问题排查与解决方案

先拆解两个错误的本质:

  1. Array to string conversion:说明database.php第105行的代码尝试把数组转成字符串,大概率是数据库连接对象出了问题(比如getDb()返回了数组而非有效连接句柄)。
  2. mysqli_fetch_assoc()参数错误:说明mysqli_query返回了false,也就是SQL查询执行失败,根源可能是连接失效、SQL语法错误或权限问题。

步骤1:添加错误检测定位具体问题

先给getHistoriqueNotification函数加上连接和SQL错误检查,直接拿到具体报错信息:

function getHistoriqueNotification(){ 
    $com = new DbConnect(); 
    $db = $com->getDb();
    // 检查数据库连接是否有效
    if (!$db || !is_object($db)) {
        die('数据库连接异常: 返回值不是有效连接对象');
    }
    if ($db->connect_error) {
        die('连接失败: ' . $db->connect_error);
    }
    
    $message=array(); 
    $sql = "select alr_alertes.TITRE,alr_alertes.PHOTO,alr_historiques.DETAIL,alr_historiques.DATEHEURE,alr_alertes.CODE from alr_alertes,alr_historiques WHERE alr_alertes.ALRT_UID=alr_historiques.ALRT_UID" ; 
    $result = mysqli_query($db,$sql); 
    // 检查SQL执行是否成功
    if (!$result) {
        die('SQL查询失败: ' . mysqli_error($db));
    }
    
    while($row=mysqli_fetch_assoc($result)){ 
        $message[] = array( 
            'titre' =>$row['TITRE'], 
            'dateHeure' =>$row['DATEHEURE'], 
            'detail' =>$row['DETAIL'], 
            'code' =>$row['CODE'] 
        ); 
    } 
    return ($message); 
}

步骤2:确保DbConnect返回有效连接对象

单独测试正常但Web服务调用异常,很可能是DbConnect类的getDb()方法在Web服务上下文下返回了错误值。比如它可能返回了配置数组而非实际连接句柄,正确的实现应该类似:

class DbConnect {
    private $host = 'localhost';
    private $dbname = '你的数据库名';
    private $user = '数据库用户名';
    private $pass = '数据库密码';
    
    public function getDb() {
        $conn = new mysqli($this->host, $this->user, $this->pass, $this->dbname);
        if ($conn->connect_error) {
            die("连接失败: " . $conn->connect_error);
        }
        return $conn;
    }
}

检查你的DbConnect实现,确保getDb()返回的是mysqli实例,而非数组或其他类型。

步骤3:调整NuSoap的服务注册参数

NuSoap的rpc/encoded风格有时会有序列化兼容性问题,尝试改成document/literal风格:

$server->register('getHistoriqueNotification', 
    array(), 
    array('result'=>'tns:notificationArray'), 
    'urn:MyService_wsdl', 
    'urn:MyService_wsdl#getHistoriqueNotification', 
    'document', // 替换rpc为document
    'literal',  // 替换encoded为literal
    '返回通知历史列表' 
);

另外,检查WSDL中dateHeure的类型:如果数据库中DATEHEURE是datetime类型(比如2018-04-16 14:30:00),要把WSDL里的xsd:date改成xsd:dateTime,避免类型转换错误。

步骤4:验证数组结构匹配WSDL定义

确保函数返回的数组结构和WSDL中notificationArray的定义完全一致。比如你单独测试的结果里没有code字段,但函数代码里返回了这个字段,要确认WSDL和返回数据的字段一一对应。


内容的提问来源于stack exchange,提问作者denzo kx

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.29 08:52:19