What I'm trying to achieve here is to save multiple items from JSON post data into database whenever there's a new registration.
I've successfully save a single registration. But if I have multiple registrations, it won't save all data passed. It will save only the first item.
Here's the JSON post data captured:
{"id" : "1514358676612-F9RM4",
"accountId" : 128768,
"eventId" : 206218,
"timestamp" : 1514358676612,
"url" : "http://hub.mymagic.my/bizzabo/bizzaboCallback",
"details" : {
"items" : [ {
"contactEmail" : "ikram#mymagic.my",
"created" : "2017-12-27T07:09:21.000+0000",
"ticketPaid" : 0,
"contactFirstName" : "Ikram",
"contactLastName" : "Khasim",
"currency" : "USD",
"validity" : "valid",
"status" : "completed",
"ticketType" : "test",
"ticketId" : 1296403,
"invoice" : false,
"contactName" : "Ikram Khasim",
"paymentStatus" : "completed",
"registrationForm" : {
"type_of_person" : "Experienced Entrepreneur",
"firstName" : "Ikram",
"organisation__instit" : "MaGIC",
"lastName" : "Khasim",
"gender" : "Male | Lelaki",
"age_group" : "22-24",
"mobileNumber" : "0193533005",
"email" : "ikram#mymagic.my",
"how_did_you_hear_abo" : "Word of mouth"
},
"type" : "ticket"
}, {
"contactEmail" : "yasmin#mymagic.my",
"created" : "2017-12-27T07:09:21.000+0000",
"ticketPaid" : 0,
"contactFirstName" : "Ikram",
"contactLastName" : "Khasim",
"currency" : "USD",
"validity" : "valid",
"status" : "completed",
"ticketType" : "test",
"ticketId" : 1296404,
"invoice" : false,
"contactName" : "Ikram Khasim",
"paymentStatus" : "completed",
"registrationForm" : {
"type_of_person" : "Experienced Entrepreneur",
"firstName" : "Ikram",
"organisation__instit" : "MaGIC",
"lastName" : "Khasim",
"gender" : "Male | Lelaki",
"age_group" : "22-24",
"mobileNumber" : "0193533005",
"email" : "yasmin#mymagic.my",
"how_did_you_hear_abo" : "Word of mouth"
},
"type" : "ticket"
} ],
"contactEmail" : "ikram#mymagic.my",
"contactFirstName" : "Ikram",
"contactLastName" : "Khasim",
"currency" : "USD",
"action" : "charge",
"status" : "completed",
"quantity" : 2,
"invoice" : false,
"contactName" : "Ikram Khasim",
"paymentStatus" : "completed",
"amount" : 0,
"orderId" : 651560
},
"type" : "orderCreated"
}
And this is the code to save the JSON post data items into database. It successfully stored the first item into the database, however didn't save the second item.
public function actionBizzaboCallback()
{
$junk = new Junk;
$junk->code = 'bizzabo-bizzaboCallback-'.time();
$junk->content .= serialize($_POST);
if ($_SERVER['REQUEST_METHOD'] == 'POST') {
// fetch RAW input
$json = file_get_contents('php://input');
// expecting valid json
if (json_last_error() !== JSON_ERROR_NONE) {
$junk = new Junk;
$junk->code = 'bizzabo-getJSONError-'.time();
$junk->content = sprintf('JSON not captured at : %s', Yii::app()->params['masterDomain']);
die(header('HTTP/1.0 415 Unsupported Media Type'));
} else {
// check if registration exist
// decode json
$objects = json_decode($json);
//create new registration
$object = new EventRegistration;
$object->event_code = $objects->eventId;
$tmps = HUB::getEventCode($object->event_code);
$object->event_id = $tmps->id;
$object->event_vendor_code = 'bizzabo';
$object->registration_code = $objects->details->items[0]->ticketId;
$object->full_name = sprintf('%s %s', $objects->details->items[0]->registrationForm->firstName, $objects->details->items[0]->registrationForm->lastName);
$object->first_name = $objects->details->items[0]->registrationForm->firstName;
$object->last_name = $objects->details->items[0]->registrationForm->lastName;
$object->email = $objects->details->items[0]->registrationForm->email;
$object->date_registered = time();
$object->date_payment = time();
$object->json_original = json_decode($json,true);
$object->date_added = time();
$object->date_modified = time();
if($object->save()){
$success = 'successfully insert data into db';
}else{
$fail = $object->errors;
$status = 'failed insert data into db';
}
//create junk
$junk = new Junk;
$junk->code = 'bizzabo-getBizzaboRegistrationIntoDB-'.time();
$junk->content = sprintf('Success(%s) or Fail(%s) with error message (%s). With first name is %s and last name is %s. JSON Captured: %s', $success, $status, $fail, $object->first_name, $object->last_name, $json);
}
}
$junk->save();
}
you should iterate over the items content for save the related values eg:
} else {
// check if registration exist
// decode json
$objects = json_decode($json);
foreach( $object->details->items as $key = $value){
//create new registration
$object = new EventRegistration;
$object->event_code = $objects->eventId;
$tmps = HUB::getEventCode($object->event_code);
$object->event_id = $tmps->id;
$object->event_vendor_code = 'bizzabo';
// apply the actual item value
$object->registration_code = $value->ticketId;
$object->full_name = sprintf('%s %s',
$value->registrationForm->firstName,
$value->registrationForm->lastName);
.......
......
}
Related
This question already has answers here:
How to loop through PHP object with dynamic keys [duplicate]
(16 answers)
Closed 5 years ago.
{
"took" : 363,
"timed_out" : false,
"num_reduce_phases" : 15,
"_shards" : {
"total" : 7195,
"successful" : 7195,
"failed" : 0
},
"hits" : {
"total" : 35672,
"max_score" : 0.0,
"hits" : [ ]
},
"aggregations" : {
"2" : {
"doc_count_error_upper_bound" : 54,
"sum_other_doc_count" : 1463,
"buckets" : [
{
"key" : "ふるさと納税",
"doc_count" : 30376
}
]
}
}
}
This is the json file . I need to access the doc_count field.
I am trying to do it like this
$trend_words = json_decode($file);
$aggregations = $trend_words->aggregations;
$buckets = $aggregations->{2}->buckets->{0};
But its not working.
Can someone help.
$trend_words = json_decode($file,true);
$aggregations = $trend_words['aggregations']['2']['buckets'][0]['doc_count'];
print_r($aggregations)
You should use ,true otherwise you will get an stdclass object and not an array you want.
try this
<?php
$sJson = '
{
"took" : 363,
"timed_out" : false,
"num_reduce_phases" : 15,
"_shards" : {
"total" : 7195,
"successful" : 7195,
"failed" : 0
},
"hits" : {
"total" : 35672,
"max_score" : 0.0,
"hits" : [ ]
},
"aggregations" : {
"2" : {
"doc_count_error_upper_bound" : 54,
"sum_other_doc_count" : 1463,
"buckets" : [
{
"key" : "ふるさと納税",
"doc_count" : 30376
}
]
}
}
}
';
$aJson = json_decode($sJson, true);
echo $aJson['aggregations'][2]['buckets'][0]['doc_count'];
https://3v4l.org/kHfdo
Here is the answer, As the buckets increases you need to have a loop through to read all the buckets
$trend_words = json_decode($file, true);
$aggregations = $trend_words['aggregations'][2];
$buckets = array();
foreach($aggregations as $element)
$buckets[] = $element['buckets'];
print_r($buckets);
Make Json to array and try
$trend_words = json_decode($file, true);
$aggregations = $trend_words['aggregations'];
$buckets =$aggregations[2]['buckets'][0];
I'm trying to use Google Maps API to calculate time and distance between two spots. My code is rather simple and it works (used codepad and it runs smoothly) but when I deploy the code and try to use the service the bot gives me wrong answers...
This is the code:
$details = "http://maps.googleapis.com/maps/api/distancematrix/json?origins=Miami&destinations=Miami+Beach&mode=driving&sensor=false";
$json = file_get_contents($details);
$arr = json_decode($json, TRUE);
$distance = $arr[rows][0][elements][0][distance][text];
$time = $arr[rows][0][elements][0][duration][text];
$response = "You should be there in $time. Total distance you'll cover: $distance";
$parameters = array('chat_id' => $chatId, "text" => $response);
$parameters["method"] = "sendMessage";
echo json_encode($parameters);
This is what the bot answers me:
"You should be there in {. Total distance you'll cover: {";
And this is the actual json:
{
"destination_addresses" : [ "Miami Beach, Florida, Stati Uniti" ],
"origin_addresses" : [ "Miami, Florida, Stati Uniti" ],
"rows" : [
{
"elements" : [
{
"distance" : {
"text" : "15,7 km",
"value" : 15745
},
"duration" : {
"text" : "22 min",
"value" : 1322
},
"status" : "OK"
}
]
}
],
"status" : "OK"
}
What's going on?!
UPDATE: file_get_contents returns a string. So I decoded it into a PHP array but now the bot doesn't even answer!
$details = "http://maps.googleapis.com/maps/api/distancematrix/json?origins=Miami&destinations=Miami+Beach&mode=driving&sensor=false";
$json = file_get_contents($details);
$JsonObject = json_decode($json);
$distance = $JsonObject->rows[0]->elements[0]->distance->text;
$time = $JsonObject->rows[0]->elements[0]->duration->text;
$response = "You should be there in $time. Total distance you'll cover: $distance";
$chatId = "your telegram id here";
$botToken = "your bot token here";
file_get_contents("https://api.telegram.org/bot$botToken/sendMessage?chat_id=$chatId&text=$response");
This one works with file_get_contents.
so I have some PHP code which is displaying an email list (Name, Surname & Email) from a list I have hosted via API.
The problem I have is that in order to display the name of the subscriber, I have to separately pass the email through the API... and the only way to get the email is to use a separate function.
So, for a list of 100 people, I'm basically hitting calling their API 300 times... so it is taking forever to echo the information (and over 30ish people the server just times out).
Is there a way I can edit the blow code so that I'm not pulling their info EVERY time, and instead bring it all down at once?
Here's my code:
<?php
require('Mailin.php');
/////////Total Subscriber Count $subscribers
$mailin = new Mailin('https://api.sendinblue.com/v2.0','UNIQUEKEY');
$datacount = array( "id"=>13 );
$subscribercount = $mailin->get_list($datacount);
$subscribers = $subscribercount['data']['total_subscribers'] - 1;
/////////Get Emails of Subscribers
$dataemail = array( "listids" => array(2),
"page" => 1,
"page_limit" => 500
);
$getemails = $mailin->display_list_users($dataemail);
/////////Get Name of Subscribers
foreach (range(0, $subscribers) as $number) {
$subscriberemail = $getemails['data']['data'][$number]['email'];
echo $subscriberemail;
echo '<br/>';
$dataname = array( "email" => $subscriberemail );
$getname = $mailin->get_user($dataname);
$subscribername = $getname['data']['attributes']['NAME'];
$subscribersurname = $getname['data']['attributes']['SURNAME'];
echo $subscribername;
echo '<br/>';
echo $subscribersurname;
echo '<br/>';
}
?>
Here is the output you get calling the display_list_users:
{
"code":"success",
"message":"Retrieved details of all users for the given lists",
"data":{
"data":[
{
"blacklisted":0,
"email":"email1#domain.com",
"id":1,
"listid":[1],
"blacklisted_sms":1,
"last_modified" : "2015-05-22 15:30:00"
},
{
"blacklisted":1,
"email":"email2#domain.com",
"id":2,
"listid":[1,2],
"blacklisted_sms":0 ,
"last_modified" : "2015-05-25 19:10:30"
}
],
"page":1,
"page_limit":2,
"total_list_records":100
}
}
And the output you get calling the get_user:
{
"code":"success",
"message":"Data retrieved for email",
"data":{
"attributes":{
"EMAIL":"example#example.net",
"NAME" : "Name",
"SURNAME" : "surname"
},
"blacklisted":1,
"email":"example#example.net",
"entered":"2014-01-15",
"listid":[8],
"message_sent":[{
"camp_id" : 2,
"event_time" : "2013-12-18"
},
{ "camp_id" : 8,
"event_time" : "2014-01-03"
},
{ "camp_id" : 11,
"event_time" : "2014-01-07"
}],
"hard_bounces":[{
"camp_id" : 11,
"event_time" : "2014-01-07"
}],
"soft_bounces":[],
"spam":[{
"camp_id" : 2,
"event_time" : "2014-01-09"
}],
"unsubscription":{
"user_unsubscribe":[
{
"event_time":"2014-02-06",
"camp_id":2,
"ip":"1.2.3.4"
},
{
"event_time":"2014-03-06",
"camp_id":8,
"ip":"1.2.3.4"
}
],
"admin_unsubscribe":[
{
"event_time":"2014-04-06",
"ip":"5.6.7.8"
},
{
"event_time":"2014-04-16",
"ip":"5.6.7.8"
}
]
},
"opened":[{
"camp_id" : 8,
"event_time" : "2014-01-03",
"ip" : "1.2.3.4"
}],
"clicks":[],
"transactional_attributes":[
{
"ORDER_DATE":"2015-07-01",
"ORDER_PRICE":100000,
"ORDER_ID":"1"
},
{
"ORDER_DATE":"2015-07-05",
"ORDER_PRICE":500000,
"ORDER_ID":"2"
}
],
"blacklisted_sms":1
}
}
Mongodb gives the following:
{
"_id" : ObjectId("55d1d8ea464498a8338b4567"),
"appuserfirstname" : "Bhatti",
"appuserlastname" : "Singh",
"appusermiddlename" : "Tripatpal",
"appuseremail" : "tripat.90#gmail.com",
"appusergoogleid" : [
{ "id" : "APA91bFPqNjK5bWdTe6bAniDV8ZlmG5vL3Q1qRz_WGAasOMu_WBbzoorWI2uCU7yC4IS-yggNGQvL7oUp5YhiejOC1TB4bFQspKj4AUZ05-IEL9DJiI2oNwIl5YwW5zyBVqrTMNWFF2B" }
],
"usercreationdate" : ISODate("2015-08-17T18:21:54Z"),
"status" : "0",
"userfollows" : [
{ "following" : ObjectId("55cd8dae46449867738b4567") }
]
}
I want the ids that are in following. but it always gives me empty string
<?php
$appuserid = '123456789';
$appuserscollection = $this->database->createCollection("appusers");
$followers = array('_id' => new MongoId($appuserid));
$s = "";
$result = $appuserscollection->find($followers);
foreach($result as $document) {
$s.=$document['userfollows'];
}
echo $s;
?>
With
$appuserscollection = $this->database->createCollection("appusers");
you create a new collection. And a new collection is always empty
you could try
$collection = new MongoCollection($this->database, 'appusers');
I'm doing a project using Yii Framework, MySQL and MongoDB. I need to get the data from a collection of the mongo database and insert the records in a mysql table. The document of mongodb has subdocuments and I need to insert a row in mysql for every subdocument in the collection. The code of my project is:
$query = array('year'=>'2014');
$records = Yii::app()->edmsMongoCollection('DocumentosDesgloseER')->find($query);
foreach($records as $data){
$success = false;
$model = new DesgloseAcumulado;
$atributos['Id_Enterprise'] = $data['id_enterprise'];
$atributos['Id_Store'] = $data['id_store'];
$atributos['Month'] = $data['month'];
$atributos['Year'] = $data['year'];
$atributos['Id_Usuario'] = Yii::app()->user->id;
$atributos['Id_RubroER'] = $data['DocumentosDesgloseER'][0]['id_rubroer'];
$i = $i + 1;
$model->attributes = $atributos;
if($model->save()) {
$success = true;
}
}
And the structure of my collection in mongodb is:
{
"_id" : ObjectId("535fe63acac5853943166f5c"),
"DocumentosDesgloseER" : [
{
"elemento" : "VENTAS NETAS",
"id_rubroer" : "45",
"id_documento_consolidados_temp" : "31809",
"abreviatura" : "VN",
"orden" : "1",
"formula" : "(250*CM)",
"tipo_fila" : "1",
"resultado_actual" : "113.628",
"resultado_ant" : "239.851",
"promedio_mensual_actual" : "111.365",
"ppto_mes_actual" : "131.540",
"real_acumulado_actual" : "556.826",
"real_acumulado_ant" : "965.824",
"ppto_acumulado_actual" : "666.805"
},
{
"elemento" : "RUBRO DE PRUEBAS",
"id_rubroer" : "19",
"id_documento_consolidados_temp" : "31810",
"abreviatura" : "RP",
"orden" : "3",
"formula" : "CM/500",
"tipo_fila" : "1",
"resultado_actual" : "71.057",
"resultado_ant" : "281.697",
"promedio_mensual_actual" : "67.090",
"ppto_mes_actual" : "72.347",
"real_acumulado_actual" : "335.448",
"real_acumulado_ant" : "879.719",
"ppto_acumulado_actual" : "366.743"
}
],
"documentoID" : "4DOTA2",
"id_enterprise" : "1",
"id_store" : "24",
"month" : "Importes2",
"year" : "2014",
"lastMonthNumber" : NumberLong(4)
}
This is only one of the documents in the collection. As I said earlier, I need to save a row for every subdocument for each document in the mysql database. My code save only the data of the document and the id_rubroer of the subdocument "0".
Does anyone know how I can make the For Loop for each subdocument rather than for each object (document)?
Thanks
Just for-loop the "sub-documents"... say:
foreach($records['DocumentosDesgloseER'] as $data){
$success = false;
$model = new DesgloseAcumulado;
$atributos['Id_Enterprise'] = $data['id_enterprise'];
$atributos['Id_Store'] = $data['id_store'];
$atributos['Month'] = $data['month'];
$atributos['Year'] = $data['year'];
$atributos['Id_Usuario'] = Yii::app()->user->id;
$atributos['Id_RubroER'] = $data['id_rubroer'];
$i = $i + 1;
$model->attributes = $atributos;
if($model->save()) {
$success = true;
}
}