[php] php4 class werkt niet onder php5

Pagina: 1
Acties:

Onderwerpen


Verwijderd

Topicstarter
Om mysql te benaderen gebruik ik een zelfgemaakt mysql-object. Deze werkt prima onder php4. Echter de server waar ik mijn website host is overgegaan op php5 en dit levert problemen op:

Als ik de pagina probeer te openen krijg ik geen foutmeldingen, maar er wordt ook helemaal niks op het scherm uitgeprint. (De browser is een tijdje aan het laden en vervolgens houdt ie er na een tijdje mee op)

Waar ik zelf aan zat de te denken is dat het ligt aan de manier waarop de variabelen in het object zijn opgeslagen. Ik gebruik namelijk 'var' ipv een andere indentifier zoals 'private' die nu ook mogelijk zijn.

De fout treedt overigens pas op als ik het object aanmaak, NIET als ik de alleen class include.

Hopelijk heeft iemand hier een verklaring voor. Ik kon geen antwoorden vinden op het forum en op de php.net site.


Dit is de interface:
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
<?

class database {

// Database variables
 var $server_name;
 var $database_name;
 var $user_name;
 var $user_password;
 var $suppress_errors;

 // Database functions to implement
 function connect() { ; }
 function close() { ; }
 function error_string() { ; }
 function error_number() { ; }
 function execute_query($query) { ; }
 function select_database() { ; }
 function change_database() { ; }
 function fetch_row_array() { ; }
 function fetch_row_object() { ; }
 function fetch_num_rows() { ; }
 function fetch_last_id() { ; }
 function fetch_affected_rows() { ; }
 function insert_new_row() { ; }
 function update_row() { ; }
 function fetch_all_rows() { ; }
 function fetch_all_rows_limited() { ; }
 function fetch_value() { ; }
 function fetch_count() { ; } 

}
?>

  • stekkel
  • Registratie: Augustus 2001
  • Laatst online: 17-09 08:05
Zet eerst je error reporting maar eens op E_ALL en laat de errors maar eens zien (error reporting to screen)

  • NMe
  • Registratie: Februari 2004
  • Laatst online: 09-09 13:58

NMe

Quia Ego Sic Dico.

Ik heb ook een eigen databaseclass geschreven, waar ik ook var in gebruik ipv private en dergelijke. Die doet het in PHP5 nog prima, dus dat is het niet lijkt me.

Misschien is het handig als je de constructor laat zien? (Je hebt trouwens geen constructor erin staan, PHP wil toch een functie met dezelfde naam als de class zien als constructor?) En laat de aanroep ook eens zien, misschien doe je daar wat fout.

'E's fighting in there!' he stuttered, grabbing the captain's arm.
'All by himself?' said the captain.
'No, with everyone!' shouted Nobby, hopping from one foot to the other.


Verwijderd

Topicstarter
Ik heb de code er in eerste instantie niet bijgevoegd omdat het een hele lap tekst is.

Wat de errors betreft; ik heb zelf nog php4 en ik heb php5 nog niet aan de praat gekregen. Ik hoopte eigenlijk dat ik dit zo kon houden...

code:
1
2
3
4
5
6
7
8
<?
  include_once("database_mysql.php");
  include_once("config.php");
  include_once("functions.php");

  //pas als ik het onderstaande statement invoeg, wordt er niks meer weergegeven
         $mydb = new create_database($server, $database, $username, $password);
?>


dit is het bestand 'database_mysql.php'

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
<?

class database {

// Database variables
 var $server_name;
 var $database_name;
 var $user_name;
 var $user_password;
 var $suppress_errors;

 // Database functions to implement
 function connect() { ; }
 function close() { ; }
 function error_string() { ; }
 function error_number() { ; }
 function execute_query($query) { ; }
 function select_database() { ; }
 function change_database() { ; }
 function fetch_row_array() { ; }
 function fetch_row_object() { ; }
 function fetch_num_rows() { ; }
 function fetch_last_id() { ; }
 function fetch_affected_rows() { ; }
 function insert_new_row() { ; }
 function update_row() { ; }
 function fetch_all_rows() { ; }
 function fetch_all_rows_limited() { ; }
 function fetch_value() { ; }
 function fetch_count() { ; } 

 function check_connect() {
   if($this->connection == 0)
    $this->connect();
 }

 function print_error($error_string) {
  if(!$this->suppress_errors)
   //header("location: error.php?foutmelding=$error_string");
   print $error_string;
 }
}



// Mysql database implementation for the database_interface

class create_database extends database {
 var $connection;

 function create_database($server_name, $database_name, $user_name, $user_password) {

   $this->server_name = $server_name;
   $this->database_name = $database_name;
   $this->user_name = $user_name;
   $this->user_password = $user_password;

   $this->suppress_errors = 1;
   $result = $this->connect();
   $this->suppress_errors = 0;
   $this->connect();

 }

 function connect() {
   $this->connection = @mysql_connect($this->server_name, $this->user_name, $this->user_password);

     if($this->connection == 0)
      $this->print_error("Kan geen verbinding maken met de database.");

   $this->select_database($this->database_name);

   return $this->connection;
 }

function close() {
   $this->check_connect();
   
   mysql_close($this->connection);
}

function error_string() {
   return mysql_error();
 }

 function error_number() {
   return mysql_errno();
 }

 function execute_query($query) {
   $this->check_connect();

   $result = @mysql_query($query, $this->connection);

     if($result == 0)
      $this->print_error("Het ophalen van gegevens uit de database is mislukt.<br>Mysql error: (" . $this->error_string() . ").");

    return $result;
 }

 function select_database($db_name) {
   $this->check_connect();

   $result = @mysql_select_db($db_name);

     if(!$result)
      $this->print_error("Kan database (" . $db_name . ") niet selecteren. <br>Mysql error: (" . $this->error_string() . ").");
 }
 
 function change_database($db_name) {
   $this->check_connect();
   
    $result = @mysql_select_db($db_name, $this->connection);

     if(!$result)
      $this->print_error("Kan niet naar database (" . $db_name . ") switchen. <br>Mysql error: (" . $this->error_string() . ").");
 }  

 function fetch_row_array($query_result) {
   $this->check_connect();

   if($query_result == 0)
     $this->print_error("Kan de aanvraag niet goed uitvoeren. <br> Mysql error: (" . $this->error_string() . ").");

   return (@mysql_fetch_array($query_result, MYSQL_ASSOC));
 }

 function fetch_row_object($query_result) {
   $this->check_connect();

   if($query_result == 0)
     $this->print_error("Kan de aanvraag niet goed uitvoeren. <br> Mysql error: (" . $this->error_string() . ").");

   return (@mysql_fetch_object($query_result));
 }

 function fetch_num_rows($query_result) {
   $this->check_connect();

   if($query_result == 0)
     $this->print_error("Kan de aanvraag niet goed uitvoeren. <br> Mysql error: (" . $this->error_string() . ").");

   return (@mysql_num_rows($query_result));
 }

 function fetch_last_id() {
  $this->check_connect();
   return mysql_insert_id();
 }

 function fetch_affected_rows() {
  $this->check_connect();
   return mysql_affected_rows();
 }

 function fetch_all_rows ( $query_result ) {
   $ret = array ();

      $res = $this->execute_query ( $query_result );
      while ( $row = $this->fetch_row_array ( $res ) ) {
         $ret [] = $row;
      }

    return $ret;
 }

 function fetch_value ( $query ) {
   $result = $this->execute_query($query);
   return $this->fetch_row_array($result);
 }

 function fetch_count ( $query ) {
  $result = $this->execute_query($query);
  return $this->fetch_num_rows($result);
 }
}

?>

[ Voor 9% gewijzigd door Verwijderd op 12-08-2004 18:15 ]


  • Grijze Vos
  • Registratie: December 2002
  • Laatst online: 28-02 22:17
NMe84 schreef op 12 augustus 2004 @ 13:14:
(Je hebt trouwens geen constructor erin staan, PHP wil toch een functie met dezelfde naam als de class zien als constructor?) En laat de aanroep ook eens zien, misschien doe je daar wat fout.
In php5 gebruik je de __construct() functie, maar bij gebrek aan die zoekt ie ook nog even de php4-style constructor voor je.

Op zoek naar een nieuwe collega, .NET webdev, voornamelijk productontwikkeling. DM voor meer info


Verwijderd

Topicstarter
Maar dan zou het bovenstaande script het toch gewoon hetzelfde moeten doen als met php4. Ik neem aan dat er ergens anders een essentieel verschil zit.....?

  • TweakBoy
  • Registratie: Augustus 2001
  • Laatst online: 14-09 22:16

TweakBoy

---

Verwijderd schreef op 12 augustus 2004 @ 20:18:
Maar dan zou het bovenstaande script het toch gewoon hetzelfde moeten doen als met php4. Ik neem aan dat er ergens anders een essentieel verschil zit.....?
ik heb zelf ook een tijd terug php4 ingeleverd voor php5.

wat standaard niet bij PHP5 in de libraries staat is MySQL. Deze hebben ze eruit gelaten vanwege eventuele toekomstige licentiebepalingen... mocht mysql betaald worden.

Deze werd vervangen door SQLite.

Misschien heeft je hoster die mysql.so module niet aangezet, deze staat bij een standard install niet aan!

---


Verwijderd

Topicstarter
Er draait ook nog een forum (phpbb2) en die werkt zonder problemen. Dus dat is het niet...

Jullie kunnen even spieken: www.gswv-surface.nl/test/phpinfo.php

Misschien dat jullie daar iets mee kunnen.

Bedankt voor de reacties tot dusver

  • NMe
  • Registratie: Februari 2004
  • Laatst online: 09-09 13:58

NMe

Quia Ego Sic Dico.

Verwijderd schreef op 12 augustus 2004 @ 20:18:
Maar dan zou het bovenstaande script het toch gewoon hetzelfde moeten doen als met php4. Ik neem aan dat er ergens anders een essentieel verschil zit.....?
Heb je nou al die constructor netjes toegevoegd? Dus of een functie __construct() als constructor, of een functie met dezelfde naam als je class, dus hier database()... Want volgens mij wordt je class gewoon niet geinitialiseerd, en zonder "legale" constructor kan dit ook niet werken in PHP4...

'E's fighting in there!' he stuttered, grabbing the captain's arm.
'All by himself?' said the captain.
'No, with everyone!' shouted Nobby, hopping from one foot to the other.


Verwijderd

Topicstarter
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
class create_database extends database {
 var $connection;

 function create_database($server_name, $database_name, $user_name, $user_password) {

   $this->server_name = $server_name;
   $this->database_name = $database_name;
   $this->user_name = $user_name;
   $this->user_password = $user_password;

   $this->suppress_errors = 1;
   $result = $this->connect();
   $this->suppress_errors = 0;
   $this->connect();

 }
...


Dit is de constructor, ´database´ is eigenlijk een interface.

En geloof me, het werkt echt onder php4. Het stomme is dat ik mijn hele programma al werkend heb op pijn eigen server...

  • NMe
  • Registratie: Februari 2004
  • Laatst online: 09-09 13:58

NMe

Quia Ego Sic Dico.

Sorry, overheen gelezen. :) Werkt het wel als je die functie uit de create_database class declareert in de database class? Ben bang van niet, maar je kan het allicht proberen. :)

'E's fighting in there!' he stuttered, grabbing the captain's arm.
'All by himself?' said the captain.
'No, with everyone!' shouted Nobby, hopping from one foot to the other.


Acties:
  • 0 Henk 'm!

  • eborn
  • Registratie: April 2000
  • Laatst online: 18-09 19:03
Verwijderd schreef op 12 augustus 2004 @ 23:14:
En geloof me, het werkt echt onder php4. Het stomme is dat ik mijn hele programma al werkend heb op pijn eigen server...
Zoals eerder al is aangedragen: zet error_reporting even op E_ALL. Je ziet dan vanzelf wat er mis gaat :)

Acties:
  • 0 Henk 'm!

Verwijderd

TweakBoy schreef op 12 augustus 2004 @ 20:25:
ik heb zelf ook een tijd terug php4 ingeleverd voor php5.

wat standaard niet bij PHP5 in de libraries staat is MySQL. Deze hebben ze eruit gelaten vanwege eventuele toekomstige licentiebepalingen... mocht mysql betaald worden.
nee hoor, je moet alleen libmysql naar je windows map kopieëren en dan werkt het ;)

Acties:
  • 0 Henk 'm!

  • Bosmonster
  • Registratie: Juni 2001
  • Laatst online: 18-09 16:28

Bosmonster

*zucht*

Verwijderd schreef op 13 augustus 2004 @ 10:28:
[...]


nee hoor, je moet alleen libmysql naar je windows map kopieëren en dan werkt het ;)
En hoeveel mensen draaien PHP onder Windows in een productie omgeving?

Acties:
  • 0 Henk 'm!

  • Rostvertol-Mil
  • Registratie: Januari 2002
  • Laatst online: 15:42
Bosmonster schreef op 13 augustus 2004 @ 10:37:
[...]


En hoeveel mensen draaien PHP onder Windows in een productie omgeving?
Ik :P

Volgens mij moet de ts idd nog een keer kijken of er wel mysql support is.

dot.blaat


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Volgens mij moet de ts idd nog een keer kijken of er wel mysql support is.
Misschien moet ik (ts) nog even mijn probleem specificeren. Ik heb een class die goed werkt onder php4.

Onder de server die mijn website host zit echter php5 die blijkbaar problemen heeft met deze class. Mysql wordt ondersteund ( www.gswv-surface.nl/test/phpinfo.php ).

Ik hoopte dat iemand mij kon vertellen of er essentiele veranderingen in php5 zijn waardoor mijn class niet werkt. Ik hoopte dat het niet nodig zou zijn om php5 op mijn eigen server installeren.

Dus als iemand nog een ingeving heeft...

Acties:
  • 0 Henk 'm!

  • Ritch
  • Registratie: December 1999
  • Laatst online: 19-09 15:46
eborn schreef op 13 augustus 2004 @ 10:20:
[...]
Zoals eerder al is aangedragen: zet error_reporting even op E_ALL. Je ziet dan vanzelf wat er mis gaat :)
*kuch* dat nou al eens gedaan??
Heb je leesrechten op de apache log? Daar wil ook nog wel eens wat in staan, bijv als je apache process crasht (dan krijg je idd geen ouput en duurt het lang).
Ow zie dat het op IIS :X draait, dat heeft ook vast wel logging?? :)

btw, je eigen server is ook Windows/IIS?

[ Voor 13% gewijzigd door Ritch op 13-08-2004 17:55 ]


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
ik kan de instellingen op die server niet veranderen... :( En ik heb zelf geen php5 draaien.

Ik draai php onder apache op windows xp. (Het is gewoon een testserver)

Acties:
  • 0 Henk 'm!

  • crisp
  • Registratie: Februari 2000
  • Laatst online: 15:29

crisp

Devver

Pixelated

offtopic, maar ik snap niet dat hosters al een maand na het uitkomen van de release versie van PHP5 overgaan; ik zou toch zeker eerst de kat uit de boom kijken en het voorlopig houden bij de 4.3 range die ook nog doorontwikkeld wordt, en versie 5 hooguit als experimentele service aanbieden.
Ik weet nog dat ik een jaar geleden hemel en aarde heb moeten bewegen bij een hoster om PHP 4.1.2 eens te upgraden (4.1.2 is erg buggy mbt sessies).

Intentionally left blank


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
(reactie offtopic; ze hebben me ook niet laten weten dat een upgrade hebben gedaan, das inderdaad niet zo netjes )

Ik heb nu op onderstaande manier de error reporting aangezet, maar ik krijg nog steeds een leeg scherm zonder enige error.... (Dit is overigens een include file, ik heb een andere bestand wat de code uitprint, maar in dit bestand zit de error nl bij de aanroep van de constructor)

code:
1
2
3
4
5
6
7
8
9
10
11
<?
  //onderstaande regel heb ik toegevoegd
  error_reporting(E_ALL | E_STRICT);  

  include_once("database_mysql.php");
  include_once("config.php");
  include_once("functions.php");


         $mydb = new create_database($server, $database, $username, $password);
?>

Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
te vroeg conclusies getrokken...

Ik krijg nu idd wel een reeks foutmeldingen, ik ga het uitzoeken

bedankt voor jullie hulp

Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
ik heb de fout gevonden denk ik...

Ik heb gezocht op de errors die ik vond via google en toen liep ik tegen dit handige bestand aan:
http://www.derickrethans.nl/files/breaking.pdf

hierin staan handige weetjes als je van php4 naar php5

Dus bedankt voor jullie hulp ik kom er nu verder wel uit.

Acties:
  • 0 Henk 'm!

  • Ritch
  • Registratie: December 1999
  • Laatst online: 19-09 15:46
Vertel dan meteen ff het probleem en de oplossing, hebben wij er misschien ook nog wat aan :)

Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Ik heb het nog niet (helemaal) opgelost, maar een van de dingen die niet werkte was zoiets als dit

code:
1
2
3
4
5
6
7
8
9
class db
{
    function print_query(){;}
}

class database extends db
{
   function print_query($query){;}
}


Dit mag dus niet in php5, print_query moet in de superclass hetzelfde aantal argumenten hebben. Dit hoefte in php4 niet.

Deze dingen staan ook in het bestand waar ik in de vorige post naar gelinkt heb
Pagina: 1