Eroare: Call to a member function num_rows() on boolean

Discutii despre script-uri si coduri PHP-MySQL, precum si lucru cu XML in PHP.
cadou
Mesaje: 321

Eroare: Call to a member function num_rows() on boolean

Am intr-un fisier cateva linii de cod care primesc eroare:

Cod: Selectaţi tot

Fatal error: Call to a member function num_rows() on boolean in  cale_fisier on line 115
In codul php:

Cod: Selectaţi tot

    public function get_profile_info($uid_username)
    {
        if(empty($uid_username))
            return false;
        
        $sql = 'SELECT u.user_id,u.username,u.email,u.email_visibility,u.sex,u.main_image,u.birth_date,u.city_id,u.country_id,u.interest_id,u.zodiac,u.web_confirmed,u.description,u.vote_points,u.visits,
                    u.stickers,u.gifts,u.activity_points,u.bonus_points,u.gift_points,u.total_points,u.coins,u.comments,u.log_records,u.virtual_seif,u.blog_posts,  
                    u.webpage,u.facebook,u.hi5,u.relationship,u.education,u.registration_date,u.last_login,u.meta_data,
                    c.name AS country,ci.name AS city,intr.content AS interest 
                FROM '.TBL_USERS.' u '; 
        
        if(!is_numeric($uid_username))
        {
            $sql.= ' USE INDEX(username) ';
        }
        $sql.= ' INNER JOIN '.TBL_COUNTRIES.' c ON c.country_id=u.country_id
                INNER JOIN '.TBL_CITIES.' ci ON ci.city_id=u.city_id 
                INNER JOIN '.TBL_USER_INTERESTS.' intr ON intr.interest_id=u.interest_id  '; 
                
        if(is_numeric($uid_username) && $uid_username > 0)
        {
            $sql.=' WHERE u.user_id = ? AND u.status="active" LIMIT 1 ';
        }
        else
        {
            $sql.=' WHERE u.username = ? AND u.status="active" LIMIT 1 ';
        }
        $query = $this->db->query($sql,array($uid_username));
        return ($query->num_rows() > 0) ? $query->row() : FALSE ;
    }
    
Primesc eroare la linia 115, adica:

Cod: Selectaţi tot

return ($query->num_rows() > 0) ? $query->row() : FALSE ;
Tabela este incarcata, contine acele coloane ... nu am idee de ce afiseaza eroarea.

cata1241
Ei bine, eroarea spune totul.Cu alte cuvinte variabila $query tine o valoare booleana, desi acolo apelezi o metoda, ceea ce inseamna pe randul

Cod: Selectaţi tot

$query = $this->db->query($sql,array($uid_username));
se afla cu adevarat eroarea.Posibil ca interogarea SQL sa nu fie corecta.Folosesti PDO pentru interactionarea cu baza de date? Daca folosesti PDO, poti alege ca atunci cand ceva nu merge bine, PDO sa emita exceptii.

Cod: Selectaţi tot

try {
        $dbh = new PDO($dsn, $user, $password, array(PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION));
    } catch (PDOException $e) {
        echo 'Connection failed: ' . $e->getMessage();
        exit;
    }
Te poti inspira de aici.

MarPlo
S-ar putea sa fie ceva gresit in codul $sql si mysql returneaza eroare, din cauza asta variabila $query primeste valoarea False.
In astfel de cazuri eu aplic un:

Cod: Selectaţi tot

echo $sql;
- ca sa vad sirul SQL rezultat, copii sirul, inlocuiesc in sir inlocuitorii cu valoarea lor (in codul tau '?' cu $uid_username), apoi testez sirul in PhpMyAdmin.

Ca sa eviti afisarea erorii la acea linie, poti face asa:

Cod: Selectaţi tot

return ($query !==false && $query->num_rows() > 0) ? $query->row() : FALSE;

cadou
Cata, din ce am gasit, se pare ca se face conectarea la baza de date cu mysql

Cod: Selectaţi tot

	function db_connect()
	{
		if ($this->port != '')
		{
			$this->hostname .= ':'.$this->port;
		
		}

		return @mysql_connect($this->hostname, $this->username, $this->password, TRUE);

  

	}
Si am incercat sa fac conectarea la baza de date cu PDO, inlocuind acolo la return .... cu

Cod: Selectaţi tot

return new PDO($this->hostname, $this->username, $this->password);
Dar nu am reusit, ceva nu am scris bine ...

MarPlo
Conectarea la mysql cu pdo se face cu urmatoareea sintaxa:

Cod: Selectaţi tot

$conn = new PDO("mysql:host=$host; dbname=$name_db", $user, $pass);
vezi lectiile despre pdo din cursul php de pe site.

- Schimbarea scriptului de la mysql la pdo (sau mysqli) necesita modificari in tot codul unde se folosesc functii "mysql_".

Subiecte similare