Avatar billede larsgrau Forsker
20. oktober 2020 - 09:54 Der er 4 kommentarer og
1 løsning

undefined variable

<?php

include "dbConfig.php";

$sql = "SELECT * FROM dbselect";
        $result = mysqli_query($dbsql, $sql);
        $queryResult = mysqli_num_rows($result);
       
        if ($queryResult > 0){
        while ($row = mysqli_fetch_array($result)){
           
            $dbselect = $row['dbselect'];
       
        }
        }

        $path = "C:\Temp\sqlitedb\\";
        $dbsqlite = $path . $dbselect;
       
class MyDB extends SQLite3{
    function __construct(){
        $this->open($dbsqlite);
    }
}

$db = new MyDB();
?>
Får jeg denne fejl i browser:
Notice: Undefined variable: dbsqlite in C:\xampp\htdocs\conf\dbsqlite.php on line 22

hvis man echo $dbsqlite er det en rigtige path
Avatar billede larsgrau Forsker
20. oktober 2020 - 10:15 #1
Løste det på følgende måde med 2 filer
Fil 1 hedder dbselect.php
<?php
include "dbConfig.php";
$sql = "SELECT * FROM dbselect";
        $result = mysqli_query($dbsql, $sql);
        $queryResult = mysqli_num_rows($result);
        if ($queryResult > 0){
        while ($row = mysqli_fetch_array($result)){
            $dbselect = $row['dbselect'];
            }
        }
        $path = "C:\temp\sqlitedb\\";
        $dbsqlite = $path . $dbselect;
        ?>
file 2 hedder dbsqlite.php

<?php
class MyDB extends SQLite3{
    private $dbselect;
    function __construct(){
        include ("dbselect.php");
        $this->open($dbsqlite);
    }
}
$db = new MyDB();
?>

også virkede det
Avatar billede Slater Ekspert
20. oktober 2020 - 12:41 #2
Det er fint nok at have to filer - generelt bør klasser have en fil for sig selv.
Men det vil være en bedre løsning her (oven i de to filer) at sende din variabel med ind i funktionen i stedet for at udføre logikken inde i funktionen - hvilket stadig sker her, selvom det er i to filer.

Dvs du kan tage $dbsqlite som argument i din constructor:
function __construct($dbsqlite){ ...

Og når du så laver en ny MyDB klasse, giver du den din variabel med:
$db = new MyDB($dbsqlite);

Dette gør alting løsere koblet, hvilket betyder du nemmere kan genbruge ting i fremtiden, og det gør det testable.
Ud over det lyder det ikke som om specifikke queries og resultater bør ligge i en fil der hedder dbConfig. Det ville man mene kun skulle indeholde generel konfiguration for hele projektets databaseadgang.
Avatar billede arne_v Ekspert
22. oktober 2020 - 03:25 #3
(jeg formoder at dbconfig.php indehoider etablering af forbindelse til den MySQL database, hvor der findes navnet på MySQL databasen)

Ideen med at sende et argument over til constructor er helt rigtig.

Jeg er imidlertid også noget bekymret over det her:

extends SQLite3

Det kan nemt føre til masser af ulykker at subclasse en klasse der ikke er tiltænkt at blive subclasset.

Deleger til en instans af SQLIte3 fremfor at arve fra den.
Avatar billede larsgrau Forsker
23. oktober 2020 - 14:12 #4
Hej

Hvis i tænker på sikkerhed, betyder det ikke noget, da det hele ligger på et offline netwærk.

Lars
Avatar billede Slater Ekspert
23. oktober 2020 - 14:25 #5
Det har ikke noget med sikkerhed at gøre, men god kodepraksis.
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester