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服务正常返回数据列表。
问题排查与解决方案
先拆解两个错误的本质:
- Array to string conversion:说明
database.php第105行的代码尝试把数组转成字符串,大概率是数据库连接对象出了问题(比如getDb()返回了数组而非有效连接句柄)。 - 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
相关产品推荐
相关产品推荐

