2010-06-09 22 views
0

J'ai créé cette inscription en compte script activation de mon propre, je l'ai vérifié encore et encore de trouver des erreurs, je ne vois pas une erreur particulière ...activation du compte PHP

Le domaine serait comme ça :

http://domain.com/include/register.php?key=true&p=AfRWDCOWF0BO6KSb6UmNMf7d333gaBOB

qui provient d'un e-mail, lorsqu'un utilisateur clique dessus, ils sont redirigés vers ce script:

if($_GET['key'] == true) 
{ 
    $key = $_GET['p']; 

    $sql = "SELECT * FROM users 
      WHERE user_key = '" . $key . "'"; 

    $result = mysql_query($sql) or die(mysql_error()); 

    if(mysql_affected_rows($result) > 0) 
    { 
     $sql = "UPDATE users 
       SET user_key = '', user_active = '1' 
       WHERE user_key = '" . $key . "'"; 

     $result = mysql_query(sql) or die(mysql_error()); 

     if($result) 
     { 
      $_SESSION['PROCESS'] = $lang['Account_activated']; 
      header("Location: ../index.php"); 
     } 
     else 
     { 
      $_SESSION['ERROR'] = $lang['Key_error']; 
      header("Location: ../index.php"); 
     } 
    } 
    else 
    { 
     $_SESSION['ERROR'] = $lang['Invalid_key']; 
     header("Location: ../index.php"); 
    } 
} 

Il ne fonctionne même pas du tout, j'ai regardé dans la base de données avec l'utilisateur avec cette clé, ça correspond mais ça continue à monter comme une erreur qui m'ennuie énormément. La base de données est correcte, la table et la colonne sont correctes, rien ne cloche avec la base de données, c'est le script qui ne fonctionne pas.

Aidez-moi, les gars.

Merci :)

+0

mysql_real_escape_string est votre ami . Vous devriez échapper à vos attributs paramétrés (par exemple, les attributs qui proviennent d'une URL). Dans ce cas, votre variable clé $. http://ar.php.net/manual/fr/fonction.mysql-real-escape-string.php – Lombo

+0

Je le sais déjà, j'ai une fonction qui s'appelle safeClean() qui a inclus des fonctions pour assainir le données, mais je l'ai enlevé pour m'assurer que ce n'était pas ce qui affectait, donc il n'a pas et n'a pas utilisé le code précédent. L'échappement de MySQL est bien. – MacMac

Répondre

3
  1. Changer $_GET['key'] == true-$_GET['key'] == "true"
  2. Vous faites avant cette if, un mysql_connect(...) réussi ou mysql_pconnect(...)?
  3. Remplacez mysql_affected_rows($result); par mysql_num_rows($result);. Affecté, vous pouvez utiliser pour DELETE ou UPDATEInstructions SQL.
  4. Avant que vous secondiez si était ouvert, ajoutez avant de seconde mysql_result(...), mysql_free_result($result); pour libérer la mémoire allouée au résultat précédent.
  5. if($result) passer à if(mysql_affected_rows($result));. Vous pouvez le faire ici.
  6. Après l'appel de fonction header(...); ajouter un return 0; ou exit(0); dépend de votre logique de code complète.
  7. Vous utilisez $key variable dans instructions SQL, pour obtenir votre code plus sécurisé attaques par injection SQL get de changement $key = $_GET['p'];-$key = mysql_real_escape_string($_GET['p']);
  8. Je pense que votre emplacement dans header() fonctions échoue. Dans header() l'adresse url doit être complète comme: http://www.example.com/somewhere/index.php
  9. Et vérifiez votre variable $_GET['p'] existe !! Si ce n'est pas le cas et si $_GET['key'] existe, vous trouverez tous les utilisateurs activés. Ensuite, je pense que le paramètre user_key à '' est nessaire si vous avez un marqueur activé par l'utilisateur.
+0

Déjà essayé avec et sans guillemets. La connexion MySQL est bien. – MacMac

+0

Je sais mais cela peut ne pas fonctionner dans les versions futures du moteur php. – Svisstack

+0

$ _GET ['key'] == true est en train d'évaluer si $ _GET ['key'] a une valeur ... alors vous pouvez appeler votre script avec key = false et il passera quand même la validation..Bien que ça ne marche pas t résoudre le problème, c'est juste un avertissement;) –

0

vous ne devriez pas utiliser:

if(mysql_affected_rows($result) > 0) 

Vous devez utiliser mysql_num_rows()

-1

Votre problème est:

$result = mysql_query($sql) or die(mysql_error()); 

"ou" fait votre déclaration boolean donc $ résultat obtient un True au lieu de la valeur retournée par mysql_query()

echo 'Hello' or die('bye'); // outputs nothing, because result is True not 'Hello' 

3 or die() == True; // true 
3 or die() != 3; // true 

OU est la même que || et opérateur de l'instruction logique.

Cela fonctionne:

$result = mysql_query($sql); 
if(!$result) die(mysql_error());  

La même erreur a été faite il y a quelques heures: link


cas où ou peut être utilisé:

defined('FOO') or 
    define('FOO', 'BAR'); 

mysql_connect(...) or die(...); 

mysql_select_db(....) or die(...); 

mysql_query('UPDATE ...') or die(...); 

if(FOO or BAR) { ... } 
+0

Mais si la première valeur dans l'expression OR est vraie, next n'est pas exécutée alors si mysql_query résulte qu'une variable n'est pas un faux, ce die() ne s'exécute jamais. C'est bon. Cette syntaxe est utilisée partout et partout woking bien. – Svisstack

+0

Au moins ne soyez pas si ignorant et tester même des choses que vous n'aimez pas. – Ski

+1

J'ai toujours utilisé "ou" de cette façon et ce n'est jamais problématique. – alternative