MuscleMeat

PHP Vraag

Musculo

Adolescent bodybuilder
Elite Member
Lid sinds
2 jan 2009
Berichten
4.460
Waardering
235
Lengte
1m80
Hallo allemaal,

Misschien een stomme vraag maar moet alles nog een beetje onder de knie krijgen dus kan ik het beter meteen vragen zodat ik geen omslachtige manier hoef te gaan gebruiken hiervoor.
Het voorbeeld dat ik gebruik is totaal niet praktisch natuurlijk maar het gaat er maar even om dat ik zo kan uitleggen wat ik wil, ik wil dus zeg maar een connectie van een database die in bijv. index.php is aangemaakt kunnen gebruiken in een andere class, maar dan krijg ik een error (logisch). Zie voorbeeld.

Voorbeeld (ik vond 'mysqli' in [Link niet meer beschikbaar]om te gebruiken, als er een handigere manier is om te werken met een mysql-database graag vermelden:cool:)

De tabel 'test' bevat de volgende velden: 'id' (AUTO_INCREMENT) en 'data' (VARCHAR(10))

PHP:
<?php 
// index.php
include 'testobject.class.php';
$mysqli = new mysqli('localhost', 'bla', 'bla', 'test'); 
$testObject = new testObject();
if(mysqli_connect_errno()) // weet niet of ik zo een connectie error goed opvang
{ 
    trigger_error('Fout bij verbinding: '.$mysqli->error); 
} 

$inputData = 'object';
echo $testObject->insertToDB($inputData);  
?>

PHP:
<?php
// testobject.class.php

class testObject {

public function __construct() {
// bla..
}

public function insertToDB($inputData = false) {
$query = "INSERT INTO test (data) VALUES ('".$inputData."')";
if ($inputData) {
if (!empty($inputData)) {
return mysqli_query($mysqli, $query);
}
else {
return 'Er is geen data om in de db te gooien.';
} 
}
else {
return 'Parameter meegeven aan de functie.';
}
}


}

?>

De error die ik nu natuurlijk krijg is 'undefined variable: mysqli' om dat de variabele mysqli niet bestaat in mijn class en ik die connectie dus niet kan aanroepen, ik dacht eerst dat ik hem gewoon kon returnen en dat index.php hem dan wel zo zou parsen dat ie de $mysqli uit index.php zou gebruiken :rolleyes: :D

Hoe los ik dit nu (netjes) op? Moet je standaard een database class maken waarin je alle mogelijke bewerkingen die je kan uitvoeren op de db hebt verwerkt en waaraan je via de parameters data kan doorgeven?
Die class dan includen in elke class om zo de query wel uit te kunnen voeren vanuit bijvoorbeeld (in dit geval) testobject.class.php?

Zal vast heel wat fout zijn aan deze code maar ik moet het nog leren dus vergeef me dat aub (incl. de naamkeuze voor functies etcetera) :) :p

Karma voor degene die hier een mooie oplossing voor heeft waardoor ik voortaan weet hoe je dit soort dingen aanpakt :)
 
Je kunt beter PDO gebruiken ipv mysqli. PDO is database onafhankelijk en in jouw voorbeeld zit al gelijk een veiligheidsrisico: inputData kan een SQL injectie bevatten. Onderstaand voorbeeld heeft nog geen fout afhandeling.
PHP:
class db {
 /* Connectie openen en connectie object teruggeven */
 function getDbh() {
   $user = 'username';
   $pass = 'password';   
   $dbh = new PDO('mysql:host=localhost;dbname=test', $user, $pass);
   return $dbh;
 }
}

/* Maak nieuwe database class en vraag een connectie aan */
$db = new db();
$dbh = $db->getDbh();

/* Veilig data invoegen */
$stmt = $dbh->prepare("INSERT INTO test (data) VALUES (:value)");
$stmt->bindParam(':value', $value);
$value = 'test data';

/* Query uitvoeren */
$stmt->execute();
 
  • Topic Starter Topic Starter
  • #3
Ty voor die methode :) Wordt die veel toegepast?
In mijn voorbeeld accepteerde ik ook geen user input dus liet het voor het gemak even weg :p

Er is dus wel een aparte db class?
 
  • Topic Starter Topic Starter
  • #5
Haha, ken hem ja maar srs er is geen user input in dit voorbeeld :mad:

Ik zie nergens $_GET of $_POST :mad:
 
  • Topic Starter Topic Starter
  • #7
't is maar een emoticon, ik trek geen boos gezicht achter mn scherm :)
 
  • Topic Starter Topic Starter
  • #8
Dus pdo is de optie?
 
  • Topic Starter Topic Starter
  • #10
Heb hier al een account en zit te wachten tot GetXXL dit topic ziet :p
 
  • Topic Starter Topic Starter
  • #11
Cool ik kan ook gewoon de connectie meegeven in een variabele en zo alsnog de functie laten uitvoeren :D
 
Ja, en de db class is maar een voorbeeld, je kunt het noemen zoals je zelf wil.
 
Hehe, ik doe al heel langs niks native meer in PHP wat betreft databases (gebruik frameworks).

Maar zo uit m'n hoofd, hoe ik het zou aanpakken, je maakt een settings bestand waar je je de settings in zet, o.a. van je database. Bijv:
PHP:
<?php
// DB
$settings['db']['login']    = 'bla';
$settings['db']['password'] = 'bla';
$settings['db']['host']     = 'bla';
$settings['db']['database'] = 'bla';

// Bla
$settings['bla']['etc'] = 'bla';

Je settings file include je.

Vervolgens maak je 'n database klasse, ik weet alleen de mysql syntax uit m'n hoofd, maar gebruik PDO zoals WWWilco ook aangeeft, maar heb je iig. 'n beetje 'n idee:

PHP:
class db {
    public $con;

    public function __construct($settings) {
        $this->con = mysql_connect($settings['db']['host'], $settings['db']['login'], $settings['db']['password']);
        
        if(!$this->con) {
            die('Could not connect: ' . mysql_error());
        }
        
        mysql_select_db($settings['db']['database'], $this->con);
    }
}
Zoiets krijg je dan. Vervolgens include je dus ook je db file (na de settings). En maak je je db object aan:
PHP:
$db = new db($settings);

Wat natuurlijk rete handig is, is 'n shitload aan handige functies toevoegen aan je db klasse, je wil zelf tenslotte niet steeds queries met de hand schrijven of whatever. Voeg je bijv. toe:

PHP:
public function find($table, $findBy = 'id', $id, $fields = '*') {        
    $query = "SELECT " . (is_array($fields) ? mysql_real_escape_string(implode(",", $fields)) : mysql_real_escape_string($fields)) . " " .
             "FROM `" . mysql_real_escape_string($table) . "` " .
             "WHERE " . mysql_real_escape_string($findBy) . "='" . mysql_real_escape_string($id) . "'";

    $data = mysql_query($query);

    if(mysql_num_rows($data) == 0) {
        return false;
    }
    else {
        $arrayData = array();

        while($row = mysql_fetch_array($data)) {
            $arrayData[] = $row;
        }

        return $arrayData;
    }
}
Bespaart je herhaling van veel code. Je kan hier heel makkelijk ook nog andere shit toevoegen, zoals sorteren op bijv. name, asc, en hoe veel results je terug wilt, bijv:
PHP:
$query .= " LIMIT " . mysql_real_escape_string($limitStart) . ", " . mysql_real_escape_string($limit);
voeg je dan toe.

Aanroepen doe je met
PHP:
$result = $db->find($table, $findBy, $id, $fields);

En je hebt dan gelijk je shit in 'n array, en false als het geen resultaten teruggaf.

Heb het allemaal getypt met behulp van de highlighting van dbb, dus zullen ongetwijfeld fouten in staan :o (moet nog van alles installeren, net nieuwe mobo erin)
 
Laatst bewerkt:
  • Topic Starter Topic Starter
  • #14
Nice, ty voor deze toch wel uitgebreide post :)
 
Terug
Naar boven