A parte do $codigo = 1 foi um teste que fiz (em vez de usar os teus dados, simplesmente usei dados 1/2/3, etc).
A variavel código deve ter simplesmente o código que queres procurar.
Para usares o meu código só tens que chamar a função com os teus dados
"$contagem = descer($conn, $codigo, $contador = 0, $comparador= 0);"
No entanto pelo que me apercebi, acho que estás a fazer confusão com a gestão e criação da tua tabela.
Para teres 2 níveis de referidos, deves ter 2 tabelas para o efeito.
Sabendo que o MyReferal é o código único de cada referido ( ou seja, quem se registar, fica associado por aquele código ), o patrocinador é o nível 1 (código de quem se registou pelo utilizador 1). Não podes ir contar pelos utilizadores todos infinitos níveis de referidos em duas tabelas. Tens que separar a informação. Pelo que me dizes a coluna MyReferal serve tanto para código único de referido como para nivel 2 de referido. Isso não pode ser, a não ser que faças a separação dos dados dentro da row (o que ainda é mais complicado)
Tens que ter tantas tabelas como níveis de referidos e aquando o registo, tens que validar quem é o referido de quem e adicionar à BD.
Por exemplo (vou utilizar dígitos para ser mais fácil):
- Utilizador 2 regista-se com o código 1 (Fica com código de referido [MyReferal] 1)
- O nivel 1 de referido [patrocinador] do utilizador 2 é 1 e o código de referido [MyReferal] é 2
- O utilizador 3 regista-se pelo utilizador 2. É referido nível 1 [patrocinador] do utilizador 2 com o valor 2 e fica com o código de referido [MyReferal] 3.
- Numa terceira coluna [patrocinador2], o utilizador 1 fica com o valor 3.
Uma imagem para ser mais simples:
É suposto cada coluna na BD ter um propósito.
Se tens 2 níveis de referidos, tens que ter 3 colunas (código do referido, nível 1 e nível 2)
Se tivesses 10 níveis de referidos ias ter que ter 11 colunas (código de referido, nível 1..10)
A minha função o que faz (que foi o que percebi) é contar o número de referidos que têm o código X.
Depois desses existentes, vai contar quantos é que têm referidos e soma tudo.
Se queres ter mesmo 2 niveis de referidos, até te aconselho o seguinte:
- Usa a coluna userid (que presumo ser a chave primária da tabela) como código de referido. Assim consegues garantir que é sempre único. As strings que estás a usar não é garantido que serão sempre únicas (sim, podes criar uma função para ele criar um código para gerar o código até não existir na BD, mas estás sujeitos que passe a demorar muito tempo).
- Depois usas a MyReferal como nível 1 e a patrocinador como nível 2
Na minha óptica é a melhor forma de o fazer.
No entanto se quiseres fazer à tua maneira é fácil (apesar de vir a dar problemas). Não é uma função recursiva porque tens duas queries diferentes.
Primeiro fazes como tens.
Depois tens que fazer nova query dentro do foreach a pesquisar o Myreferal que extraiste com aquele código.
Depois em cada um desses resultados, comparas se os dados do patrocinador desse referido são iguais ao valor e aumentas o contador.
A variavel código deve ter simplesmente o código que queres procurar.
Para usares o meu código só tens que chamar a função com os teus dados
"$contagem = descer($conn, $codigo, $contador = 0, $comparador= 0);"
No entanto pelo que me apercebi, acho que estás a fazer confusão com a gestão e criação da tua tabela.
Para teres 2 níveis de referidos, deves ter 2 tabelas para o efeito.
Sabendo que o MyReferal é o código único de cada referido ( ou seja, quem se registar, fica associado por aquele código ), o patrocinador é o nível 1 (código de quem se registou pelo utilizador 1). Não podes ir contar pelos utilizadores todos infinitos níveis de referidos em duas tabelas. Tens que separar a informação. Pelo que me dizes a coluna MyReferal serve tanto para código único de referido como para nivel 2 de referido. Isso não pode ser, a não ser que faças a separação dos dados dentro da row (o que ainda é mais complicado)
Tens que ter tantas tabelas como níveis de referidos e aquando o registo, tens que validar quem é o referido de quem e adicionar à BD.
Por exemplo (vou utilizar dígitos para ser mais fácil):
- Utilizador 2 regista-se com o código 1 (Fica com código de referido [MyReferal] 1)
- O nivel 1 de referido [patrocinador] do utilizador 2 é 1 e o código de referido [MyReferal] é 2
- O utilizador 3 regista-se pelo utilizador 2. É referido nível 1 [patrocinador] do utilizador 2 com o valor 2 e fica com o código de referido [MyReferal] 3.
- Numa terceira coluna [patrocinador2], o utilizador 1 fica com o valor 3.
Uma imagem para ser mais simples:
É suposto cada coluna na BD ter um propósito.
Se tens 2 níveis de referidos, tens que ter 3 colunas (código do referido, nível 1 e nível 2)
Se tivesses 10 níveis de referidos ias ter que ter 11 colunas (código de referido, nível 1..10)
A minha função o que faz (que foi o que percebi) é contar o número de referidos que têm o código X.
Depois desses existentes, vai contar quantos é que têm referidos e soma tudo.
Se queres ter mesmo 2 niveis de referidos, até te aconselho o seguinte:
- Usa a coluna userid (que presumo ser a chave primária da tabela) como código de referido. Assim consegues garantir que é sempre único. As strings que estás a usar não é garantido que serão sempre únicas (sim, podes criar uma função para ele criar um código para gerar o código até não existir na BD, mas estás sujeitos que passe a demorar muito tempo).
- Depois usas a MyReferal como nível 1 e a patrocinador como nível 2
Na minha óptica é a melhor forma de o fazer.
No entanto se quiseres fazer à tua maneira é fácil (apesar de vir a dar problemas). Não é uma função recursiva porque tens duas queries diferentes.
Primeiro fazes como tens.
Depois tens que fazer nova query dentro do foreach a pesquisar o Myreferal que extraiste com aquele código.
Depois em cada um desses resultados, comparas se os dados do patrocinador desse referido são iguais ao valor e aumentas o contador.