Goldeneye Posted September 28, 2008 Share Posted September 28, 2008 I have three files, class.users.php, class.mysql.php, and register.php Here is a snippet from class.users.php: <?php class user { function add($pseudonym, $passkey, $email){ $pseudonym = mysql_real_escape_string(trim($_POST['pseudonym'])); $passkey = md5($_POST['passkey']); $email = mysql_real_escape_string(trim($_POST['email'])); if(empty($pseudonym)){return $error = 'The pseudonym field is empty.';} if(empty($passkey)){return $error = 'The passkey field is empty.';} if(empty($email)){return $error = 'The E-Mail field is empty.';} else { if(!preg_match('/^[\w_\. -]{3,17}$/', $pseudonym) || preg_match('/[ ]{2,}/', $pseudonym) || (strlen($passkey) < 4) || !preg_match('/^([a-zA-Z0-9_\-\.]+)@((\[[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.)|(([a-zA-Z0-9\-]+\.)+))([a-zA-Z]{2,4}|[0-9]{1,3})(\]?)$/', $email)){ return $error = 'Either your pseudonym contained invalid characters or consecutive spaces; your passkey was less than 4 characters; or your E-Mail is invalid.'; } else { $query = $sql->query("SELECT `userid` FROM `userbase` WHERE `pseudonym` = '" . $pseudonym . "' OR `email` = '" . $email . "' ") or die(mysql_error()); if($sql->numRows($query) !== 0){ return $error = 'The Pseudonym or Email address you submitted are already taken.'; } else { $sql->query("INSERT INTO `userbase` (`pseudonym`, `passkey`, `email`, `echelon`, `joindate`, `tagline`, `stylesheet`, `lastlogin`) VALUES ('" . $pseudonym . "', '" . md5($passkey) . "', '" . $email . "', 1, '" . time() . "', 'about:blank', 'si.primary.css', 0)") or die(mysql_error()); return $affir = 'You now have yourself an account which means you can <a href="'.p.'login.php">Login</a>'; } } } } } $user = new user; ?> Here is a snippet from class.mysql.php: <?php class mysql { function query($sql){ $this->qresult = mysql_query($sql, $this->link); if($this->qresult){ ++$this->numQueries; return $this->qresult; } else { $this->savedQueries[] = array($sql, 0); return false; } } function result($query = 0, $row = 0){ return ($query) ? mysql_result($query, $row) : false; } function fetchAssoc($query = 0){ return ($query) ? mysql_fetch_assoc($query) : false; } function fetchRow($query = 0){ return ($query) ? mysql_fetch_row($query) : false; } function numRows($query = 0){ return ($query) ? mysql_num_rows($query) : false; } } $sql = new mysql; ?> And the snippet from register.php: <?php session_start(); define('p', '/foobar/'); //path constant to the scripts require 'class.mysql.php'; $sql->open('dbhost', 'dbuser', 'dbpass', 'dbname'); //open a database connect using a function class.mysql.php require 'class.users.php'; //Logged-in users can't register if(isset($_SESSION['userid'])) header('Location: '.p.'index.php'); //The sumbit button was pressed if(isset($_POST['action'])){ //initiate the add function from class.users.php $addUser = $user->add($_POST['pseudonym'], $_POST['passkey'], $_POST['email']); //the anti-spam lock-and-key did not match, return error. Else, return any error from the add() function in class.users.php if($_SESSION['lock'] !== $_POST['key']) $error = 'Anti-Spam-Error: Unmatched lock and key'; else $error = $addUser; //Reset the lock upon an error. Else, return the, "successfully registered," message. if($error!=='') $_SESSION['lock']=''; else $affir = $addUser; } //generate a new number for the anti-spam if($_SESSION['lock']==''){$lock=$data->randNumKey(5); $_SESSION['lock']=$lock;} echo '<div class="pagetitle">Register</div>'; //display any errors returned by the add() function in class.users.php echo $error!=='' ? '<p style="color: #FF0000;">'. $error .'</p>' : ''; echo $affir!=='' ? '<p style="color: #00FF00;">'. $affir .'</p>' : ''; //the submit button was not pressed, or all the submitted form data was valid. if(!isset($_POST['action']) || (isset($_POST['action']) && $affir != $addUser)){ //show form } ?> THE PROBLEM: When the submit button is pressed, I get the Fatal error: Call to a member function on a non-object error when there are no empty form fields. I know why I get this error (it's because I didn't declare the class in class.users.php). So I did try that, and I got the error, You cannot re-declare class mySQL in... (or whatever the exact error is.) THE QUESTION: How can I set this up so that I can use $sql->query() instead mysql_query() inside the add() function in class.users.php. A preemptive thanks, to anyone who helps. Quote Link to comment https://forums.phpfreaks.com/topic/126190-solved-conflict-with-using-class-functions-inside-another-class/ Share on other sites More sharing options...
dis Posted September 29, 2008 Share Posted September 29, 2008 The reason you are getting errors is because "$sql" doesn't exist inside the user::add function. You can send the $sql to the function via another variable: $addUser = $user->add($_POST['pseudonym'], $_POST['passkey'], $_POST['email'], $sql); OR You can set up the SQL class to have static functions and variables (requires PHP5). This means the SQL functions can be called statically and don't have to be instanced. example: class sql { private static $numQueries = 0; static public function query($sql){ self::$numQueries++; } } class user { $query = sql::query(""); } Quote Link to comment https://forums.phpfreaks.com/topic/126190-solved-conflict-with-using-class-functions-inside-another-class/#findComment-652790 Share on other sites More sharing options...
genericnumber1 Posted September 29, 2008 Share Posted September 29, 2008 As said, you aren't getting an error because the class doesn't exist, the var you're using ->query() on isn't set. Enable E_NOTICE and it will tell you exactly that Quote Link to comment https://forums.phpfreaks.com/topic/126190-solved-conflict-with-using-class-functions-inside-another-class/#findComment-652791 Share on other sites More sharing options...
Recommended Posts
Join the conversation
You can post now and register later. If you have an account, sign in now to post with your account.