MySQL errore con mysqli_fetch_assoc e mysqli_fetch_array

86 views
Skip to first unread message

Massimiliano Marini

unread,
Aug 5, 2009, 11:40:29 AM8/5/09
to zb-p...@googlegroups.com
Ciao all,

quando richiamo i metodi in oggetto dalla mia classe ottengo questo errore:

PHP Warning: mysqli_fetch_assoc() expects parameter 1 to be
mysqli_result, boolean given

La classe la posto in fondo.

Esempio di come richiamo i due metodi:

$sql = "select count(*) as count FROM tabella1";
$rst = $my->query($sql);

$row = $my->fetchAssoc($rst);

$count = $row['count'];

in error.log mi ritrovo l'errore che ho postato sopra.
Premetto che latito da un po' su MySQL e la classe che ho scritto
sotto è una piccola trasposizione di quella che uso per PostgreSQL e
su cui non ho problemi.

Naturalmente ho letto le istruzioni su php.net e sembra che ho scritto
tutto correttamente, ma di fatto non va, sapete dirmi perché?

class MySql {

var $host = "localhost";
var $user = "user";
var $pass = "pass";
var $dbname = "dbname";
var $link;

var $qid;

function connect(){
$this->link =
mysqli_connect("$this->host","$this->user","$this->pass") or die
('Errore nella connessione al database.');

mysqli_select_db($this->link,$this->dbname) or die("Errore nella
connessione al db.");
}

function disconnect() {
mysqli_close($this->link);
}

function query($sql) {
return mysqli_query($this->link,$sql) or die (mysqli_error($this->link));
}

function fetchAssoc($result) {
return mysqli_fetch_assoc($result);
}

function fetchArray($result) {
return mysqli_fetch_array($result);
}

function freeResult($result) {
mysqli_free_result($result);
}
}

--
Massimiliano Marini - http://www.linuxtime.it/massimilianomarini/
"It's easier to invent the future than to predict it." -- Alan Kay

Cristiano Verondini

unread,
Aug 5, 2009, 11:46:50 AM8/5/09
to zb-p...@googlegroups.com

Parrebbe che la query fallisca in qualche modo, restituendo FALSE.

On 05/ago/09, at 17:40, Massimiliano Marini wrote:

> $rst = $my->query($sql);


--
Cristiano Verondini
http://verondini.it/ - ICQ: 114 190

Massimiliano Marini

unread,
Aug 5, 2009, 11:53:52 AM8/5/09
to zb-p...@googlegroups.com
Ciao Cris,

>        Parrebbe che la query fallisca in qualche modo, restituendo FALSE.

Il problema sorge appunto con la classe, ho provato a scrivere il
codice in maniera procedurale e non ho avuto problemi.

La stessa classe la uso per l'insert e va tutto a buon fine.

Nel momento in cui chiamo fetch_assoc e fetch_array mi va in errore.

Mi sono dimenticato di aggiungere: il client è su Win, Apache2 e php
5.2.10 server MySQL 5.1 su server FreeBSD, tante le volte è qualche
settaggio del PHP? Non ne ho la più pallida idea, non posso lavorare
in maniera procedurale con tutti i file, è impensabile! :)

Cristiano Verondini

unread,
Aug 5, 2009, 11:57:18 AM8/5/09
to zb-p...@googlegroups.com

Ho cancellato il messaggio originale, quindi non ho sott'occhio la
classe ...

Massimiliano Marini

unread,
Aug 5, 2009, 12:01:23 PM8/5/09
to zb-p...@googlegroups.com
Eccoti servito :)

class MySql {

var $host = "localhost";
var $user = "user";
var $pass = "pass";
var $dbname = "dbname";
var $link;

function connect(){


$this->link =
mysqli_connect("$this->host","$this->user","$this->pass") or die
('Errore nella connessione al database.');

mysqli_select_db($this->link,$this->dbname) or die("Errore nella
connessione al db.");
}

function disconnect() {
mysqli_close($this->link);
}

function query($sql) {
return mysqli_query($this->link,$sql) or die
(mysqli_error($this->link));
}

function fetchAssoc($result) {
return mysqli_fetch_assoc($result);
}

function fetchArray($result) {
return mysqli_fetch_array($result);
}

function freeResult($result) {
mysqli_free_result($result);
}
}

--

Cristiano Verondini

unread,
Aug 5, 2009, 12:04:43 PM8/5/09
to zb-p...@googlegroups.com

Ad occhio non vedo nulla di strano. Sei sicuro che la query SQL sia
corretta?

Massimiliano Marini

unread,
Aug 5, 2009, 1:16:51 PM8/5/09
to zb-p...@googlegroups.com
>        Ad occhio non vedo nulla di strano. Sei sicuro che la query SQL sia
> corretta?

Si Cris, le query sono corrette, se le eseguo nella shell di MySQL
funzionano correttamente, mentre se le chiamo dal php le SELECT vanno
in "errore" o meglio, non restituiscono un valore valido, per questo
si genera l'errore.

Non so proprio cosa pensare, suggerimenti?

Francesco Reitano

unread,
Aug 6, 2009, 3:08:20 AM8/6/09
to zb-p...@googlegroups.com
Massimiliano Marini ha scritto:

La butto lì giusto per controllare, se non usi mysqli cosa succede? ti
da errore?

Marco Messini

unread,
Aug 6, 2009, 3:50:53 AM8/6/09
to zb-p...@googlegroups.com
Il 05/08/2009 17:40, Massimiliano Marini ha scritto:
> Ciao all,
>
> quando richiamo i metodi in oggetto dalla mia classe ottengo questo errore:
>
> PHP Warning: mysqli_fetch_assoc() expects parameter 1 to be
> mysqli_result, boolean given
>
> La classe la posto in fondo.
>
>
>

http://www.google.it/search?source=ig&hl=it&rlz=&=&q=mysqli_fetch_assoc+expects+parameter+1+to+be+mysqli_result&meta=lr%3D&aq=1&oq=mysqli_fetch_assoc

il primo risultato

Marco
--
AVVERTENZE AI SENSI DEL DLGS 196/2003
http://www.emmeti.it/Contact/privacy.it.html

Massimiliano Marini

unread,
Aug 6, 2009, 4:00:27 AM8/6/09
to zb-p...@googlegroups.com
Ciao Francesco,

> La butto lì giusto per controllare, se non usi mysqli cosa succede? ti
> da errore?

che ottengo sempre lo stesso errore, ma con una dicitura leggermente diversa.

Massimiliano Marini

unread,
Aug 6, 2009, 5:19:19 AM8/6/09
to zb-p...@googlegroups.com
Ciao Marco,

Non è quello che fa al caso mio, purtroppo,

Come ha scritto Cristiano, il problema effettivamente è
nell'esecuzione della query, che (a come sembra stiano le cose) non
ritorna un resultset valido da dare in pasto alla mysql_fetch_assoc e
alla mysql_fetch_array.

Ancora non ne vengo a capo.

Matteo Beccati

unread,
Aug 6, 2009, 6:19:59 AM8/6/09
to zb-p...@googlegroups.com
Massimiliano Marini ha scritto:

> Ciao Marco,
>
>> http://www.google.it/search?source=ig&hl=it&rlz=&=&q=mysqli_fetch_assoc+expects+parameter+1+to+be+mysqli_result&meta=lr%3D&aq=1&oq=mysqli_fetch_assoc
>>
>> il primo risultato
>
> Non è quello che fa al caso mio, purtroppo,
>
> Come ha scritto Cristiano, il problema effettivamente è
> nell'esecuzione della query, che (a come sembra stiano le cose) non
> ritorna un resultset valido da dare in pasto alla mysql_fetch_assoc e
> alla mysql_fetch_array.
>
> Ancora non ne vengo a capo.

provato un echo mysqli_error() subito dopo la query?


Cheers
--
Matteo Beccati

OpenX - http://www.openx.org

Massimiliano Marini

unread,
Aug 6, 2009, 6:52:43 AM8/6/09
to zb-p...@googlegroups.com
Ciao Matteo,

> provato un echo mysqli_error() subito dopo la query?

si, e non stampa nulla, sul file error_log ho sempre le stesse due scritte:

PHP Warning: mysql_free_result(): supplied argument is not a valid
MySQL result resource
PHP Warning: mysql_fetch_array(): supplied argument is not a valid
MySQL result resource

con PostgreSQL c'ho messo un minuto per fare la stessa cosa, ma
purtroppo devo usare MySQL :(

Non ne vengo a capo.

Massimiliano Marini

unread,
Aug 6, 2009, 7:24:30 AM8/6/09
to zb-p...@googlegroups.com
> provato un echo mysqli_error() subito dopo la query?

Nella tabella ho 10 record di prova, se dalla shell di MySQL lancio la
query ottengo il valore corretto, mentre dal PHP se stampo il valore
del result ottengo: bool(true)

$sql = 'select count(*) as count from pippo';
$rst = $my->query($sql);
var_dump($rst);

var_dump($rst); -> bool(true) ???

Ormai penso di essere ai confini della realtà.

Matteo Beccati

unread,
Aug 6, 2009, 9:41:53 AM8/6/09
to zb-p...@googlegroups.com
Massimiliano Marini ha scritto:

>> provato un echo mysqli_error() subito dopo la query?
>
> Nella tabella ho 10 record di prova, se dalla shell di MySQL lancio la
> query ottengo il valore corretto, mentre dal PHP se stampo il valore
> del result ottengo: bool(true)
>
> $sql = 'select count(*) as count from pippo';
> $rst = $my->query($sql);
> var_dump($rst);
>
> var_dump($rst); -> bool(true) ???

Pare che l'estensione mysqli in quel caso ritenga che la query sia una
DDL e ritorna esito positivo. Vedi: http://it2.php.net/mysqli_query

"Returns TRUE on success or FALSE on failure. For SELECT, SHOW, DESCRIBE
or EXPLAIN mysqli_query() will return a result object. "

Prova a cercare tra i bug e/o ad aggiornare PHP.

Massimiliano Marini

unread,
Aug 6, 2009, 10:16:21 AM8/6/09
to zb-p...@googlegroups.com
Ciao Matteo,

poi sono ritornato a mysql_ invece di mysqli_ ma sono sicuro che ora
funzioni lo stesso.

Ho appena risolto rimuovendo: or die (mysql_error($this->link));

questa è l'istruzione funzionante all'interno del metodo query().
return mysql_query($sql,$this->link);

Non voglio sapere nemmeno il perché di questa cosa, se ha senso o
meno, c'ho perso 3 giorni sopra e mi è venuto un forte esaurimento.

Grazie comunque per l'aiuto sia a te che agli altri che hanno
partecipato, ad Agosto una cosa del genere non ha prezzo :)

Matteo Beccati

unread,
Aug 6, 2009, 10:26:36 AM8/6/09
to zb-p...@googlegroups.com
Ciao,

> Ho appena risolto rimuovendo: or die (mysql_error($this->link));

ok, sono cieco... presto spiegato:

var_dump("foo" or die("bar")); // bool(true)

"or" č come "||" solo con una precedenza piů bassa. Tu ritornavi il
risultato di un operazione di OR booleano, che ovviamente ritorna
true/false.

Massimiliano Marini

unread,
Aug 6, 2009, 10:38:00 AM8/6/09
to zb-p...@googlegroups.com
> var_dump("foo" or die("bar")); // bool(true)
>
> "or" è come "||" solo con una precedenza più bassa. Tu ritornavi il

> risultato di un operazione di OR booleano, che ovviamente ritorna
> true/false.

Grazie per la spiegazione e illuminazione, una cosa è certa, non me la
scorderò tanto facilmente. :)

Matteo Beccati

unread,
Aug 6, 2009, 11:15:33 AM8/6/09
to zb-p...@googlegroups.com
Massimiliano Marini ha scritto:

>> var_dump("foo" or die("bar")); // bool(true)
>>
>> "or" č come "||" solo con una precedenza piů bassa. Tu ritornavi il

>> risultato di un operazione di OR booleano, che ovviamente ritorna
>> true/false.
>
> Grazie per la spiegazione e illuminazione, una cosa č certa, non me la
> scorderň tanto facilmente. :)

Figurati. Giusto per non creare confusione:

$res = mysql_query() or die();
return $res;

sarebbe andato bene. E' usarlo direttamente nel return che non č
consigliabile ;)

Reply all
Reply to author
Forward
0 new messages