Я использую memcached для хранения некоторых данных из сообщений на боте, а затем позже сохраняю их в таблицу rethindkb.
У меня есть код, который я написал для хранения ниже, также есть функция для извлечения данных.
На первом первом шаге (случай 0) метода подготовки данных я создаю такой массив, как этот
`[id = 123]`
и сохранить его в memcached
На втором шаге (случай 1) метода я извлекаю сохраненные данные и затем добавляю к данным еще один элемент, это выглядит так
[id = 123, lang = english]
В функции getPrepData я извлекаю эти данные, чтобы извлечь значение ключа из хранимого сохраненного массива. Однако, когда я извлекаю данные и сохраняю их в журнале, ключ lang не устанавливается и выглядит так
[id = 123]
В целях отладки, после сохранения ключа lang, я получил данные из memcached, зарегистрировал их и получил желаемый результат.
Использование php 7 и codeigniter 3.
Кто-нибудь знает, почему это происходит и как я могу это исправить?
<?php
class User extends CI_Model {
private $data;
private $prep_data;
public function __construct(){
}
public function is_registered($id){
require_once('application/third_party/rdb/rdb.php');
$this->load->config('redb.php');
$db = $this->config->item('redbdb');
$con = r\connect(array('host' => 'localhost','db' => $db));
$results = r\table('users')->filter(['tid' => $id])->count()->run($con);
if($results == 0){
return false;
}
return true;
}
public function register_prep($id,$step,$store=null){
$this->load->driver('cache');
switch($step){
case(0):
//Insert empty cache entry
$x = $this->cache->memcached->get('prep_'.$id);
if($x){
$this->cache->memcached->delete('prep_'.$id);
}
$prep = ['tid' => $id];
$this->cache->memcached->save('prep_'.$id,$prep,0);
break;
case(1):
//insert language
$prep = $this->cache->memcached->get('prep_'.$id);
$prep['lang'] = $store;
$this->cache->memcached->delete('prep_'.$id);
$this->cache->memcached->save('prep_'.$id,$prep,0);
$x = $this->cache->memcached->get('prep_'.$id);
log_message('error','saved data on step 1 is : '.print_r($x,true));
break;
case(2):
//Insert driver/passenger
$prep = $this->cache->memcached->get('prep_'.$id);
$prep['type'] = $store;
$this->cache->memcached->save('prep_'.$id,$prep,0);
break;
case(3):
//Insert contact
$prep = $this->cache->memcached->get('prep_'.$id);
$prep['contact'] = $store;
$this->cache->memcached->save('prep_'.$id,$prep,0);
break;
case(4):
//Finish
$prep = $this->cache->memcached->get('prep_'.$id);
//Insert to database
require_once('application/third_party/rdb/rdb.php');
$this->load->config('redb.php');
$db = $this->config->item('redbdb');
$con = r\connect(array('host' => 'localhost','db' => $db));
r\table('users')->insert($prep)->run($con);
//Delete from cache
$this->cache->memcached->delete('prep_'.$id);
break;
}
}
public function getPrepdata($id,$var){
$this->load->driver('cache');
$x = $this->cache->memcached->get('prep_'.$id);
log_message('error','fetched prep data is : '.print_r($x,true));
return $x[$var];
}
}
Вы можете попробовать этот пример:
$data = array(id => 123);
if(empty($data)){
$data = array(); // Declaring array
}
print_r($data);
результат:
массив (
id => 123
)
Теперь добавьте это:
$new_data = array(lang => english);
array_push($data,$new_data); // Items will be add to array
print_r($data);
массив (
id => 123,
lang => английский
)
Вы хотите получить только идентификационный номер:
echo $data['id'];
Других решений пока нет …