Why isn't my foreach loop displaying my mysql data? - php

I am trying to extend the function of this tutorial on youtube, and I have run into some issues. Here is the particular chunk of code I am currently struggling with:
public function listProjects() {
$projects = DB::getInstance()->get('projects', array('projectStatus', '=', 'active'));
if($projects->count()) {
echo 'This query senses rows, but returns data it does not';
foreach($projects as $project) {
echo $project->projectName;
}
}
}
This is a method of my "Project" class, and it uses methods from the DB class, with relevant code here:
private function __construct() {
try {
$this->_pdo = new PDO('mysql:host=' . Config::get('mysql/host') . ';dbname=' . Config::get('mysql/db'), Config::get('mysql/username'), Config::get('mysql/password'));
} catch(PDOException $e){
die($e->getMessage());
}
}
public static function getInstance() {
if(!isset(self::$_instance)){
self::$_instance = new DB();
}
return self::$_instance;
}
public function query($sql, $params = array()){
$this->_error = false;
if($this->_query = $this->_pdo->prepare($sql)) {
$x = 1;
if(count($params)) {
foreach($params as $param) {
$this->_query->bindValue($x, $param);
$x++;
}
}
if($this->_query->execute()) {
$this->_results = $this->_query->fetchAll(PDO::FETCH_OBJ);
$this->_count = $this->_query->rowCount();
} else {
$this->_error = true;
}
}
return $this;
}
public function action($action, $table, $where = array()) {
if(count($where) === 3) {
$operators = array('=', '>', '<', '>=', '<=');
$field = $where[0];
$operator = $where[1];
$value = $where[2];
if(in_array($operator, $operators)) {
$sql = "{$action} FROM {$table} WHERE {$field} {$operator} ?";
if(!$this->query($sql, array($value))->error()) {
return $this;
}
}
} return $this;
}
public function get($table, $where) {
return $this->action('SELECT *', $table, $where);
}
So in my index.php, I write this code:
$projectList = new Project;
$projectList->listProjects();
To try and retrieve all of my "projects" stored in the database. I put the "This query senses rows, but returns data it does not" echo in order to determine if rows were being counted, which they are, because that statement is echoed, but my foreach statement is not working correctly. The field in the projects table that I am trying to access is projectName. I would eventually like to display all relevant project info, but I'm sure I could figure that out once I get it to display anything from the database.

This:
foreach($projects as $project) {
echo $project->projectName;
}
should be:
foreach($projects as $project) {
echo $projects->projectName;
}

Related

PHP OOP boolean error

I have got the following error:
Fatal error: Uncaught Error: Call to a member function count() on boolean in C:\xampp\htdocs\pianocourse101\index.php:5 Stack trace: #0 {main} thrown in C:\xampp\htdocs\pianocourse101\index.php on line 5
I have been wondering whether is the error part of my function count in my db.php or from index.php? Here is my code:
db.php
<?php
class DB {
private static $_instance = null;
private $_pdo,
$_query,
$_error = false,
$_results,
$_count = 0;
private function __construct() {
try {
$this->_pdo = new PDO('mysql:host='.Config::get('mysql/host').';dbname='.Config::get('mysql/db'), Config::get('mysql/username'),Config::get('mysql/password'));
} catch(PDOException $e) {
die($e->getMessage());
}
}
public static function getInstance() {
if(!isset(self::$_instance)) {
self::$_instance = new DB();
}
return self::$_instance;
}
public function query($sql, $params = array()) {
$this->_error = false;
// set the error to false so that we are not returning a previous error
if($this->_query = $this->_pdo->prepare($sql)) {
// check to see if query has been prepared properly
$x=1;
if(count($params)) { // check to see if need to bind
anything
foreach($params as $param) {
$this->_query->bindValue($x, $param);
$x++;
}
}
if($this->_query->execute()) {
$this->_results = $this->_query->fetchAll(PDO::FETCH_OBJ);
$this->_count = $this->_query->rowCount(); // to query a
database securely by binding parameters and preventing sql
injections
} else {
$this->_error = true;
}
}
return $this; // return the currenct object we are working with
}
public function action($action, $table, $where = array()) {
if(count($where) === 3) {
$operators = array('=', '>', '<', '>=', '<=');
$field = $where[0];
$operator = $where[1];
$value = $where[2];
if(in_array($operator, $operators)) {
$sql = "{$action} * FROM {$table} WHERE {$field} {$operator} ?";
if(!$this->query($sql, array($value))->error()) {
return $this;
}// to check to see if operator is inside the operators .... We do a ? so that we can bind the value on
}
}
return false;
}
public function get($table, $where){
return $this->action('SELECT *', $table, $where);
}
public function delete($table, $where) {
return $this->action('DELETE ', $table, $where);
}
public function error() {
return $this->_error;
}
public function count() {
return $this->_count;
}
}
index.php
<?php
require_once 'core/init.php';
$user = DB::getInstance()->get('users', array('username', '=', 'alex'));
if (!$user->count()) {
echo 'No user';
} else {
echo 'OK!';
}
Your get() method will always fail since it's generating an invalid SQL query.
Explanation
If we take your request:
$user = DB::getInstance()->get('users', array('username', '=', 'alex'));
and break it up to see what happens (this is the same thing as the above):
// This will work and return an instance of DB
$db = DB::getInstance();
// Will always fail and return false, since the get() method fails
$user = $db->get('users', array('username', '=', 'alex'));
// Since user is false (a boolean), it doesn't have any methods
$user->count()
So, why does it fail? Let's look in your DB class.
Let's start with the get() method:
public function get($table, $where){
// This is calling an internal method called "action()" passing three values
return $this->action('SELECT *', $table, $where);
}
and where it fails, the action() method:
public function action($action, $table, $where = array()) {
if(count($where) === 3) {
$operators = array('=', '>', '<', '>=', '<=');
$field = $where[0];
$operator = $where[1];
$value = $where[2];
if(in_array($operator, $operators)) {
// The get() method passed 'SELECT *' to this method, so the below string will be
// "SELECT * * FROM users WHERE username = ?"
// (hint: it's the double * * that's invalid) .
$sql = "{$action} * FROM {$table} WHERE {$field} {$operator} ?";
if(!$this->query($sql, array($value))->error()) {
// Since the query fails, it will never come here
return $this;
}
}
}
// Since the query fails (is invalid), this is what it will return
return false;
}
Solution
A quick fix would be to change the action() method from:
$sql = "{$action} * FROM {$table} WHERE {$field} {$operator} ?"
to
$sql = "{$action} FROM {$table} WHERE {$field} {$operator} ?"
As I've mentioned in comments, you should look into proper error handling for PDO. Or better yet, use some tried and tested db library.
You mentioned that you are new to PHP and are going through some tutorial, the would recommend learning the basics step by step.

Code won't run once adding transactions

Hello I have code that without transactions executes but with transactions doesn't run. My DB Class encapsulates prepared statements from which it is composed in my BaseApp Class and this is in turn is extended by BaseTransactApp Class.
BasetransactApp Class is extended by the EqRqst Class. EqRqst Class is extended by the EqLeaseRequest Class which is used to call the code in the trait with the problematic code.
At one point it showed the error 2SQLSTATE[HY000]: General error
when I did not set
$this->_pdo->setAttribute( PDO::ATTR_EMULATE_PREPARES , false);
My DB Class is
<?php
class DB{
`enter code here` private static $_instance = null;
private $_pdo,
$_query,
$_error = false,
$_results,
$x,
$_count = 0;
private function __construct(){
try{
$this->_pdo = new PDO('mysql:host=' .Config::get('mysql/host') . ';dbname=' . Config::get('mysql/db'), Config::get('mysql/username'), Config::get('mysql/password'));
$this->_pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
$this->_pdo->setAttribute( PDO::ATTR_EMULATE_PREPARES , false);
}catch(PDOException $e){
die($e->getMessage());
}
}
public static function getInstance(){
if(!isset(self::$_instance)){
self::$_instance = new DB();
}
return self::$_instance;
}
public function query($sql, $params = array()){
$this->_error = false;
if($this->_query = $this->_pdo->prepare($sql)){
$x = 1;
if(count($params)){
foreach($params as $param){
$this->_query->bindValue($x,$param);
$x++;
}
}
if($this->_query->execute()){
$this->_results = $this->_query->fetchAll(PDO::FETCH_OBJ);
$this->_count = $this->_query->rowCount();
}else{
$this->_error = true;
}
}
return $this;
}
public function action($action,$table,$where = array()){
if(count($where) === 3){
$operators = array('=','>','<','>=','<=');
$field = $where[0];
$operator = $where[1];
$value = $where[2];
if(in_array($operator , $operators)){
$sql = "{$action} FROM {$table} WHERE {$field} {$operator} ? ";
if(!$this->query($sql, array($value))->error()){
return $this;
}
}
}
return false;
}
public function update($table,$id,$fields){
$set = '';
$x = 1;
foreach($fields as $name => $value){
$set .= "{$name} = ?";
if($x < count($fields)){
$set .= ', ';
}
$x++;
}
$sql = "UPDATE {$table} SET {$set} WHERE {$name} = '{$id}'";
echo $sql;
if(!$this->query($sql,$fields)->error()){
echo "true";
return true;
}
return false;
}
public function get($table,$where){
return $this->action('SELECT *',$table,$where);
}
public function delete($table,$where){
return $this->action('DELETE',$table,$where);
}
public function insert($table,$fields = array()){
if(count($fields)){
echo 'this is the count '.count($fields);
$x=1;
if(!is_multi_array($fields)){
echo 'Not a multi array'.'<br>';
$keys = array_keys($fields);
print_r($keys);
$values = '';
}
foreach($fields as $field => $fieldValue){
if(!is_array($fieldValue)){
echo $x;
$values .="?";
if($x< count($fields)){
$values .= ', ';
}
if($x == count($fields)){
echo 'insert query is Executed'.'<br>';
echo $x;
$sql ="INSERT INTO {$table} (`".implode('`,`',$keys). "`) VALUES ({$values})";
if(!$this->query($sql,$fields)->error()){
echo "true";
return true;
}
}
$x++;
}else{
if($x <= count($fields)){
echo 'recursive insert called'.'<br>';
echo "number of recursive cycles is ".$x;
$this->insert($table,$fieldValue);
if($x == count($fields)){
echo "Escaped";
exit();
}
$x++;
}
}
}
}
echo 'No no';
return false;
}
public function getLastId(){
return $this->_pdo->lastInsertId();
}
public function beginTransaction(){
return $this->_pdo->beginTransaction();
}
public function commit(){
return $this->_pdo->commit();
}
public function rollBack(){
return $this->_pdo->rollBack();
}
}
?>
IT is composed in BaseApp Class
protected $db,
$data,
$table;
public function __construct(){
$this->db = DB::getInstance();
}
public function getProp($prop){
return $this->$_prop;
}
public function setProp($objVar,$val){
$this->objVar = $val;
}
public function create($fields = array()){
if(!$this->db->insert($this->table, $fields) ){
throw new Exception('There was a problem creating an account.');
}
}
public function get($where = array()){
$dbResult = $this->db->get($this->table, $where);
if($dbResult->count()){
$this->data = $dbResult->first();
return true;
}
return false;
}
public function update($fields = array(),$id = null){
if(!$this->db->update($this->table,$id,$fields)){
throw new Exception('There was a problem Updating');
}
}
public function delete($where = array()){
$this->db->delete($this->table,$where);
}
public function data(){
return $this->data;
}
public function getTable(){
return $this->table;
}
public function getLastInsertId(){
return $this->db->getLastId();
}
}
?>
which is extended by
public function __construct(){
parent::__construct();
if($this->db){
echo 'WWWWWWWWWWWWWWWW';
}
}
public function beginTransaction(){
return $this->db->beginTransaction();
}
public function commit(){
return $this->db->commit();
}
public function rollBack(){
return $this->db->rollBack();
}
}
?>
Then
protected $EqRqst_ID,
$DateOfRequest,
$rqstState,
$RequestedPackage = array(),
$state_ID,
$table = 'EqRqst';
public function __construct(RqstState $state){
parent::__construct();
$this->rqstState = $state;
}
public function create($args = array()){
BaseTransactApp::create($args);
// $this->EqRqst_ID = $this->getLastInsertId();
// echo $this->EqRqst_ID;
}
public function getRqstID(){
return $this->EqRqst_ID;
}
public abstract function makeRequest($requestArg = array(),$elRqst = array(),$rqstPakg = array());
}
?>
This trait contains the code that is Use by eqleaserequest .This code executes well without transactions but fails to do so with them
public function makeRequest($requestArg = array(),$eqLsRqst = array(),$rqstPakg = array()){
try{
$this->beginTransaction();
parent::create($requestArg);
$this->EqRqst_ID = parent::getLastInsertId();
$this->create($eqLsRqst);
$this->_RequestPkg->create(multi_array_merge(array('EqRqst_ID'=> $this->EqRqst_ID),$rqstPakg));
$this->commit();
}catch(Exception $e){
$this->rollBack();
echo $e->getMessage().;
}
//$this->EqRqst_ID = $this->getRqstID();
}
This code is the problem it runs when I comment out the Transaction code but doesn't with it. IT Executed by
This class is the one that uses the TraitRequest
use traitRequest;
//protected $table = 'EqLeaseRequest';
private $_Emp,
$_Emp_ID,
$_RequestPkg,
$_Intended_Use,
$_EqRqst,
$_EqRqst_ID,
$_Expected_Returndate;
public $rqstID;
public function __construct(RqstState $state,Employee $Emp,RequestPackage $RqstPkg){
parent::__construct($state);
$this->_Emp = $Emp;
$this->_RequestPkg = $RqstPkg;
}
public function create($eqLsRqstArg = array()){
$this->table = 'EqLeaseRequest';
print_r(array_merge(array('EqRqst_ID'=> $this->EqRqst_ID),$eqLsRqstArg));
BaseTransactApp::create(array_merge(array('EqRqst_ID'=>$this->EqRqst_ID),$eqLsRqstArg));
//BaseTransactApp::create($eqLsRqstArg);
}
}
}
?>
I was able to find the solution by changing the code in the Trait traitRequest.
The solution is as follows
trait traitRequest{
public function makeRequest($requestArg = array(),$eqLsRqst = array(),$rqstPakg = array()){
$this->beginTransaction();
parent::create($requestArg);
if(parent::count()){
$this->EqRqst_ID = parent::getLastInsertId();
$this->create($eqLsRqst);
if($this->count()){
foreach($rqstPakg as $pkg){
$this->_RequestPkg->create(array_merge(array('EqRqst_ID'=> $this->EqRqst_ID),$pkg));
if(!$this->_RequestPkg->count()){
$this->rollBack();
}
}
$this->commit();
}else{
echo 'Second Rollback';
$this->rollBack();
}
}else{
echo 'First Rollback';
$this->rollBack();
}
}
}
?>

Proper way to access database in PHP classes

My limited PHP knowledge is rather old. When I used to create websites I always had a config.php file which contained some defines and a $_DB global variable. Then in every function_xyz.php file I included this config file.
Now I want to finally move on and use classes. But I can't figure out a proper way to have access to mysql in functions of my classes without inclusion of the so called config.php file on top of each file.
Imagine I have a class called User.php:
class User {
private $firstName;
private $familyName;
private $emailAddress;
public function __construct($username, $password) {
//check if user with name and pass exist in DB
// stuff....
//If user exist, populate member variables
$this->emailAddress = ...
}
public function getEmail(){
return $this->emailAddress;
}
}
I know it is not the best example or practice...but how can I have a global MySQL access in all my classes without being required to have the config file included.
What is the best practice nowadays?
Make a global Instance:
//db.php include once
class DB {
#bind connenction in it
}
#make instance
$db = new DB($config);#use for User Instances
and then:
class User {
private $db;
private $firstName;
private $familyName;
private $emailAddress;
public function __construct($db) {
$this->db=$db;
}
public function validate($username, $password,$db) {
//check if user with name and pass exist in DB
//If user exist, populate member variables
$this->emailAddress = ...
}
public function getEmail(){
return $this->emailAddress;
}
}
$user = new User($db);
Is one way.
But you telling to less about how you want to use the classes.
I would go with PHPAcademy's login/register tutorial. He have DB class that handles almost anything you need. Here is sample of his code, slightly modified by me, but all credits to Alex Garrett.
<?php
class DB {
private static $_instance = null;
private $_pdo,
$_query,
$_error = false,
$_results,
$_count = 0;
private function __construct() {
try {
$this->_pdo = new PDO('mysql:host=' . Config::get('mysql/host') . ';dbname=' . Config::get('mysql/db'), Config::get('mysql/username'), Config::get('mysql/password'));
} catch(PDOException $e) {
die($e->getMessage());
}
}
public static function getInstance() {
if(!isset(self::$_instance)) {
self::$_instance = new DB();
}
return self::$_instance;
}
public function query($sql, $params = array()) {
$this->_error = false;
if($this->_query = $this->_pdo->prepare($sql)) {
$x = 1;
if(count($params)) {
foreach($params as $param) {
if (is_int($param)) {
$this->_query->bindValue($x, $param, PDO::PARAM_INT);
} else {
$this->_query->bindValue($x, $param);
}
$x++;
}
}
if($this->_query->execute()) {
$this->_results = $this->_query->fetchAll(PDO::FETCH_OBJ);
$this->_count = $this->_query->rowCount();
}
else {
$this->_error = true;
print_r($this->_query->errorInfo());
}
}
return $this;
}
public function action($action, $table, $where = array()) {
if(count($where) === 3){
$operators = array('=', '>', '<', '>=', '<=', '!=');
$field = $where[0];
$operator = $where[1];
$value = $where[2];
if(in_array($operator, $operators)) {
$sql = "{$action} FROM {$table} WHERE {$field} {$operator} ?";
if(!$this->query($sql, array($value))->error()) {
return $this;
}
}
} else if (count($where) === 0) {
$sql = "{$action} FROM {$table}";
if(!$this->query($sql)->error()) {
return $this;
}
}
return false;
}
public function get($table, $where) {
return $this->action('SELECT *', $table, $where);
}
public function delete($table, $where) {
return $this->action('DELETE', $table, $where);
}
public function getAll($table) {
return $this->action('SELECT *', $table);
}
public function first() {
return $this->results()[0];
}
public function last() {
$i = count($this->results()) - 1;
return $this->results()[$i];
}
public function insert($table, $fields = array()) {
if(count($fields)) {
$keys = array_keys($fields);
$values = '';
$x = 1;
foreach ($fields as $field) {
$values .= '?';
if($x < count($fields)) {
$values .= ', ';
}
$x++;
}
$sql = "INSERT INTO {$table} (`" . implode('` , `', $keys) . "`) VALUES({$values})";
if (!$this->query($sql, $fields)->error()) {
return true;
}
}
return false;
}
public function update($table, $where, $parametar, $fields) {
$set = '';
$x = 1;
foreach ($fields as $name => $value) {
$set .= "{$name} = ?";
if ($x < count($fields)) {
$set .= ', ';
}
$x++;
}
if (is_int($parametar)) {
$sql = "UPDATE {$table} SET {$set} WHERE {$where} = {$parametar}";
} else {
$sql = "UPDATE {$table} SET {$set} WHERE {$where} = '{$parametar}'";
}
if (!$this->query($sql, $fields)->error()) {
return true;
}
return false;
}
public function results() {
return $this->_results;
}
public function error() {
return $this->_error;
}
public function count() {
return $this->_count;
}
}
Then you can query database like DB::getInstance()->getAll('tableName')->results();. Change DB credentials in __construct, or watch his videos (which I recomend).

OOP Object of class __PHP_Incomplete_Class

hello i have this code for login and register in PHP OOP
<?php
class DB {
public static $instance = null;
private $_pdo = null,
$_query = null,
$_error = false,
$_results = null,
$_count = 0;
private function __construct() {
try {
$this->_pdo = new PDO('mysql:host=' . Config::get('mysql/host') . ';dbname=' . Config::get('mysql/db'), Config::get('mysql/username'), Config::get('mysql/password'), array(PDO::MYSQL_ATTR_INIT_COMMAND => "SET NAMES utf8"));
//$this->query('SET NAMES utf8');
} catch(PDOExeption $e) {
die($e->getMessage());
}
}
public static function getInstance() {
if(!isset(self::$instance)) {
self::$instance = new DB();
}
return self::$instance;
}
public function query($sql, $params = array()) {
$this->_error = false;
if($this->_query = $this->_pdo->prepare($sql)) {
$x = 1;
if(count($params)) {
foreach($params as $param) {
$this->_query->bindValue($x, $param);
$x++;
}
}
if($this->_query->execute()) {
$this->_results = $this->_query->fetchAll(PDO::FETCH_OBJ);
$this->_count = $this->_query->rowCount();
} else {
$this->_error = true;
}
}
return $this;
}
public function get($table, $where) {
return $this->action('SELECT *', $table, $where);
}
public function delete($table, $where) {
return $this->action('DELETE', $table, $where);
}
public function action($action, $table, $where = array()) {
if(count($where) === 3) {
$operators = array('=', '>', '<', '>=', '<=');
$field = $where[0];
$operator = $where[1];
$value = $where[2];
if(in_array($operator, $operators)) {
$sql = "{$action} FROM {$table} WHERE {$field} {$operator} ?";
if(!$this->query($sql, array($value))->error()) {
return $this;
}
}
return false;
}
}
public function insert($table, $fields = array()) {
$keys = array_keys($fields);
$values = null;
$x = 1;
foreach($fields as $value) {
$values .= "?";
if($x < count($fields)) {
$values .= ', ';
}
$x++;
}
$sql = "INSERT INTO {$table} (`" . implode('`, `', $keys) . "`) VALUES ({$values})";
if(!$this->query($sql, $fields)->error()) {
return true;
}
return false;
}
public function update($table, $id, $fields = array()) {
$set = null;
$x = 1;
foreach($fields as $name => $value) {
$set .= "{$name} = ?";
if($x < count($fields)) {
$set .= ', ';
}
$x++;
}
$sql = "UPDATE {$table} SET {$set} WHERE id = {$id}";
if(!$this->query($sql, $fields)->error()) {
return true;
}
return false;
}
public function results() {
// Return result object
return $this->_results;
}
public function first() {
return $this->_results[0];
}
public function count() {
// Return count
return $this->_count;
}
public function error() {
return $this->_error;
}
public function lastInsertId(){
return $this->_pdo->lastInsertId();
}
public function __sleep(){
return array();
}
}
and i save the user login data in session, everything works fine in localhost, but in my web server i have a problem in the line $this->_query->bindValue($x, $param);
Catchable fatal error: Object of class __PHP_Incomplete_Class could not be converted to string in
i know that is something wrong with my session but i cant find whats the problem, and this is my session class
<?php
class Session {
public static function exists($name) {
return (isset($_SESSION[$name])) ? true : false;
}
public static function get($name) {
return $_SESSION[$name];
}
public static function put($name, $value) {
return $_SESSION[$name] = $value;
}
public static function delete($name) {
if(self::exists($name)) {
unset($_SESSION[$name]);
}
}
public static function flash($name, $string = null) {
if(self::exists($name)) {
$session = self::get($name);
self::delete($name);
return $session;
} else if ($string) {
self::put($name, $string);
}
}
}
please tell me if you can what i can to do with that error thank you very much.
and this is the code where i store my session
public function login($username = null, $password = null, $remember = false) {
if(!$username && !$password && $this->exists()) {
Session::put($this->_sessionName, $this->data()->id);
} else {
$user = $this->find($username);
if($user) {
if($this->data()->password === Hash::make($password, $this->data()->salt)) {
Session::put($this->_sessionName, $this->data()->id);
if($remember) {
$hash = Hash::unique();
$hashCheck = $this->_db->get(Config::get('mysql/tbl_user_sessions'), array('user_id', '=', $this->data()->id));
if(!$hashCheck->count()) {
$this->_db->insert(Config::get('mysql/tbl_user_sessions'), array(
'user_id' => $this->data()->id,
'hash' => $hash
));
} else {
$hash = $hashCheck->first()->hash;
}
Cookie::put($this->_cookieName, $hash, Config::get('remember/cookie_expiry'));
}
return true;
}
}
}
return false;
}
i just do var_dump of my session['user']
array(1) {
["user"]=> &object(__PHP_Incomplete_Class)#1 (6) {
["__PHP_Incomplete_Class_Name"]=> string(4) "User"
["_db":"User":private]=> object(__PHP_Incomplete_Class)#2 (1) {
["__PHP_Incomplete_Class_Name"]=> string(2) "DB"
}
["_sessionName":"User":private]=> string(4) "user"
["_cookieName":"User":private]=> string(4) "hash"
["_data":"User":private]=> object(stdClass)#3 (7) {
["id"]=> string(3) "144"
["username"]=> string(5) "admin"
["password"]=> string(64) "0611affa6664e471b939cd3197b49e0c3b47d146fc12a472c4275dbd85a7cd67"
["salt"]=> string(32) "458a0dbfbd9bdca381e50b8d753329ea"
["name"]=> string(12) "Artur Papyan"
["joined"]=> string(19) "2013-11-29 07:41:54"
["group"]=> string(1) "1"
}
["_isLoggedIn":"User":private]=> bool(true)
}
}
It looks as though you are attempting to output the result to a string, which it cannot do as the class returns an object.
Also, Referring to DB.php line 38 is a red herring, as it is displaying the error message to the called function.
$this->_query->bindValue($x, $param);
Instead look to where your code is calling the class, and how you are attempting to bind your variables within your code it's self, instead of the actual call to DB.php file.

php - Invalid argument supplied for foreach() [closed]

Closed. This question does not meet Stack Overflow guidelines. It is not currently accepting answers.
Closed 8 years ago.
This question was caused by a typo or a problem that can no longer be reproduced. While similar questions may be on-topic here, this one was resolved in a way less likely to help future readers.
Questions concerning problems with code you've written must describe the specific problem — and include valid code to reproduce it — in the question itself. See SSCCE.org for guidance.
Improve this question
hey i try to use the foreach function and i get this error...my code goes like this.
My index.php
require_once 'core/init.php';
$user = DB::getInstance()->get('users', array('username', '=', 'kostas'));
if(!$user->count()) {
echo "No user";
}else {
foreach ($user->results() as $user) {
# code...
echo $user->username, '<br>';
}
}
and my DB.php has those functions
<?php
class DB {
private static $_instance = null;
private $_pdo,
$_query,
$_error=false,
$_results,
$_count=0;
private function __construct(){
try{
$this->_pdo = new PDO('mysql:host=' . Config::get('mysql/host') . ';dbname=' . Config::get('mysql/db'), Config::get('mysql/username'), Config::get('mysql/password'));
}catch(PDOException $e){
die($e->getMessage());
}
}
public static function getInstance(){
if(!isset(self::$_instance)){
self::$_instance = new DB();
}
return self::$_instance;
}
public function query($sql, $params = array()) {
$this->_error = false;
if($this->_query = $this->_pdo->prepare($sql)){
$x = 1;
if(count($params)){
foreach ($params as $param) {
$this->_query->bindValue($x, $param);
$x++;
}
}
if($this->_query->execute()){
$this->_reults = $this->_query->fetchAll(PDO::FETCH_OBJ);
$this->_count = $this->_query->rowCount();
}else{
$this->_error = true;
}
}
return $this;
}
public function action($action, $table, $where = array()) {
if(count($where) === 3) {
$operators = array('=', '>', '<', '>=', '<=');
$field = $where[0];
$operator = $where[1];
$value = $where[2];
if(in_array($operator, $operators)){
$sql = "{$action} FROM {$table} WHERE {$field} {$operator} ?";
if(!$this->query($sql, array($value))->error()){
return $this;
}
}
}
return false;
}
public function get($table, $where) {
return $this->action('SELECT *', $table, $where);
}
public function delete($table, $where) {
return $this->action('DELETE *', $table, $where);
}
public function results() {
return $this->_results;
}
public function error() {
return $this->_error;
}
public function count() {
return $this->_count;
}
}
?>
Could you please tell me what possibly goes wrong here???
My database has already a table with the username kostas in the users table so it should returned the result corectly.
try different name for your variable
foreach ($user->results() as $u) {
//# code...
echo $u->username, '<br>';
}
foreach ($user->results() as $user) {
You are using the same variable twice here, could that be the problem?
You could rename one of the variables. Here I renamed the first $user to $userQuery, as I think this is clearer:
$userQuery = DB::getInstance()->get('users', array('username', '=', 'kostas'));
if(!$userQuery->count()) {
echo "No user";
}else {
foreach ($userQuery->results() as $user) {
# code...
echo $user->username, '<br>';
}
}
Or you can rename the variable in the foreach:
foreach ($user->results() as $usr) {

Categories