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
On 05/ago/09, at 17:40, Massimiliano Marini wrote:
> $rst = $my->query($sql);
--
Cristiano Verondini
http://verondini.it/ - ICQ: 114 190
> 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! :)
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);
}
}
--
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?
La butto lì giusto per controllare, se non usi mysqli cosa succede? ti
da errore?
il primo risultato
Marco
--
AVVERTENZE AI SENSI DEL DLGS 196/2003
http://www.emmeti.it/Contact/privacy.it.html
> 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.
> 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
> 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.
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à.
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.
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 :)
> 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.
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 ;)