Нужна помощь!!) Необходимо сделать реферальную систему 5 уровней, есть табличка с колонками uid, р1, р2, р3... в куке висит id реферала ( для нового пользователя он будет р1) как сделать запрос к базе данных чтобы при регистрации нового пользователя он выбрал по условию $cookie['uid'] = uid и записал его в поля р1 => $cookie['uid'], p2 => p1(реферала), р3 => р2(реферала) и т.д... уже перепробовал много способов написать такой - ни одного успешного((( вот один из них:
$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();
}
Комментарии
А чем проблема. У вас запрос не работает или вам нужна помощь по архитектуре решения вашей задачи?
Я сначала в голове формирую стандартный sql
запрос не работает - не откажусь от подсказки почему и как правильно)
стандартный запрос был сначала - сейчас потерялся где-то, не получается правильно совместить два запроса между собой...
Давайте разберем то, что вы делаете.
$query
->condition('uid', $cookie['uid'], '=')
->fields('r', array('referral_uid', 'r2_uid', 'r3_uid', 'r4_uid'));
Вы выбираете значения.
И тут же переопределяется $query
->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. Мы сделаем запрос. И выберем данные.
$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
$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();
}
}
Просто я не могу понять, ччего вы пытаетесь добиться, переписав данные одной таблицы в другую при определенных условиях. Если это необходимо, то это не так делается ) Да и смысл. У вас когда будет много записей и без индексов, будет очень тупить из-за подобных действий.
Да и что мешает в итоге брать данные из первой таблицы?
Если же очень надо сделать одним запросом, не давая ответы на мои глупые вопросы )), то db_query - посмотрите примеры, думаю, это то, что надо. Но db_select скрестить с db_insert - я такое лично еще не встречал ))
Пробуйте, и да прибудет с вами терпение.
Спасибо большое))
в общем это реферальная система - когда человек переходит по ссылке в куке записывается id его "наставника", а во время регистрации нового надо взять наставников наставника и записать его к новому пользователю, вот я как раз понял что просто-напросто данные первой функции стирались... щас проверю ваш код))
Пришлось немного внести изменения: сначала переделал на свой лад - заработало, потом поломал - не смог восстановить:) решил вставить ваш чистый код - он тоже не заработал, в итоге опять переделал и вуаля - рабочий код, делюсь если кому понадобится:
<?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
$query = db_select('referral', 'r');
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->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(0, REFERRAL_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...
т.е. как я понимаю надо сделать второй запрос к б.д. с условием
<?php
$query->innerJoin('users', 'u', 'u.uid = r.r2_uid');
?>
но как отобразить в одной таблице значения из двух разных запросов? добавить результаты второго запроса в массив первого?
В практике рождается совершенство
только делайте isset вот тут
<?php
...
$result = $query->execute();
if(isset($result) && $result){
foreach($result as $k => $v){
//
}
}
?>
иначе полезут нотисы
1. как бы не пытался - не могу толково
дайте хоть направление куда копать?))
2. проверил код и он действительно не будет работать так как у нового пользователя не будет $result, но вставив
<?php
if(isset($result) && $result){
?>
проблема не решилась - так как нужен else, но и с ним что-то не работает... в общем весь код функции выглядит вот так - кто скажет в чем проблема?))
<?php
// Retrieve referral info from the cookie
// Invoke other modules hooks ...
function _referral_user_save($uid) {
if (!isset($_COOKIE[REFERRAL_COOKIE])) {
return;
}
$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;
}
module_invoke_all('referral', $uid, $cookie['uid']);
if (
module_exists('rules')) {rules_invoke_event('referral_recorded', user_load($cookie['uid']), user_load($uid));
}
}
?>