NEE!
Ik had een hele lijst met fouten gemaakt voor de Database class...
Maar ik was vergeten het bericht te kopieren voor ik op "Plaats reactie" klikte, en wanneer je te lang wacht gaat er iets fout...
Ik kan je wel vertellen dat het een hele hoop fouten waren...
Ik ga het lijstje weer eens opstellen:
Database::__construct()
# Create standard variables for class
private $this->identifier;
private $this->SqlLine;
private $this->Value;
Dat hoort binnen een class, niet binnen een method (zo noemen we een functie binnen een class).
Ook is het "this->" niet nodig (geeft fouten)
$this->identifier = mysql_connect($this->hostname, $this->username, $this->password);
Waar komen $this->hostname, $this->username en $this->password ooit vandaan?
Geef vier verplichte parameters mee aan de constructor ($db = new Database('localhost', 'username', 'password', 'database'))
# Error handler, when sql error
$RespondsHandler->sql('CONNECT_ERROR');
Een mooie fout, maar niet wat je verwacht.
$RespondsHandler bestaat niet binnen deze scope (de method) en geeft dus fouten.
Database::SqlQuery()
function SqlQuery ( $this->SqlLine = 'Unknown' )
{
# when a empty line has been returned
if ( $this->SqlLine == 'Unknown' )
{
$RespondsHandler->sql('NO_SQL_LINE');
}
$this->SqlLine = 'Unkown' geeft een leuke fout: Cannot re-assign $this.
Gebruik func_num_args() om te kijken hoeveel parameters er zijn meegegeven als je zo graag wilt dat $RespondsHandler de fout registreert (en NULL is een betere standaard waarde, het staat voor missende data namelijk, precies wat jij wilt)
Ok lijkt het me beter om FALSE te returnen als er een error opduikt en niet niets (void). (in de constructor, de destructor en vast nog wel een paar andere magic methods heeft returnen geen zin)
Beter:
public function SqlQuery ( $SqlLine = NULL )
{
# when a empty line has been returned
if ( ! func_num_args() OR ! is_string($SqlLine))
{
$RespondsHandler->sql('NO_SQL_LINE');
return FALSE;
}
{
# Sql succeed
return true;
}
Database::Value gaat er toch echt vanuit dat deze method de mysql_query() returned...
Database::Value()
if ($this->SqlLine == 'Unknown') || ($this->Value == 'None')
Waar slaat ")
(" op? En dan vooral de haakjes...
protected $this->Result = self::SqlQuery( $this->SqlLine );
protected $this->array_return = array ( );
Kom jij uit de Java(script) hoek vandaan ofzo?
Binnen PHP geef je met "global" aan dat je een variabele van het aller laagste scope wilt gebruiken, en voor de rest zijn er superglobals die je in elke scope kan gebruiken en (de normale) variabelen die alleen binnen de huidige scope bestaan.
$Result = $this->SqlQuery($this->SqlLine); is dus wat je wilt.
$this->SqlQuery() inderdaad, Database::SqlQuery is niet static en kan dus niet aan worden geroepen alsof het wel static is...
# Run loop to get the values of the database
foreach ( $this->Value as $searchup )
{
# Create the assoc the readable data
protected $this->assoc mysql_fetch_assoc ( $this->Result );
if ( mysql_error ( ) )
{
# Error handler, when sql error
$RespondsHandler->sql('SQL_ERROR', mysql_error ( ) );
}
else
{
# Insert the results back in to an array
$this->array_return .= $this->assoc[$this->value];
}
}
Toon Meer
Je vergeet een = teken voor mysql_fetch_assoc()
De foreach moet binnen de else, en de mysql_fetch_assoc moet buiten de foreach (de mysql_error() dus ook)
De .= operator is voor een string, voor een array gebruik je $array[] =
Nog beter is helemaal geen foreach maar een $array_return = array_interset_key($assoc, array_flip($Value)) is stukken beter
Leef je nog?
Ik heb elke soort fout maar een keer opgenoemd, het lijkt me dat je zelf wel kunt bedenken dat het voor andere plaatsen ook geldt.
Wil je dat ik doorga met Login, of wil je eerst de kans krijgen Database en Login te verbeteren? (aub je oorspronkelijke bericht aanpassen en melden dat je dat gedaan hebt en niet hele nieuwe plakken code plaatsen)
Toch vind ik het heel fijn dat je dit topic hebt aangemaakt!
Weer eens een interessant topic!