ugrás a tartalomhoz

Php5 vs mysql

C_hris · 2008. Jan. 6. (V), 20.23
Sziasztok!

Van egy mysql kezelő objektumom ami tökéletesen működött PHP 4 alatt, de az 5-ös verziónál nem minden lekérdezésnél működik.

A DBNumrows-nál és a DBFetchrow metódus hívásánál valamikor nem létezik a lekérdezés eredménye (supplied argument is not a valid MySQL result )

Mi okozhatja ezt a problémát már próbáltam a mysqli-t is hátha csak azzal működik a php5, de azzal se működik (Warning: mysqli_fetch_row() expects parameter 1 to be mysqli_result, boolean given in...)

Az biztos, hogy minden lekérdezés jó, mert kipróbáltam mysql kliensben.
  1. class DBObject{  
  2.   
  3.       var $dhost;  
  4.       var $duser;  
  5.       var $dpass;  
  6.       var $dname;  
  7.         
  8.       var $DBCon;  
  9.       var $query;  
  10.       var $rowcount;  
  11.       var $result;  
  12.       var $row;  
  13.         
  14.       var $MYSQL_I=false;  
  15.   
  16.       function DBObject()  
  17.                {  
  18.                global $dbhost;  
  19.                global $dbuser;  
  20.                global $dbpassword;  
  21.                global $dbname;  
  22.                  
  23.                $this->dhost= $dbhost;  
  24.                $this->duser= $dbuser;  
  25.                $this->dpass= $dbpassword;  
  26.                $this->dname= $dbname;  
  27.                }  
  28.   
  29.   
  30.       function GetRowCount()  
  31.                {  
  32.                return $this->rowcount;  
  33.                }  
  34.                  
  35.       function SetSQL($sql)  
  36.                {  
  37.                $this->query=$sql;  
  38.                }  
  39.   
  40.       function DBConnect()  
  41.           {  
  42.           if(!$this->MYSQL_I)  
  43.             {                         
  44.             $this->DBCon=mysql_connect($this->dhost, $this->duser, $this->dpass);         
  45.             mysql_select_db($this->dname,$this->DBCon);                 
  46.             }  
  47.           else   
  48.             {  
  49.             $this->DBCon=mysqli_connect($this->dhost, $this->duser, $this->dpass);  
  50.             mysqli_select_db($this->DBCon,$this->dname);    
  51.             }                   
  52.           }  
  53.   
  54.   
  55.       function DBDisconnect()  
  56.           {  
  57.           if(!$this->MYSQL_I)  
  58.             mysql_close($this->DBCon);  
  59.           else   
  60.             mysqli_close($this->DBCon);  
  61.           }  
  62.   
  63.       function DBQuery()  
  64.           {  
  65.            if(!$this->MYSQL_I)  
  66.             $this->result =mysql_query($this->query, $this->DBCon);  
  67.           else            
  68.             $this->result =mysqli_query($this->DBCon,$this->query);              
  69.                       
  70.           }  
  71.   
  72.       function DBNumrows()  
  73.           {           
  74.           if(!$this->MYSQL_I)  
  75.             $this->rowcount=mysql_num_rows($this->result);  
  76.           else   
  77.             $this->rowcount=mysqli_num_rows($this->result);  
  78.               
  79.           return $this->rowcount;  
  80.           }  
  81.   
  82.        function DBFetchrow()  
  83.            {  
  84.            if(!$this->MYSQL_I)  
  85.             $this->row = mysql_fetch_row($this->result);  
  86.            else   
  87.             $this->row = mysqli_fetch_row($this->result);  
  88.               
  89.            return $this->row;  
  90.            }  
  91.   
  92.        function DBFetcharray()  
  93.            {  
  94.            $this->row = array();  
  95.            if(!$this->MYSQL_I)  
  96.             $this->row = mysql_fetch_array($this->result);  
  97.            else   
  98.             $this->row = mysqli_fetch_array($this->result);  
  99.               
  100.            return $this->row;  
  101.            }  
  102.   
  103.   
  104.        function DBFetchobject()  
  105.            {  
  106.            if(!$this->MYSQL_I)  
  107.             $this->row = mysql_fetch_object($this->result);  
  108.            else   
  109.             $this->row = mysqli_fetch_object($this->result);  
  110.               
  111.            if($this->row) return $this->row;  
  112.            else return false;  
  113.            }  
  114.   
  115.        function DBFreeres()  
  116.            {  
  117.            if(!$this->MYSQL_I)  
  118.             $row = mysql_free_result($this->result);  
  119.            else   
  120.             $row = mysqli_free_result($this->result);  
  121.            }  
  122.   
  123.        }  
 
1

Naplózás, hibakezelés

zila · 2008. Jan. 6. (V), 23.04
Ha érvénytelen resultset-et kapsz, akkor az úgy van. Én úgy látnék neki a megoldának, hogy az sql-eket naplóznám (abban a formában ahogy a db felé elmennek, behelyettesített értékekkel stb.), elképzelhető, hogy valamelyik paraméter rontja el a query-t (pl nem escape-lsz egy inputot és idézőjel/aposztróf kerül bele). Meg úgy általában nem nagyon látok hibakezelést a kódodban, az sem ártana bele...
2

...

C_hris · 2008. Jan. 6. (V), 23.48
De PHP 4 alatt miért működik rendesen, elvileg ugyanúgy kellene kezelnie a függvényeket nem?
5

Irreleváns

zila · 2008. Jan. 7. (H), 10.17
Felesleges ezen lovagolni, hogy php4 alatt ment. Most nem megy, ki kell deríteni az okát. (lehet, hogy php4 alatt be volt kapcsolva pl. a magic_quotes_gpc php5 alatt meg nem, te pedig nem foglalkoztál a felhasználótól jövő adatok escape-elésével)
3

...

C_hris · 2008. Jan. 7. (H), 10.09
Arra sikerült rájönnöm, hogy ott van gond ahol a lekérdezésben egy stringet keresek
pl. ... where valami='szöveg'
Létezik ilyen, hogy ezt nem képes kezelni az 5-ös php?
4

Nem létezik

zila · 2008. Jan. 7. (H), 10.14
Komolyan azt hiszed, hogy php5-ben nem lehet ilyen lekérdezést használni?

Konkrét példát kellene beírnod ide nem csak valami dummy-t. És természetesen a lekérdezés után egy mysql_error() hívással az sql hibaüzenetét is meg kellene nézni (ha false-t ad vissza a query)
6

mysql error

C_hris · 2008. Jan. 7. (H), 10.21
a mysql error ezt dobja vissza: Illegal mix of collations (latin2_general_ci,IMPLICIT) and (latin1_swedish_ci,COERCIBLE) for operation '<>'
7

Sikerült

C_hris · 2008. Jan. 7. (H), 10.27
mysql_query("set names 'latin2'",$this->DBCon); megoldotta a problémát.
Köszi mindenkinek.
8

Na végre

zila · 2008. Jan. 7. (H), 10.28
Na végre eljutottunk valami konkrétumig :)
Én még nem találkoztam ezzel a hibával (igaz mysql-lel nem dolgozom már vagy 2 éve...) így csak a google-t tudom javasolni:

http://www.google.com/search?client=safari&rls=en-us&q=mysql+Illegal+mix+of+collations&ie=UTF-8&oe=UTF-8

Mondjuk ezzel kellett volna kezdened és akkor nem futunk felesleges köröket (persze a mysql verzióját még mindig nem árultad el)