[PHP] OOP variabelen

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

  • Deviruchi
  • Registratie: December 2006
  • Laatst online: 20-09 21:58
Ik ben op dit moment met een project bezig en die ik wil gaan maken met behulp van OOP.
Nu ben ik eerst wat gaan testen, en nu ben ik er na 2 uur nog niet achter wat precies het probleem is, ik zal eerst even de source code geven:

PHP:
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
<?php

class Test {

    var $pMySQLConnection = false;
    var $sQueryResult = false;

    function connectToDatabase( $sUsername = "xxx", $sHost = "localhost", $sPassword = "xxx", $sDatabaseName = "xxx" ) {

        // Check if there's already a connection
        if ( $pMySQLConnection === false ){

            // Connect with the server and create a pointer to use in queries.
            $this->pMySQLConnection = mysql_connect( $sHost, $sUsername, $sPassword )
            or die( "Er kon geen verbinding gemaakt worden met de MySQL Database, error: " . mysql_error() );

            // Select the database with the pointer.
            mysql_select_db( $sDatabaseName, $this->pMySQLConnection )
            or die( "De database kon niet geselecteerd worden, error: " . mysql_error() );

            // Return the pointer
            return $this->pMySQLConnection;

        } else {

            // Connection with database is already established, return the pointer
            return $this->pMySQLConnection;

        }
    }
}

class Test2 extends Test {
/*
    var $pMySQLConnection = false;*/

    function doQuery( $sQuery, $bDataIsSecure = false ) {

        // Check if a connection is established.
        if ( $this->pMySQLConnection === false ) {

        // No Connection established, so establish the connection.
        Test::connectToDatabase();

        }
/*
        $this->pMySQLConnection = connectToDatabase;*/

        // Check if data is secure or not. default is false.
        if ( $bDataIsSecure === false ){

            // Secure all data again MySQL Injection.
            mysql_real_escape_string( $sQuery, $this->pMySQLConnection );

        }

        // Query is safe, execute it and return output to the class.
        $this->sQueryResult = mysql_query( $sQuery, $this->pMySQLConnection )
        or die( "De Query die uitgevoerd werd is mislukt, error: " . mysql_error() );

        return $this->sQueryResult;
    }
}

$oTest = new Test2;

//$oTest->connectToDatabase();
$query = $oTest->doQuery("SELECT voornaam FROM gebruikers");

$sResult = mysql_fetch_array($query);

print_r($sResult);

?>


Als ik dit uitvoer, krijg ik 2 errors, namelijk:
code:
1
2
3
4
Warning: mysql_real_escape_string() expects parameter 2 to be resource, boolean given in /home/domains/hierden.com/hierden/www/test.php on line 53

Warning: mysql_query(): supplied argument is not a valid MySQL-Link resource in /home/domains/hierden.com/hierden/www/test.php on line 58
De Query die uitgevoerd werd is mislukt, error:


Nu ben ik bezig gegaan met de eerste warning, blijkbaar maakt hij geen verbinding, en blijft $pMySQLConnection op false staan, ik heb al meerdere dingen geprobeerd zoals je in de comments ziet, maar geen van deze oplossing werken. Is het mogelijk om een variabele uit een andere class rechtstreeks aan te roepen? net zoals dit bij je eigen class kan $this->pMySQLConnection, want volgens mij ligt hier het probleem.

Ik hoop dat jullie me iets verder op weg kunnen helpen, ik verwacht niet dat jullie mijn code gaan debuggen of wat dan ook, maar stuur me dan alsjeblieft op weg.

EDIT: Misschien handig om te vermelden; ik gebruik PHP 4, dus ik kan geen constructs en dergelijke gebruiken.

Acties:
  • 0 Henk 'm!

  • Zyppora
  • Registratie: December 2005
  • Laatst online: 12-09 10:59

Zyppora

155/50 Warlock

Op lijn 43 roep je de connectToDatabase() functie statisch aan (en dat issie niet). Als het goed is krijgt Test2 deze functie overigens gewoon inherited, dus kun je this->connectToDatabase() gebruiken.

[ Voor 25% gewijzigd door Zyppora op 09-03-2007 11:01 ]

Phenom II X4 945 \\ 8GB DDR3 \\ Crosshair IV Formula \\ R9 290


Acties:
  • 0 Henk 'm!

  • Deviruchi
  • Registratie: December 2006
  • Laatst online: 20-09 21:58
Zyppora schreef op vrijdag 09 maart 2007 @ 11:00:
Op lijn 43 roep je de connectToDatabase() functie statisch aan (en dat issie niet). Als het goed is krijgt Test2 deze functie overigens gewoon inherited, dus kun je this->connectToDatabase() gebruiken.
Dit levert precies dezelfde foutmelding op, als ik zelf voordat ik de Query uitvoer, connectie maak met de database, dus:

PHP:
1
2
3
4
5
6
<?php
...
$oTest->connectToDatabase();
$query = $oTest->doQuery("SELECT voornaam FROM gebruikers");
...
?>


Dan krijg ik nog steeds dezelfde foutmelding. Ik denk dat dit komt omdat ik het in de var $pMySQLConnection op wil slaan, maar deze staat in Test, en ik roep de functie vanuit Test2 aan, dus probeert hij het op te slaan in $pMySQLConnection in Test2, maar die bestaat dus niet.

Toch bedankt voor je reactie, ik probeer zelf ook nog door te puzzelen.

Acties:
  • 0 Henk 'm!

  • Wolf87
  • Registratie: Juli 2004
  • Laatst online: 17:21
je variabele $this->pMySQLConnection is geen mysql resource maar een boolean, daar gaat het mis.

Acties:
  • 0 Henk 'm!

  • Janoz
  • Registratie: Oktober 2000
  • Laatst online: 02:21

Janoz

Moderator Devschuur®

!litemod

Sowieso zul je de connect niet statisch aan moeten roepen (dus zonder de::). Los van je huidige probleem zie ik ook nog een andere. De manier waarop je mysql_escape gebruikt is niet juist. Op deze manier kun je geen enkele query goed uitvoeren zodra er een varchar in zit. Deze functie is bedoeld voor waarden te escapen voordat je ze in je query opneemt, en niet om over je hele query heen te gooien.

Verder heb ik even de vrijheid genomen om je startpost iets aan te passen aangezien je je echte inloggegevens er nog in had staan.

Ken Thompson's famous line from V6 UNIX is equaly applicable to this post:
'You are not expected to understand this'


Acties:
  • 0 Henk 'm!

  • IntToStr
  • Registratie: December 2003
  • Laatst online: 19:49
Als ik me niet vergis zit de fout in regel 11:
PHP:
1
if ( $pMySQLConnection === false ){

moet zijn:
PHP:
1
if ( $this->pMySQLConnection ){ //do something } else { //make connection }

Je komt altijd in de else terecht waardoor er altijd false als resultaat volgt.

Edit: Zo te zien was ik net te laat :9

[ Voor 15% gewijzigd door IntToStr op 09-03-2007 11:14 . Reden: Spuit 11 en zo... ]


Acties:
  • 0 Henk 'm!

  • FragFrog
  • Registratie: September 2001
  • Laatst online: 09:34
Een tip: gooi niet zomaar je username etc in de argumentlijst. Sowieso beetje slordig dat je je wachtwoord nu op GoT hebt staan, om dat soort situaties te voorkomen gebruik ik voor m'n eigen databaseclass een simpele extensie zodat ik simpel dezefde class kan gebruiken in al m'n projecten en alleen de extensie hoef te schrijven:
PHP:
1
2
3
4
5
6
      class yourDbase extends Dbase {
        $this -> sql_server = 127.0.0.1;
        $this -> sql_user   = username;
        $this -> sql_pass   = password;
        $this -> sql_dbname = database_name;
      }



//edit
Zucht, ik ben traag.. :'(

[ Voor 12% gewijzigd door FragFrog op 09-03-2007 12:02 ]

[ Site ] [ twitch ] [ jijbuis ]


Acties:
  • 0 Henk 'm!

  • Deviruchi
  • Registratie: December 2006
  • Laatst online: 20-09 21:58
Wolf87 schreef op vrijdag 09 maart 2007 @ 11:09:
je variabele $this->pMySQLConnection is geen mysql resource maar een boolean, daar gaat het mis.
Klopt, omdat hij op false blijft staan. Opzich heeeeel logisch, omdat ik $pMySQLConnection had staan ipv $this->pMySQLConnection, hele simpele fout, maar had er toch overheen gekeken. Dus mijn dank aan IntToStr voor het opmerken hiervan.

Ook wil ik even mijn excuses aanbieden voor het neerzetten van mijn info, het was trouwens alleen maar de pass van mijn test server, dus echt erg was het niet, maar het is inderdaad slordig.

@FragFrog: Heel slim idee, ik zal het toepassen, dank je wel :).

@Janoz: Je hebt inderdaad gelijk, geen idee hoe ik daar opgekomen ben trouwens :P. Bedankt voor het aanpassen, zal er de volgende keer zelf aan denken.

Acties:
  • 0 Henk 'm!

  • FragFrog
  • Registratie: September 2001
  • Laatst online: 09:34
Deviruchi schreef op vrijdag 09 maart 2007 @ 11:24:
Ook wil ik even mijn excuses aanbieden voor het neerzetten van mijn info, het was trouwens alleen maar de pass van mijn test server, dus echt erg was het niet, maar het is inderdaad slordig.
Zo heb ik eens voor een release van m'n blogpakket vergeten dat soort gegevens weg te halen.. Sta je dan met een open source pakket op SourceForge waar al je servergegevens in staan... Kwam er gelukkig nog binnen paar minuten achter.. :+

[ Voor 18% gewijzigd door FragFrog op 09-03-2007 11:26 ]

[ Site ] [ twitch ] [ jijbuis ]


Acties:
  • 0 Henk 'm!

  • Deviruchi
  • Registratie: December 2006
  • Laatst online: 20-09 21:58
FragFrog schreef op vrijdag 09 maart 2007 @ 11:26:
[...]

Zo heb ik eens voor een release van m'n blogpakket vergeten dat soort gegevens weg te halen.. Sta je dan met een open source pakket op SourceForge waar al je servergegevens in staan... Kwam er gelukkig nog binnen paar minuten achter.. :+
Oei, dan heb je inderdaad nog mazzel. Gelukkig is dit nog een test, en niet de real deal, anders had ik zojuist kunnen fluiten naar mijn stageplek denk ik :P. Maargoed, nogmaals allemaal veel dank voor jullie hulp, nu kan ik (voorlopig) weer vooruit.

Gelukkig kan ik dit voor stage doen, dan kan ik meteen leren omgaan met OOP, want zoals jullie zien kan ik wat oefenen wel gebruiken * Deviruchi wijst naar de slordige fouten. :P

Acties:
  • 0 Henk 'm!

  • Zyppora
  • Registratie: December 2005
  • Laatst online: 12-09 10:59

Zyppora

155/50 Warlock

Is misschien een open deur, maar als je OOP in PHP wil gaan doen, moet je hier maar eens kijken (had je dat probleem met het statisch aanroepen ook gevonden): http://www.php.net/manual/en/language.oop5.php

Vind ik zelf een hele handige manual, en heb ik veel profijt van gehad (en nog steeds wel eens).

Phenom II X4 945 \\ 8GB DDR3 \\ Crosshair IV Formula \\ R9 290

Pagina: 1