Проблема с запросом к базе данных... нужна помощь!)

Главные вкладки

Аватар пользователя aka drupaller aka drupaller 13 марта 2015 в 14:10

Нужна помощь!!) Необходимо сделать реферальную систему 5 уровней, есть табличка с колонками uid, р1, р2, р3... в куке висит id реферала ( для нового пользователя он будет р1) как сделать запрос к базе данных чтобы при регистрации нового пользователя он выбрал по условию $cookie['uid'] = uid и записал его в поля р1 => $cookie['uid'], p2 => p1(реферала), р3 => р2(реферала) и т.д... уже перепробовал много способов написать такой - ни одного успешного((( вот один из них:

$query = db_select('referral', 'r');
$query
->condition('uid', $cookie['uid'], '=')
->fields('r', array('referral_uid', 'r2_uid', 'r3_uid', 'r4_uid'));
$query = db_insert('referral')
->fields(array(
'uid' => $uid,
'referral_uid' => $cookie['uid'],
'r2_uid' => 'r.referral_uid',
'r3_uid' => 'r.r2_uid',
'r4_uid' => 'r.r3_uid',
'r5_uid' => 'r.r4_uid',
'created' => $cookie['timestamp'],
'host' => $cookie['ip'],
'http_referer' => $cookie['referer'],
))
->execute();
}

Комментарии

Аватар пользователя t1mm1 t1mm1 14 марта 2015 в 13:15

А чем проблема. У вас запрос не работает или вам нужна помощь по архитектуре решения вашей задачи?

Аватар пользователя aka drupaller aka drupaller 15 марта 2015 в 23:04

запрос не работает - не откажусь от подсказки почему и как правильно)
стандартный запрос был сначала - сейчас потерялся где-то, не получается правильно совместить два запроса между собой...

Аватар пользователя t1mm1 t1mm1 15 марта 2015 в 23:09

Давайте разберем то, что вы делаете.

$query = db_select('referral', 'r');
$query
->condition('uid', $cookie['uid'], '=')
->fields('r', array('referral_uid', 'r2_uid', 'r3_uid', 'r4_uid'));

Вы выбираете значения.
И тут же переопределяется $query

$query = db_insert('referral')
->fields(array(
'uid' => $uid,
'referral_uid' => $cookie['uid'],
'r2_uid' => 'r.referral_uid',
'r3_uid' => 'r.r2_uid',
'r4_uid' => 'r.r3_uid',
'r5_uid' => 'r.r4_uid',
'created' => $cookie['timestamp'],
'host' => $cookie['ip'],
'http_referer' => $cookie['referer'],
))
->execute();
}

И пытаетесь через r.* записать значения. А записывает NULL. Точнее запрос отработает. Но ничего не запишет.

Давайте попробуем это исправить.

1. Мы сделаем запрос. И выберем данные.

$arg_uid = check_plain($cookie['uid']);

$query = db_select('referral', 'r');
$query
->condition('uid', $arg_uid , '=')
->fields('r', array('referral_uid', 'r2_uid', 'r3_uid', 'r4_uid'));
$result = $query->execute
->fetchAll();

Теперь мы возьмем ответ, если он есть, и запишем его через insert

if($result){
    $arg_timestamp = check_plain($cookie['timestamp']);
    $arg_ip = check_plain($cookie['ip']);
    $argreferer = check_plain($cookie['referer']);
    $arg_uid = check_plain($cookie['uid']);
    foreach($result as $k => $v){
      $query = db_insert('referral')
        ->fields(
          array(
            'uid' => $uid,
            'referral_uid' => $arg_uid,
            'r2_uid' => $v->referral_uid,
            'r3_uid' => $v->r2_uid,
            'r4_uid' => $v->r3_uid,
            'r5_uid' => $v->r4_uid,
            'created' => $arg_timestamp,
            'host' => $arg_ip,
            'http_referer' => $argreferer,
          )
        )
        ->execute();
  }
}

Просто я не могу понять, ччего вы пытаетесь добиться, переписав данные одной таблицы в другую при определенных условиях. Если это необходимо, то это не так делается ) Да и смысл. У вас когда будет много записей и без индексов, будет очень тупить из-за подобных действий.
Да и что мешает в итоге брать данные из первой таблицы?

Аватар пользователя t1mm1 t1mm1 15 марта 2015 в 23:12

Если же очень надо сделать одним запросом, не давая ответы на мои глупые вопросы )), то db_query - посмотрите примеры, думаю, это то, что надо. Но db_select скрестить с db_insert - я такое лично еще не встречал ))

Пробуйте, и да прибудет с вами терпение.

Аватар пользователя aka drupaller aka drupaller 16 марта 2015 в 0:07

Спасибо большое))
в общем это реферальная система - когда человек переходит по ссылке в куке записывается id его "наставника", а во время регистрации нового надо взять наставников наставника и записать его к новому пользователю, вот я как раз понял что просто-напросто данные первой функции стирались... щас проверю ваш код))

Аватар пользователя aka drupaller aka drupaller 17 марта 2015 в 12:04

Пришлось немного внести изменения: сначала переделал на свой лад - заработало, потом поломал - не смог восстановить:) решил вставить ваш чистый код - он тоже не заработал, в итоге опять переделал и вуаля - рабочий код, делюсь если кому понадобится:

<?php
    $query 
db_select('referral''r');
    
$query
        
->condition('uid'$cookie['uid'], '=')
        ->
fields('r', array('referral_uid''r2_uid''r3_uid''r4_uid'));
    
$result $query->execute();
    foreach(
$result as $k => $v){
    
$query db_insert('referral')
        ->
fields(array(
          
'uid' => $uid,
          
'referral_uid' => $cookie['uid'],
            
'r2_uid' => $v->referral_uid,
            
'r3_uid' => $v->r2_uid,
            
'r4_uid' => $v->r3_uid,
            
'r5_uid' => $v->r4_uid,
          
'created' => $cookie['timestamp'],
          
'host' => $cookie['ip'],
          
'http_referer' => $cookie['referer'],
    ))
    ->
execute();
  } 
?>

но тут же и второй вопрос: по поводу вывода данных... вот стандартная функция вывода данных

<?php
function referral_admin_view_summary() {
  
$header = array(
    array(
'data' => t('Referring User'), 'field' => 'r.referral_uid'),
    array(
'data' => t('# Referred'),     'field' => 'num_referrals''sort' => 'desc'),
    array(
'data' => t('Last Referral'),  'field' => 'r.created'),
    array(
'data' => t('Details')),
    );

  

$query db_select('referral''r');
  
$query->addExpression('COUNT(*)''num_referrals');
  
$query->addExpression('MAX(r.created)''last');
  
$query->innerJoin('users''u''u.uid = r.referral_uid');
  
$query->innerJoin('users''u2''u2.uid = r.uid');
  
$result $query
    
->fields('u', array('name'))
    ->
fields('r', array('referral_uid'))
    ->
condition('u2.status'1)
    ->
groupBy('r.referral_uid')
    ->
extend('PagerDefault')
    ->
range(0REFERRAL_PAGE_COUNT)
    ->
extend('TableSort')
    ->
orderByHeader($header)
    ->
execute();
    
  
$rows = array();    

  foreach (

$result as $data) {
    
$rows[] = array(
      array(
'data' => l($data->name"user/$data->referral_uid")),
      array(
'data' => $data->num_referrals),
      array(
'data' => format_date($data->last'custom'REFERRAL_DATE_FORMAT)),
      array(
'data' => l(t('details'), "admin/reports/referral/details/$data->referral_uid")),
    );
  }
  if (!
$rows) {
    
$rows[] = array(array('data' => t('No data.'), 'colspan' => '4'));
  }
  
$pager theme('pager', array('tags' => array()));
  if (!empty(
$pager)) {
    
$rows[] = array(array('data' => $pager'colspan' => '4'));
  }

  return 

theme('table', array('header' => $header'rows' => $rows));
}

?>

и вот вопрос как правильно добавить функцию подсчета r2_uid...

Аватар пользователя aka drupaller aka drupaller 17 марта 2015 в 12:41

т.е. как я понимаю надо сделать второй запрос к б.д. с условием

<?php
$query
->innerJoin('users''u''u.uid = r.r2_uid');
?>

но как отобразить в одной таблице значения из двух разных запросов? добавить результаты второго запроса в массив первого?

Аватар пользователя t1mm1 t1mm1 17 марта 2015 в 18:40

только делайте isset вот тут

<?php
...
$result $query->execute();
if(isset(
$result) && $result){
    foreach(
$result as $k => $v){ 
      
//
    
}
  }
?>

иначе полезут нотисы

Аватар пользователя aka drupaller aka drupaller 19 марта 2015 в 7:56

1. как бы не пытался - не могу толково

"akafaust" wrote:
но как отобразить в одной таблице значения из двух разных запросов? добавить результаты второго запроса в массив первого?

дайте хоть направление куда копать?))

2. проверил код и он действительно не будет работать так как у нового пользователя не будет $result, но вставив

<?php
if(isset($result) && $result){
?>

проблема не решилась - так как нужен else, но и с ним что-то не работает... в общем весь код функции выглядит вот так - кто скажет в чем проблема?))

<?php
function _referral_user_save($uid) {
  if (!isset(
$_COOKIE[REFERRAL_COOKIE])) {
    return;
  }

  

// Retrieve referral info from the cookie
  
$cookie unserialize($_COOKIE[REFERRAL_COOKIE]);

  if (empty(

$cookie)) {
    
// Nothing to do ...
    
return;
  }
  
  try {
    
$query db_select('referral''r');
    
$query
        
->condition('uid'$cookie['uid'], '=')
        ->
fields('r', array('referral_uid''r2_uid''r3_uid''r4_uid'));
    
$result $query->execute();
    if(isset(
$result) && $result){
    foreach(
$result as $k => $v){
    
$query db_insert('referral')
        ->
fields(array(
          
'uid' => $uid,
          
'referral_uid' => $cookie['uid'],
            
'r2_uid' => $v->referral_uid,
            
'r3_uid' => $v->r2_uid,
            
'r4_uid' => $v->r3_uid,
            
'r5_uid' => $v->r4_uid,
          
'created' => $cookie['timestamp'],
          
'host' => $cookie['ip'],
          
'http_referer' => $cookie['referer'],
    ))
    ->
execute();
  } }
        else {
            
$query db_insert('referral')
        ->
fields(array(
          
'uid' => $uid,
          
'referral_uid' => $cookie['uid'],
            
'r2_uid' => 0,
            
'r3_uid' => 0,
            
'r4_uid' => 0,
            
'r5_uid' => 0,
          
'created' => $cookie['timestamp'],
          
'host' => $cookie['ip'],
          
'http_referer' => $cookie['referer'],
    ))
    ->
execute();    
        } }
  catch (
Exception $e) {
    
watchdog_exception('referral'$e);
    return;
  }
  

  

// Invoke other modules hooks ...
  
module_invoke_all('referral'$uid$cookie['uid']);

  if (

module_exists('rules')) {
    
rules_invoke_event('referral_recorded'user_load($cookie['uid']), user_load($uid));
  }
}
?>