2010-04-13 6 views
0

Hey, j'ai donc créé une fonction pour vérifier la DB pour les entrées uniques, mais quand j'appelle la fonction ça ne semble pas fonctionner et me donne une erreur fatale des idées? Merci :)Erreur irrécupérable sur un non-objet

//Check for unique entries 
    function checkUnique($table, $field, $compared) 
    { 
     $query = $mysqli->query('SELECT '.$mysqli->real_escape_string($field).' FROM '.$mysqli->real_escape_string($table).' WHERE "'.$mysqli->real_escape_string($field).'" = "'.$mysqli->real_escape_string($compared).'"'); 
     if(!$query){ 
      return TRUE; 
     } 
     else { 
      return FALSE; 
     } 
    } 

La page appelant .....

//Start session 
session_start(); 

//Check if the session is already set, if so re-direct to the game 
if(isset($_SESSION['id'], $_SESSION['logged_in'])){ 
    Header('Location: ../main/index.php'); 
}; 

//Require database connection 
require_once('../global/includes/db.php'); 
require_once('../global/functions/functions.php'); 

//Check if the form has been submitted 
if (isset($_POST['signup'])){ 
    //Validate input 
    if (!empty($_POST['username']) && !empty($_POST['password']) && $_POST['password']==$_POST['password_confirm'] && !empty($_POST['email']) && validateEmail($_POST['email']) == TRUE && checkUnique('users', 'email', $_POST['email']) == TRUE && checkUnique('users', 'username', $_POST['username']) == TRUE) 
    { 
     //Insert user to the database 
     $insert_user = $mysqli->query('INSERT INTO (`username, `password`, `email`, `verification_key`) VALUES ("'.$mysqli->real_escape_string($_POST['username']).'", "'.$mysqli-real_escape_string(md5($_POST['password'])).'", "'.$mysqli->real_escape_string($_POST['email']).'", "'.randomString('alnum', 32). '"') or die($mysqli->error()); 

     //Get user information 
     $getUser = $mysqli->query('SELECT id, username, email, verification_key FROM users WHERE username = "'.$mysqli->real_escape_string($_POST['username']).'"' or die($mysqli->error())); 

     //Check if the $getUser returns true 
     if ($getUser->num_rows == 1) 
     { 
      //Fetch associated fields to this user 
      $row = $getUser->fetch_assoc(); 

      //Set mail() variables 
      $headers = 'From: [email protected]'."\r\n". 
         'Reply-To: [email protected]'."\r\n". 
         'X-Mailer: PHP/'.phpversion(); 
      $subject = 'Activate your account (Music Battles.net)'; 
      //Set verification email message 
      $message = 'Dear '.$row['username'].', I would like to welcome you to Music Battles. Although in order to enjoy the gmae you must first activate your account. \n\n Click the following link: http://www.musicbattles.net/home/confirm.php?id='.$row['id'].'key='.$row['verification_key'].'\n Thanks for signing up, enjoy the game! \n Music Battles Team'; 

      //Attempts to send the email 
      if (mail($row['email'], $subject, $message, $headers)) 
      { 
       $msg = '<p class="success">Accound has been created, please go activate it from your email.</p>'; 
      } 
      else { 
       $error = '<p class="error">The account was created but your email was not sent.</p>'; 
      } 
     } 
      else { 
       $error = '<p class="error">Your account was not created.</p>'; 
      } 
     } 
      else { 
       $error = '<p class="error">One or more fields contain non or invalid data.</p>'; 
      } 
     } 

erorr ....

Fatal error: Call to a member function query() on a non-object in /home/mbattles/public_html/global/functions/functions.php on line 5 
+0

$ mysqli n'est pas défini dans votre fonction. Les variables d'une fonction sont dans une portée différente, elles ne sont donc pas les mêmes que les variables en dehors de la fonction. De plus, je ne vois pas non plus de définition de $ mysqli dans votre script principal. Je suppose que cela vient de db.php, est-ce le cas? – erisco

Répondre

3

$mysqli n'est pas définie à l'intérieur de votre fonction en tant que fonctions ont leur propre variable scope. Soit passer cette variable à votre fonction en tant que paramètre:

function checkUnique($mysqli, $table, $field, $compared) { 
    // … 
} 

Ou utiliser la variable global keyword ou $GLOBAL d'accéder à cette variable de la portée globale dans votre fonction:

function checkUnique($table, $field, $compared) { 
    global $mysqli;  // registers the global variable $mysqli locally 
    $GLOBALS['mysqli']; // OR access the global variable via $GLOBALS['mysqli'] 
    // … 
} 
+0

Pourquoi n'accédez-vous pas simplement à la variable comme $ mysqli au lieu de $ GLOBALS ['mysqli'] '(après l'avoir déclaré' global' sur la première ligne de la fonction)? – brianreavis

+0

@brianreavis: Ceci est juste un exemple qui montre les deux variantes. – Gumbo

+0

Oh, pas de soucis! J'étais vraiment curieux ... c'est tout. – brianreavis

1

mysqli $ dans votre fonction est pas le même $ mysqli qui est en dehors de la fonction. Vous devez soit faire $ mysqli global, soit instancier une autre connexion db.

0

Pour moi, j'ai eu le même problème, mais rien à voir avec mysql. J'avais extrait la méthode suivante à partir de PHP existant:

<?php function checkMainInner() 
{ 
    ?> 
<?php if ($this['modules']->count('innertop')) : ?> 
<section id = "innertop" class = "row grid-block"><?php echo $this['modules']->render('innertop', array('layout' => $this['config']->get('innertop'))); ?></section> 
<?php endif; ?> 

<?php if ($this['modules']->count('breadcrumbs')) : ?> 
<section id = "breadcrumbs"><?php echo $this['modules']->render('breadcrumbs'); ?></section> 
<?php endif; ?> 

<?php if ($this['config']->get('system_output')) : ?> 
<section class = "row grid-block"><?php echo $this['template']->render('content'); ?></section> 
<?php endif; ?> 

<?php if ($this['modules']->count('innerbottom')) : ?> 
<section id = "innerbottom" class = "row grid-block"><?php echo $this['modules']->render('innerbottom', array('layout' => $this['config']->get('innerbottom'))); ?></section> 
<?php endif; 
} 

?> 

Et je fait l'appel de fonction comme suit:

<!--if it's just sidebar b--> 
     <?php if ($this['modules']->count('sidebar-b') && ($this['modules']->count('sidebar-a') == 0)): ?> 
     <div id = "maininner" class = "grid-box ninecol"> 
      <?php checkMainInner() ?> 
     </div> 
     <aside id = "sidebar-b" class = "grid-box threecol last"> 
      <?php echo $this['modules']->render('sidebar-b', array('layout' => 'stack')); ?> 
     </aside> 
     <?php endif; ?> 

Bien sûr, cela a échoué, parce que $this était hors de portée de l'intérieur de la fonction. Donc changer les paramètres de la fonction de prendre $self comme paramètre fixe ceci:

<?php function checkMainInner($self) 
{ 
    ?> 
<?php if ($self['modules']->count('innertop')) : ?> 
<section id = "innertop" class = "row grid-block"><?php echo $self['modules']->render('innertop', array('layout' => $self['config']->get('innertop'))); ?></section> 
<?php endif; ?> 

<?php if ($self['modules']->count('breadcrumbs')) : ?> 
<section id = "breadcrumbs"><?php echo $self['modules']->render('breadcrumbs'); ?></section> 
<?php endif; ?> 

<?php if ($self['config']->get('system_output')) : ?> 
<section class = "row grid-block"><?php echo $self['template']->render('content'); ?></section> 
<?php endif; ?> 

<?php if ($self['modules']->count('innerbottom')) : ?> 
<section id = "innerbottom" class = "row grid-block"><?php echo $self['modules']->render('innerbottom', array('layout' => $self['config']->get('innerbottom'))); ?></section> 
<?php endif; 
} 

?> 

Je puis le nouvel appel de méthode:

<!--if it's just sidebar b--> 
     <?php if ($this['modules']->count('sidebar-b') && ($this['modules']->count('sidebar-a') == 0)): ?> 
     <div id = "maininner" class = "grid-box ninecol"> 
      <?php checkMainInner($this) ?> 
     </div> 
     <aside id = "sidebar-b" class = "grid-box threecol last"> 
      <?php echo $this['modules']->render('sidebar-b', array('layout' => 'stack')); ?> 
     </aside> 
     <?php endif; ?> 

Faire que ce soit réglé mes problèmes. J'espère que cela aide quelqu'un.

Questions connexes