将对象存储到数据库然后再次检索它

时间:2015-09-27 19:28:41

标签: php oop object

请原谅长篇文章 - 我尽可能简洁,同时尽可能多地提供详细信息...而且我历来是一个程序化的PHP程序员,现在我的脚已经湿透了。

我正在开发一个测试项目,我正在使用第三方类(通过phar加载)从在线服务器捕获流。在线服务器发布事件,我使用第三方类捕获(使用“capture.php”)每个事件,序列化数据,然后将其作为BLOB字段存储到MySQL数据库。

//capture.php
// include phar file
require_once 'PAMI-1.72.phar';
// set include path to have pami's phar first
ini_set('include_path', implode(PATH_SEPARATOR, array('phar://pami.phar', ini_get('include_path'))));

use PAMI\Client\Impl\ClientImpl as PamiClient;
use PAMI\Message\Event\EventMessage;
use PAMI\Listener\IEventListener;
$pamiClient = new PamiClient($pamiClientOptions);

// Open the connection
$pamiClient->open();

$pamiClient->registerEventListener(function (EventMessage $event) {
// Following line dumps the event to a text file in rawCapture.php
//var_dump($event);
$mysqli = new mysqli($server, $user, $pass, $db);
if ($mysqli->connect_error) {
    echo "Failed to connect to MySQL: (" . $mysqli->connect_errno . ") " . $mysqli->connect_error;
exit;
}

$serializedData = $mysqli->real_escape_string(serialize($event));

$sql = 'insert into obj (data) values ("' . $serializedData . '")';
echo "\r\nSQL is $sql\r\n";    
});

在另一个脚本中(“read.php” - 我知道 - 我在脚本命名方面非常有创意)我确保我有包含文件到类定义文件,拿起数据库中的第一个条目,拉BLOB数据然后反序列化它。此时我正在测试read.php中的变量类型,变量是一个对象:

require_once 'PAMI-1.72.phar';
// set include path to have pami's phar first
ini_set('include_path', implode(PATH_SEPARATOR, array('phar://pami.phar', ini_get('include_path'))));

use PAMI\Client\Impl\ClientImpl as PamiClient;
use PAMI\Message\Event\EventMessage;
use PAMI\Listener\IEventListener;

/* All the MySQL stuff to get the $data from the db */

$event = unserialize($data);

echo "\r\nevent is " . gettype($event) . "\r\n";
print_r($event);

这是我得到的结果:

event is object
PAMI\Message\Event\NewchannelEvent Object
(
[rawContent:protected] => Event: Newchannel
Privilege: call,all
Channel: Local/s@tc-maint-00006a43;2
ChannelState: 4
ChannelStateDesc: Ring
CallerIDNum: 
CallerIDName: 
AccountCode: 
Exten: s
Context: tc-maint
Uniqueid: 1443368640.57856
[lines:protected] => Array
(
)

[variables:protected] => Array
(
)

[keys:protected] => Array
(
[event] => Newchannel
[privilege] => call,all
[channel] => Local/s@tc-maint-00006a43;2
[channelstate] => 4
[channelstatedesc] => Ring
[calleridnum] => 
[calleridname] => 
[accountcode] => 
[exten] => s
[context] => tc-maint
[uniqueid] => 1443368640.57856
)

[createdDate:protected] => 1443368636
)

好的 - 到目前为止一切顺利,恕我直言。这当然似乎是一个对象,所有数据肯定似乎已经正确存储(rawCapture.php是另一个脚本,它也会轮询数据并将相同的事件var_dump到文本文件中,这样我可以“比较”并确保正确记录所有内容。

但是,现在我想处理一些对象数据,这就是我遇到问题的地方。例如,我正在尝试获取Uniqueid的值,但使用$id = $event->Uniqueid;我收到以下错误PHP Notice: Undefined property: PAMI\Message\Event\NewchannelEvent::$Uniqueid in /home/dave/objRead.php on line 69

现在我被卡住了。我已经尝试使用get_object_vars()来检查$ event实际上是一个对象:

$objVars = get_object_vars($event);
if(is_null($objVars)){
echo "\r\nobjVars doesn't appear to be an object?!\r\n";
} else {
if(is_array($objVars)){
print_r($objVars);
} else {
echo "\r\nobjVars isn't an array!!\r\n";
}
}

我得到了自己的错误代码“objVars似乎不是一个对象?!”。

任何人都可以就我到底做错了什么给我一些建议吗?

另外 - 我试图在上面的代码部分保留缩进,但它不会让我发布而不删除它们。我还修改了我的OP,以显示我包含第三方代码以便加载类定义,以及我用来unserialize来自MySQL表的数据的行。

1 个答案:

答案 0 :(得分:0)

您是否尝试将Uniqueid$id = $event->Uniqueid;的案例更改为小写?
所以这将是$id = $event->uniqueid;