Várias dúvidas para um site em PHP

luisjs

Membro
Ora é assim. Vou re-lançar um site este mês, que se chama NGW Community e pertence à já existente NGW (também em construção). O conceito do site é: os visitantes registam-se, editam o seu perfil, tal e coiso, têm acesso a zonas exclusivas da NGW e etc. Basicamente o Community é um site tipo hi5 onde criam perfis, conhecem pessoas, entre outros.

Já tenho a base do site feita, isto é, zona para fazer login e para registar, para verem os seus perfis, editarem-nos, ver quem está online e quem está registado, e acho que é só. Foi feito com base neste código: http://www.evolt.org/PHP-Login-System-with-Admin-Features (sim está creditado lá no site xD)
Faltam-me algumas funções como por exemplo Sistema de Amigos, Sistema de Comentários, etc. Mas isso vou tentar fazer eu, quando já tiver mais alguma experiência em PHP.

Agora surgem as minhas dúvidas:
1º - será que consigo implementar uma barra de procura, que me faça um search por todos os utilizadores registados e devolva a lista com os resultados mais parecidos ? Era para implementar em conjunto com a página de "ver quem está registado", pois é bastante mais fácil estar a procurar um certo utilizador na caixa de procura, do que estar a percorrer aquela lista gigante cheia de nomes e etc. É que sou um bocado n00b em PHP/MySQL e não consigo fazer isso de maneira nenhuma.

2º - assim uma funcionalidade do tipo: o utilizador regista-se, e o sistema cria um valor na tabela USERS (que contém a informação do utilizador, e-mail, pass em md5, etc) e ao mesmo tempo cria um valor noutra tabela USERS_UPDATES, que contém o nome do utilizador correspondente, um textinho de update (por exemplo: " registou-se no Community.") e o respectivo time stamp. Depois quando o utilizador actualiza o seu perfil, o valor de USERS era actualizado, mas também o valor que foi criado no USERS_UPDATES era actualizado com o nome correspondente, o textinho de update mudava (para uma coisa do tipo: " actualizou o seu perfil...") e com o respectivo TIMESTAMP para ordenar numa lista que vou fazer (já a tenho feita).
É que já tentei fazer este sistema uma duzia de vezes, só que não consigo fazer com que ela funcione. Não me dá erro de PHP, não faz é nada. Se houver uma maneira mais fácil de fazer isto é só dizer...

Aguardo resposta. Se precisarem de mais detalhes peçam-me...
Cumpz.
 
Para a primeira basta-te uma query de sql utilizando o "LIKE" e não o "=".

Para a segunda, para ficar bem feito, precisas de um trigger.

Do tipo, eu sou assim um bocado noob. Digamos que para os Updates dos Utilizadores tenho um código deste género:
PHP:
/**
    * addNewUser
    */
   function addNewUser($username, $password, $email){
      $time = time();
	  $q = "INSERT INTO ".TBL_USERS." VALUES ('$username', '$password', '$email', $time)";
	  "INSERT INTO ".TBL_USERS_UPDATES." VALUES ('$username', ' registou-se no Community.')";
	  return mysql_query($q, $this->connection);
   }

Isto não me dá erro a efectuar a operação, mas simplesmente age como comentário: como se não lá estivesse.
Como é que eu posso fazer para isto funcionar ?
 
Do tipo, eu sou assim um bocado noob. Digamos que para os Updates dos Utilizadores tenho um código deste género:
PHP:
/**
    * addNewUser
    */
   function addNewUser($username, $password, $email){
      $time = time();
      $q = "INSERT INTO ".TBL_USERS." VALUES ('$username', '$password', '$email', $time)";
      "INSERT INTO ".TBL_USERS_UPDATES." VALUES ('$username', ' registou-se no Community.')";
      return mysql_query($q, $this->connection);
   }
Isto não me dá erro a efectuar a operação, mas simplesmente age como comentário: como se não lá estivesse.
Como é que eu posso fazer para isto funcionar ?

Se não me engano convem separares as duas querys. O mysql_query só executa a primeira query que encontra, o que tás a fazer aí já é mais um script mysql (correct me if i'm wrong).

Sugestão: experimenta com
PHP:
/**
    * addNewUser
    */
   function addNewUser($username, $password, $email){
      $time = time();
      $q = "INSERT INTO ".TBL_USERS." VALUES ('$username', '$password', '$email', $time)";
      if(!mysql_query($q, $this->connection)) die("Database was not updated");
      $q = "INSERT INTO ".TBL_USERS_UPDATES." VALUES ('$username', ' registou-se no Community.')";
      if(!mysql_query($q, $this->connection)) die("Database was not updated");
      return 1;
   }
 
Ora, essa sugestão deu-me isto:

Database was not updated

e pus o código assim:

PHP:
   function updateUserField($username, $field, $value){
      $q = "UPDATE ".TBL_USERS." SET ".$field." = '$value' WHERE username = '$username'";
	  if(!mysql_query($q, $this->connection)) die("Database was not updated");
      $q = "INSERT INTO ".TBL_USERS_UPDATES." VALUES ('$username', ' registou-se no Community.')";
      if(!mysql_query($q, $this->connection)) die("Database was not updated");
      return mysql_query($q, $this->connection);
   }
Sim isto é outra secção diferente. Mas acontece exactamente a mesma coisa com a função addNewUser. Simplesmente usei esta para nao estar sempre a criar novos users e depois eliminá-los.

Não sei o que fazer. :S
 
Ora, essa sugestão deu-me isto:

Database was not updated

Experimenta fazer um echo da variavel $q para veres se está a ser correctamente construida a query.

Usa esse echo directamente na base de dados (através do Mysql Query Browser por exemplo) e vê se a BD te dá algum erro. pode ser problema da query em si.. o nome de um campo errado, ou algo parecido.
 
Código:
[COLOR=#000000][COLOR=White]function [/COLOR][COLOR=White]updateUserField[/COLOR][COLOR=White]([/COLOR][COLOR=White]$username[/COLOR][COLOR=White], [/COLOR][COLOR=White]$field[/COLOR][COLOR=White], [/COLOR][COLOR=White]$value[/COLOR][COLOR=White]){
$q = "BEGIN;";
[/COLOR][COLOR=White]$q .[/COLOR][COLOR=White]= [/COLOR][COLOR=White]"UPDATE `[/COLOR][COLOR=White]TBL_USERS[/COLOR][COLOR=White]` SET `[/COLOR][COLOR=White]$field[/COLOR][COLOR=White]` = '$value' WHERE `username` = '$username';"[/COLOR][COLOR=White];
[/COLOR][COLOR=White]$q [/COLOR][COLOR=White].= [/COLOR][COLOR=White]"INSERT INTO `[/COLOR][COLOR=White]TBL_USERS_UPDATES[/COLOR][COLOR=White]` (username) VALUES('$username');"[/COLOR][COLOR=White];
$q .= "COMMIT;";
if(![/COLOR][COLOR=White]mysql_query[/COLOR][COLOR=White]([/COLOR][COLOR=White]$q[/COLOR][COLOR=White], [/COLOR][COLOR=White]$this[/COLOR][COLOR=White]->[/COLOR][COLOR=White]connection[/COLOR][COLOR=White])) die([/COLOR][COLOR=White]"Database was not updated"[/COLOR][COLOR=White]); 
return [/COLOR][COLOR=White]mysql_query[/COLOR][COLOR=White]([/COLOR][COLOR=White]$q[/COLOR][COLOR=White], [/COLOR][COLOR=White]$this[/COLOR][COLOR=White]->[/COLOR][COLOR=White]connection[/COLOR][COLOR=#007700][COLOR=White]); 
}[/COLOR][/COLOR][/COLOR]
 
Ora, essa sugestão deu-me isto:

Database was not updated

e pus o código assim:

PHP:
   function updateUserField($username, $field, $value){
      $q = "UPDATE ".TBL_USERS." SET ".$field." = '$value' WHERE username = '$username'";
      if(!mysql_query($q, $this->connection)) die("Database was not updated");
      $q = "INSERT INTO ".TBL_USERS_UPDATES." VALUES ('$username', ' registou-se no Community.')";
      if(!mysql_query($q, $this->connection)) die("Database was not updated");
      return mysql_query($q, $this->connection);
   }
Sim isto é outra secção diferente. Mas acontece exactamente a mesma coisa com a função addNewUser. Simplesmente usei esta para nao estar sempre a criar novos users e depois eliminá-los.

Não sei o que fazer. :S
Ora, afinal neste código funciona, mas apenas funciona a partedo INSERT no USERS_UPDATES.
A parte de UPDATE não funciona, daí a mensagem do "Database was not updated".

Quanto ao outro código fornecido pelo 'anjo2', esse não funciona mesmo. O código não faz praticamente nada. Tentei adaptar com o BEGIN; e o COMMIT;, adicionar os pontos antes do =, mas também não funcionou.

Alguma dica ?
 
Ora, já consegui chegar a algum lado com isto dos Updates.
Agora quando o utilizador se regista já aparece um valor na tabela com o texto do 'registou-se no Community.'. Eis como pus o código.

Database.php: (faz as operações básicas no SQL, mas em PHP: insere dados, edita, etc)
PHP:
   /**
    * addNewUser
    */
   function addNewUser($username, $password, $email){
      $time = time();
	  $q = "INSERT INTO ".TBL_USERS." VALUES ('$username', '$password', '$email')";
	  return mysql_query($q, $this->connection);
   }
   // Criar um valor na tabela USERS_UPDATES com o nome do user registado
   function addNewUpdate($username){
      $time = time();
	  $q = "INSERT INTO ".TBL_USERS_UPDATES." VALUES ('$username', '$update', $time)";
	  return mysql_query($q, $this->connection);
   }

Session.php: (serve de intermediário, define os valores a introduzir/editar, etc.)
PHP:
if($database->addNewUser($subuser, md5($subpass), $subemail)){
            $time = time();
			$database->addNewUpdate($subuser,$subupdate);
			return 0;  //New user added succesfully
         }else{
            return 2;  //Registration attempt failed
         }

Process.php: (processa os formulários, submetendo os valores para o Session.php)
PHP:
function procRegister(){
      global $session, $form;
      /* Convert username to all lowercase (by option) */
      if(ALL_LOWERCASE){
         $_POST['user'] = strtolower($_POST['user']);
      }
      /* Registration attempt */
      $retval = $session->register($_POST['user'], $_POST['pass'], $_POST['email'], $_POST['subupdate']);
      
      /* Registration Successful */
      if($retval == 0){
         $_SESSION['reguname'] = $_POST['user'];
         $_SESSION['regsuccess'] = true;
         header("Location: ".$session->referrer);
	  }
      /* Error found with form */
      else if($retval == 1){
         $_SESSION['value_array'] = $_POST;
         $_SESSION['error_array'] = $form->getErrorArray();
         header("Location: ".$session->referrer);
      }
      /* Registration attempt failed */
      else if($retval == 2){
         $_SESSION['reguname'] = $_POST['user'];
         $_SESSION['regsuccess'] = false;
         header("Location: ".$session->referrer);
      }
   }

NOTA: o $update/$subupdate mostram o texto em questão. Este valor aparece como 'hidden' no formulário, mostrando o nome 'subupdate' e tendo o texto no html VALUE.

O que me roi a cabeça é que não consigo actualizar esse mesmo valor quando o utilizador actualiza o perfil. Tenho o código assim

Database.php:
PHP:
/**
    * updateUserField
    */
   function updateUserField($username, $field, $value){
      $q = "UPDATE ".TBL_USERS." SET ".$field." = '$value' WHERE username = '$username'";
      return mysql_query($q, $this->connection);
   }
   // Editar o valor do mesmo utilizador na tabela USERS_UPDATES
   function updateUserUpdate($username, $field){
      $time = time();
	  $q = "UPDATE ".TBL_USERS_UPDATES." SET ".$field." = '$value' WHERE username = '$username'";;
	  return mysql_query($q, $this->connection);
   }

Session.php:
PHP:
/**
    * editAccount - Attempts to edit the user's account information
    * including the password, which it first makes sure is correct
    * if entered, if so and the new password is in the right
    * format, the change is made. All other fields are changed
    * automatically.
    */
   function editAccount($subcurpass, $subnewpass, $subemail, $subupdate){
      global $database, $form;  //The database and form object
      
	/*Muito código cortado, eis o essencial, que funciona...*/
      
      /* Editar o valor do utilizador na tabela USERS_UPDATES */
      $database->updateUserUpdate($this->username,$subupdate);
      	  
      /* Success! */
	  return true;
   }

Process.php:
PHP:
function procEditAccount(){
      global $session, $form;
      /* Account edit attempt */
      $retval = $session->editAccount($_POST['curpass'], $_POST['newpass'], $_POST['email'], $_POST['subupdate']);

      /* Account edit successful */
      if($retval){
         $_SESSION['useredit'] = true;
         header("Location: ".$session->referrer);
      }
      /* Error found with form */
      else{
         $_SESSION['value_array'] = $_POST;
         $_SESSION['error_array'] = $form->getErrorArray();
         header("Location: ".$session->referrer);
      }
   }

Quando no database tenho o updateUserUpdate com INSERT INTO (mesmo query que addNewUpdate), ele quando não tem um valor cria-o, mas quando editamos o perfil outra vez, não cria mais valores, pois já existe um. O meu objectivo é actualizar esse determinado valor do utilizador para futuras operações, e não adicionar cada vez mais à tabela. Só que com o código assim ele não faz práticamente nada.

Que posso fazer ?
 
Última edição:
Para editares a linha e não introduzires uma nova, usa a função UPDATE.
Por exemplo:
PHP:
$query = "UPDATE tabela SET coluna_a_mudar='$variavel' WHERE username='$username'";
Agora, se o $username não existir, ele não cria uma linha nova. O que podes fazer, por exemplo, é quando um utilizador se regista, crias logo esse $username na tabela com os outros valores a NULL ou isso. Podes também por uma condição em que, se o $username não existir, usas o INSERT INTO.
 
Última edição:
Fixe, já consegui implementar os UPDATES com sucesso. Experimentei usar o código gerado pelo PHPMyAdmin depois de alterar um valor lá na base de dados directamente.

Eu agora estou em dúvida por causa da função de Search... pois não sei mesmo fazer.
Tenho que procurar um Utilizador através do 'username' na tabela USERS... alguém me pode indicar como hei de fazer ?

Já tentei este: http://www.designplace.org/scripts.php?page=1&c_id=25
Só que não deu em nada, pois mostra-me este erro:
Warning: mysql_num_rows(): supplied argument is not a valid MySQL result resource in /home/ngw/public_html/community/search.php on line 36

Como faço ?
 
Back
Topo