PHP Class Function Ignores Return Statement - php

For some reason the return doesn't work when the check_em() succeeds. I'm new to php, so I'm at a loss here.
<?php
//Class to handle mysql
class db_handler {
private $db_host = 'localhost';
private $db_name = 'project';
private $db_user = 'project';
private $db_pass = 'dbpassword';
private $db_con_mysql = '';
private $db_con_db = '';
public function check_em($username, $password) {
$db_query = "SELECT password FROM user WHERE name='".$username."' LIMIT 1;";
if($this->db_con_mysql!='') {
$db_query_response = mysql_query($db_query) or die('Query failed: '.mysql_error());
$db_query_return = mysql_fetch_row($db_query_response);
$db_sha1_hash = $db_query_return[0];
echo $db_sha1_hash."<br>";
echo sha1($password)."<br>";
if(sha1($password)==$db_sha1_hash) {
return 'user valid'; //THIS DOESN'T WORK!?!?!?
} else {
return 'no good';
}
} else {
$this->db_connect();
$this->check_em($username, $password);
}
}
//Connect to mysql, then database
private function db_connect() {
$this->db_con_mysql = mysql_connect($this->db_host, $this->db_user, $this->db_pass) || die('Connection failed: '.mysql_error());
$this->db_con_db = mysql_select_db($this->db_name) || die('Could not use'.$this->db_name.'. '.mysql_error());
return;
}
//Disconnect from database and reset vars used to track connection.
private function db_disconnect() {
if($this->db_con_mysql!='') {
mysql_close();
$this->db_con_mysql = '';
$this->db_con_db = '';
return;
}
}
public function fake($some_val) {
if($some_val<6) {
return TRUE;
} else {
return FALSE;
}
}
}
$db_obj = new db_handler();
$val1 = $db_obj->check_em('someuser','password'); //should return 'user valid'
echo "val1:".$val1."<br>";
echo "<br><br>";
$val2 = $db_obj->check_em('someuser','passw0rd'); //should return 'no good'
echo "val2:".$val2."<br>";
echo "<br><br>";
echo "test<br>";
echo $db_obj->fake(4)."<br>";
?>
Results:
5baa61e4c9b93f3f0682250b6cf8331b7ee68fd8
5baa61e4c9b93f3f0682250b6cf8331b7ee68fd8
val1:
5baa61e4c9b93f3f0682250b6cf8331b7ee68fd8
7c6a61c68ef8b9b6b061b28c348bc1ed7921cb53
val2:no good
test
1

This line needs a return:
return $this->check_em($username, $password);
But a more sensible solution would be to connect to the database inside the if when the connection is null. Really, the whole thing could be better written, but I'll leave it at that.

...
else {
$this->db_connect();
return $this->check_em($username, $password);
}
...
You want to add the return, so that if it fails, then it goes one level deeper and finds another. If that level deeper succeeds, it passes the value up to the level above, which can pass it up and up until it reaches the original function call.

Related

Warning: mysqli_num_rows() expects parameter 1 to be mysqli_result, object given

I have splitted my php into 2/3 pieces using (MySQLi Procedural) :
First is dedicated to db (open,execute,Total Row, Affected Row,Close..)
Second is dedicated to other functionalities .
Here is an example :
db.php (First)
<?php
class DB {
var $DBUser = 'myuser';
var $DBPass = 'mypassword';
var $DBServer = 'localhost';
var $DBName = 'myDB';
var $con;
function __construct() {
$testcon = mysqli_connect($this->DBServer, $this->DBUser, $this->DBPass,$this->DBName);
if (!$testcon) {
die('Database connection failed: ' . mysqli_connect_error());
} else {
$this->con = $testcon;
}
}
function Qry($sql) {
if($result = mysqli_query($this->con,$sql) ) {
return $result;
}
else
{
$err = "Error: ".$sql. " :: ". mysqli_error;
die("$err");
}
}
function TotRows($result) {
if($result === false)
{
die("Error ".mysqli_error);
}
else return mysqli_num_rows($result);
}
function AffRows($result) {
return mysqli_affected_rows($result);
}
function LastRow($tblName) {
return mysqli_insert_id($this->con);
}
function close() {
mysqli_close($this->con);
}
}
?>
and
functions.php (Second)
public function GetBoolResult($db,$sql) {
$result=$db->Qry($sql);
$no_of_rows = $db->TotRows($db->con);
if ($no_of_rows > 0) {
// user exist
return true;
} else {
// user does not exist
return false;
}
}
When I try to execute the script I got the following Warning error :
Warning: mysqli_num_rows() expects parameter 1 to be mysqli_result, object given in db.php
if you look at this function to get number of rows , the parameter is tested inside the function, the sql statement has been tested directly in the mysql serverwithout any error.
Any idea what's the problem ?
Don't you wan't to pass in the result, not the connection
$result = $db->Qry($sql);
$no_of_rows = $db->TotRows($result);

MYSQLi - Commands out of sync error

Got some code here. Been stuck on it for ages and I can't seem to get around the error.
<?PHP
error_reporting(E_ALL);
ini_set('display_errors',1);
$mysqli = new mysqli('localhost', 'username', 'password', 'table');
$statsObjects = array();
$collatedObjects = array();
/* check connection */
if ($mysqli->connect_errno) {
printf("Connect failed: %s\n", $mysqli->connect_error);
exit();
}
Global $areRows;
$areRows = 2;
if( $result = $mysqli->query("SELECT * FROM stats WHERE collated = 0", MYSQLI_USE_RESULT) )
{
while($row = $result->fetch_assoc())
{
array_push($statsObjects,
new Statistic(
$row['ID'],
$row['player_GUID'],
$row['shots_fired'],
$row['shots_hit'],
$row['damage_done'],
$row['damage_taken'],
$row['friendly_damage_done'],
$row['friendly_damage_taken']
));
}
$success = true;
} //end if
$result->free_result();
if($success)
{
foreach($statsObjects as $stat)
{
$statsGuid = $stat->getGuid();
$query = "SELECT COUNT(*) AS total FROM collatedStats WHERE player_GUID = '" . $statsGuid . "'";
if( $result2 = $mysqli->query($query, MYSQLI_USE_RESULT) )
{
$value = $result2->fetch_assoc();
$rows = $value['total'];
if($rows > 0)
{
$areRows = 1;
}
else
{
$areRows = 0;
}
}
else
{
echo("Error <br/>");
echo($mysqli->error);
}
if($areRows == 1)
{
echo("Found a row! <br/>");
}
elseif($areRows == 0)
{
Echo("No rows found. =) <br/>");
}
} //end foreach
}
//OBJECT
class Statistic
{
var $GUID;
var $shotsfired;
var $shotshit;
var $damagedone;
var $damagetaken;
var $friendlydamagedone;
var $friendlydamagetaken;
var $ID;
function Statistic($ID, $GUID, $fired, $hit, $ddone, $dtaken, $fddone, $fdtaken)
{
$this->id = $ID;
$this->GUID = $GUID;
$this->shotsfired = $fired;
$this->shotshit = $hit;
$this->damagedone = $ddone;
$this->damagetake = $dtaken;
$this->friendlydamagedone = $fddone;
$this->friendlydamagetaken = $fdtaken;
}
function getID()
{
return $this->ID;
}
function getGuid()
{
return $this->GUID;
}
function getShotsFired()
{
return $this->shotsfired;
}
function getShotsHit()
{
return $this->shotshit;
}
function getDamageDone()
{
return $this->damagedone;
}
function getDamageTaken()
{
return $this->damagetaken;
}
function getFriendlyDDone()
{
return $this->friendlydamagedone;
}
function getFriendlyDTaken()
{
return $this->friendlydamagetaken;
}
function getAccuracy()
{
if($shotsfired == 0)
{
$accuracy = 0;
}
else
{
$accuracydec = $shotshit / $shotsfired;
$accuracy = $accuracydec * 100;
}
return $accuracy;
}
}
Basically every time i run the code, it keeps coming up with the error "Commands out of sync; you can't run this command now". I've spent 2 days trying to fix it - following peoples instructions about freeing the result before running the next one. I even used a prepared statement in previous code however it didn't work either - this is newly written code in an attempt to get it working. All the reading i've done suggests that this error happens when you try to run an sql command while another one is still receiving data - however i've called my first query, stored it all in an array - and then i'm looping through the array to get the next lot of data..and that's giving me an error, which is where i'm getting confused.
Any help would be appreciated!
Thank You to #andrewsi for his help - it turns out that having the MYSQLI_USE_RESULT inside SELECT * FROM stats WHERE collated = 0", MYSQLI_USE_RESULT was giving me the error. Removing that allowed me to do my code normally.
Hopefully this helps others that may have the same problem. =)

MySQL Query: Trying to get property of non-object

I'm getting following error message.
Notice: Trying to get property of non-object in
C:\xampp\htdocs\my\include\user_functions.php on line 34
Here is my Code
$conn = db_connection();
if($conn == false) {
user_error('Unable to connect to database');
return false;
}
$query = "UPDATE user SET passwd = '".$new_passwd."'
WHERE username = '".$username."' ";
$result=$conn->query($query);
if($result == false) {
user_error('Query Error'.$conn->error);
return false;
}
if($result->num_rows == 1) {
echo 'Password changed';
} else {
echo 'Failed ';
}
here is my db_connection
function db_connection() {
$db = new mysqli('localhost','root','','php_login');
if(!$db) {
echo 'Could not connect to database server';
} else {
return $db;
}
}
The UPDATE statement doesn't return a result set. What are you trying to get from fetch_array?
UPDATE
class mysqli{
public $aff_num_rows;
//some properties
//some properties
//some methods
//some methods
public function query($sql)
{
$resultset = mysql_query($sql); //after query instantiate the $aff_numrows
//property with function
$this->aff_num_rows = mysql_affected_rows(); //guess you are using sqlite
//so you might have different function
//and you can use this property
}
}
And in you code you have
if($conn->aff_num_rows == 1) {
echo 'password changed';
} else {
echo 'error changing pasword';
}

Flex PHP service

Already tearing my hairs out for a couple of days. There is not much left of them ;-)
I am experiencing a strange problem when I want to bind a service to a button or something else:
files:
- CDPC.php
<?php
require_once ('VOcdpc.php');
class CDPC {
var $username = "root";
var $password = "";
var $server = "localhost";
var $port = "3306";
var $databasename = "xoffercommon";
var $tablename = "tblcity";
var $connection;
public function __construct() {
$this->connection = mysqli_connect(
$this->server,
$this->username,
$this->password,
$this->databasename,
$this->port
);
mysqli_set_charset($this->connection,'utf8');
$this->throwExceptionOnError($this->connection);
}
public function getCDPC($cityID) {
$con = mysql_connect("localhost","root","");
if (!$con)
{
die('Could not connect: ' . mysql_error());
}
mysql_select_db("xoffercommon", $con);
$cdpc_Id = new Vocdpc();
$cdpc_Id->id_cdpc = 1;
$cdpc_Id->city_Id=$cityID;
$result_prov = mysql_query("SELECT tblProvence_Id FROM tblCity WHERE Id = " . $cityID);
$row = mysql_fetch_array($result_prov);
$cdpc_Id->provence_Id=intval($row['tblProvence_Id']);
$result_dist = mysql_query("SELECT tblDistrict_Id FROM tblProvence WHERE Id = " . $cdpc_Id->provence_Id);
$row = mysql_fetch_array($result_dist);
$cdpc_Id->district_Id=intval($row['tblDistrict_Id']);
$result_coun = mysql_query("SELECT tblCountry_Id FROM tblDistrict WHERE Id = " . $cdpc_Id->district_Id);
$row = mysql_fetch_array($result_coun);
$cdpc_Id->country_Id=intval($row['tblCountry_Id']);
return $cdpc_Id;
mysql_close($con);
}
private function throwExceptionOnError($link = null) {
if($link == null) {
$link = $this->connection;
}
if(mysqli_error($link)) {
$msg = mysqli_errno($link) . ": " . mysqli_error($link);
throw new Exception('MySQL Error - '. $msg);
}
}
}
?>
VOcpdc.php
<?php
class VOcdpc
{
public $id_cdpc;
public $country_Id;
public $district_Id;
public $provence_Id;
public $city_Id;
// explicit actionscript class
var $_explicitType = "Vocdpc";
}
?>
In flex builder
I can add the services to the Data Services panel but I have two strange things:
1) when I want to configure the return type he doesn't let me create a new ValueObject type, I only get the bottom datagrid which states: Properties returned by the operation: Property: country_Id, provence_Id, city_Id, id_cdpc, district_Id with the related values on the right side. Why can't I create a new data type on the top?
2) When I accept this and want to add the service call to a button (drag&drop) I get the following error: Error occurred while generating code. Make sure that there are no compiler eroors and try again after reopening the file. Componentn type services.cdpc.CDPC not found...
(ps: When I perform a Test Operation everything seems to be ok, I get the expected output values)
this is the class included in the main cdpc.php file, the post drops it apparently, so here is the VOcpdc file:
// explicit actionscript class
var $_explicitType = "Vocdpc";
}
?>

How do I access these PHP class variables?

I have two php files, one manages database connection and the other retrieves data from the database. I am writing this from scratch as a learning experience, and granted it is 5am but for some reason I cannot access the variables I need to.
My database connection file is as follows:
<?
class mysqlManager {
var $dbhost = 'xxx.xxx.xxx.xxx';
var $dbuser = 'xxx';
var $dbpass = 'xxx';
var $dbname = 'xxx';
var $connection;
var $errorCode;
var $errorMsg;
public function __construct($host='',$user='',$pass='',$name='') {
if(!$host=='') $this->dbhost = $host;
if(!$user=='') $this->dbuser = $user;
if(!$pass=='') $this->dbpass = $pass;
if(!$name=='') $this->dbname = $name;
}
function openConnection($host,$user,$pass) {
if(!$this->connection = #mysql_connect($host,$user,$pass,true)) {
$this->errorCode = mysql_errno();
$this->errorMsg = mysql_error();
return false;
}
return true;
}
function closeConnection() {
if($this->connection){
#mysql_close($this->connection);
}
}
function selectDB($name) {
if(!$this->openConnection($this->dbhost,$this->dbuser,$this->dbpass)){
return false;
}else{
return #mysql_select_db($name);
}
}
}
?>
The next file for getting data is as follows:
<?
class ccp {
var $mgr;
public function __construct() {
$this->mgr = new mysqlManager();
}
public function test() {
print_r($this->mgr);
}
function getCCP() {
if($mgr->openConnection($mgr->dbhost,$mgr->dbuser,$mgr->dbpass)) {
if(!$mgr->selectDB($mgr->dbname)) {
$mgr->closeConnection();
return 'An error has occured while processing your request.';
}
$q = 'SELECT * FROM ccp WHERE cat="ccp" ORDER BY date DESC';
$r = #mysql_query($q);
$ret='';
while($row = #mysql_fetch_array($r)){
$ret = '<div class="post">';
$ret .= ' <h2 class="title">'.$row["title"].'</h2>';
$ret .= ' <p class="date">'.$row["date"].'</p>';
$ret .= ' <div class="entry">'.$row["body"].'</div>';
$ret .= '</div>';
}
$mgr->closeConnection();
return $ret;
}
}
}
?>
When I run the test function, I get this:
mysqlManager Object ( [dbhost] => xxx.xxx.xxx.xxx [dbuser] => xxx [dbpass] => xxx [dbname] => xxx [connection] => [errorCode] => [errorMsg] => )
How do I access the variables in the mysqlManager Object?
Thanks!
To access the members of an object, use ->, with nested objects, multiple times. So: In test():
echo $this->mgr->dbhost; // echoes xxx.xx.xxx.xxx
echo $this->mgr->dbpass; // echoes xxx
You can do this because the variables were declared using var, making them implicitly public. If you declare them with private or protected like so:
class mysqlManager
{
private $dbhost = 'xxx.xxx.xxx.xxx';
protected $dbuser = 'xxx';
...
you will not be able to access the variables from another object.
Does that answer your question?

Categories