database openen?

Overzicht Reageren

Sponsored by: Vacatures door Monsterboard

Pagina: 1 2 3 volgende »

Frits van Leeuwen

Frits van Leeuwen

14/08/2017 21:08:43
Quote Anchor link
Hallo allemaal,

Ik kom er niet uit. Ik zoek al een hele tijd, maar het wordt me niet duidelijk.

Ik heb in een installatie een database "db_test" laten maken met een user "Test" (ww="Test") en het tekst bestand.ini. In bestand.ini staat alle informatie die nodig is voor het vervolg. Ik heb het gecheckt en dat klopt allemaal.

Bij het openen/starten van "Index.php", haal ik de uit "bestand.ini" binnen, en ik geef ze aan variabelen. Dan wil ik de database activeren en het aantal records tellen dat in de tabel [tabel_administratires] staat. Aan dit laatste durf ik niet goed te beginnen, omdat ik deze melding krijg:

mysql:dbname=db_test ;host=localhost
(2) DB ERROR: invalid data source name

Wie kan me hierin bijstaan?

Index.php
Code (php)
PHP script in nieuw venster Selecteer het PHP script
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
<!DOCTYPE html>
<html>
    <head>
        <title>Basisbestand</title>
        <link rel="stylesheet" type="text/css" href="css/style.css">    
    </head>
    
    <body>
        <header>
        </header>
        <content>
            <?php
                try {
                    //gegevens binnenhalen
                    $a = fopen("bestand.ini", "r");
                    $b = file("bestand.ini");
                        $programmanaam = $b[0];
                        $versie = $b[1];
                        $hst = $b[2];
                        $user = $b[3];
                        $pass = $b[4];
                        $db = $b[5];
                    fclose($a);
                }
catch (PDOException $e) {
                    die("(1) DB ERROR: ". $e->getMessage());
                }

                
                //database openen
                try {
                    $mysql="mysql:dbname=" . $db . ";host=" . $hst;
                    echo $mysql . "<br>";
                    $dbh = new PDO('$mysql', $user, $pass);
                    $dbh->setAttribute( PDO::ATTR_PERSISTENT, TRUE );
                    $dbh->setAttribute( PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION );
                }
catch (PDOException $e) {
                    die("(2) DB ERROR: ". $e->getMessage());
                }

            ?>

        </content>
        <footer>
        </footer>
    </body>
</html>



Bestand.ini
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
Test
0.1.0.alpha.8
localhost
Test
Test
db_test

- Ariën -:
Gelieve in het vervolg bij code de [code][/code]-tags gebruiken.
Hier kan je meer lezen over de mogelijke opmaakcodes.
Alvast bedankt!
Gewijzigd op 14/08/2017 21:16:01 door - Ariën -
 
PHP hulp

PHP hulp

08/11/2024 10:35:18
 
- Ariën  -
Beheerder

- Ariën -

14/08/2017 21:21:10
Quote Anchor link
Wat een hoop fratsen om een .ini file uit te lezen. Dat kan ook eenvoudig met: parse_ini_file. Dan heb je meteen een overzichtelijk bestand die aangeeft wat welke regel voor welke informatie bevat.

Een goede tip: Let er goed op dat het .ini bestand BUITEN DE WEBROOT staat. Het is een tekstbestand die iedereen kan uitlezen, tenzij het buiten de publiekelijke webroot staat!


En een mogelijke oplossing voor je probleem: Haal de variabele $mysql op lijn 32 eens buiten variabelen quotes. Nu wordt deze als een normale tekst geinterpreteerd.
Gewijzigd op 14/08/2017 21:35:01 door - Ariën -
 
- SanThe -

- SanThe -

14/08/2017 21:34:05
Quote Anchor link
- Ariën - op 14/08/2017 21:21:10:
Haal de variabele $mysql op lijn 32 eens buiten variabelen.


buiten variabelen => buiten quotes.
 
- Ariën  -
Beheerder

- Ariën -

14/08/2017 21:34:22
Quote Anchor link
I need coffee.....
 
Frits van Leeuwen

Frits van Leeuwen

14/08/2017 22:08:47
Quote Anchor link
hahaha... I need coffee... hahaha
Ariën, bedankt voor de tips.
- San The - ook bedankt.

Dat was suf van mij die variabele in quotes te plaatsen.
Maar nu ik dat heb aangepast krijg ik

mysql:dbname=db_geldboom ;host=localhost
(2) DB ERROR: SQLSTATE[HY000] [2002] php_network_getaddresses: getaddrinfo failed: Name or service not known
 
- Ariën  -
Beheerder

- Ariën -

14/08/2017 22:11:54
Quote Anchor link
blijkbaar wordt localhost niet gefetched naar het IP-adres op de server. Probeer eens 127.0.0.1
 
Frits van Leeuwen

Frits van Leeuwen

14/08/2017 22:28:55
Quote Anchor link
Dan krijg ik:

mysql:dbname=db_geldboom ;host=127.0.0.1
(2) DB ERROR: SQLSTATE[HY000] [1045] Access denied for user 'Test '@'localhost' (using password: YES)

Ik ben de variabelen eens gaan invullen i.p.v. de variabelen. Het lijkt er op dat ik een spatie ergens krijg toegevoegd bij het importeren.
Gewijzigd op 14/08/2017 22:36:25 door Frits van Leeuwen
 
- Ariën  -
Beheerder

- Ariën -

14/08/2017 23:01:13
Quote Anchor link
Ik zie een spatie na user Test, wat niet lijkt te horen. Dat zal dan vermoedelijk in je ini-bestand staan.
Als je mijn aangedragen functie voor ini-files uitlezen gebruikt, dan worden extra spaties voor en echter netjes verwijderd.
Gewijzigd op 14/08/2017 23:11:04 door - Ariën -
 
Frits van Leeuwen

Frits van Leeuwen

14/08/2017 23:36:58
Quote Anchor link
Ik maak met dit stukje code bestand.ini aan. Ik zie dus niet waar die spatie staat.

Quote:
try {
$a=fopen("bestand.ini","w");
fwrite($a,"$programmanaam\r\n");
fwrite($a,"$versie\r\n");
fwrite($a,"$hst\r\n");
fwrite($a,"$user\r\n");
fwrite($a,"$pass\r\n");
fwrite($a,"$db\r\n");
fclose($a);
} catch (PDOException $e) {
die("(1) DB ERROR: ". $e->getMessage());
}

Gewijzigd op 14/08/2017 23:37:31 door Frits van Leeuwen
 
Ben van Velzen

Ben van Velzen

14/08/2017 23:46:37
Quote Anchor link
Offtopic: nogal vreemd dat je op zoek gaat naar exceptions (en al helemaal PDOException) bij functies die geen exceptions gooien.
 
- Ariën  -
Beheerder

- Ariën -

14/08/2017 23:50:57
Quote Anchor link
Misschien dat het er op een andere manier inkomt, maar wat houd je tegen om parse_ini_file te gebruiken? Dan ben je zeker dat een spatie ooit je script niet zal laten stoppen,
Gewijzigd op 14/08/2017 23:51:37 door - Ariën -
 
Frits van Leeuwen

Frits van Leeuwen

14/08/2017 23:56:07
Quote Anchor link
Ik heb mijn code er al een beetje op voorbereid. Ik gebruik nu $b[x] waarbij x natuurlijk een nummer is.
Ik gebruik dat i.p.v. de variabele die allemaal een eigen naam kregen.
Ik ken parse_ini_file nog niet. Ik zal eerst moeten kijken hoe ik het kan inpassen. Maar als je een tip hebt... ik hou me aanbevolen. Ik denk zeker dat het waardevol is.
 
Ben van Velzen

Ben van Velzen

15/08/2017 00:00:17
Quote Anchor link
parse_ini_file leest *echt* INI bestanden, niet iets zoals je nu gebruikt. Het werkt gegarandeerd een stuk beter, dat is een ding dat zeker is. Feit blijft dat je dit soort bestanden beter buiten je webroot kan plaatsen, omdat iedereen er nu gewoon bij zou kunnen.
 
- Ariën  -
Beheerder

- Ariën -

15/08/2017 00:05:10
Quote Anchor link
Nu heb je een structuur waar niemand wijs uit wordt. Want wat is Test op lijn 5? De username, password? Servernaam?
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
Test
0.1.0.alpha.8
localhost
Test
Test
db_test



Als je met *echte* ini-bestanden werkt, dan heb je meteen een key en een value, en je kan ze ook nog eens onderverdelen in secties, wat niet ten koste gaat aan je functie die je gebruikt.
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
9
[algemene instellingen]
programmanaam     = Test
versie         = 0.1.0.alpha.8

[connectie]
host         = localhost
user        = Test
pass         = Test
database     = db_test


En natuurlijk, zoals eerder gezegd, dit ini-bestand BUITEN de webroot plaatsen.
Gewijzigd op 15/08/2017 00:06:58 door - Ariën -
 
Frits van Leeuwen

Frits van Leeuwen

15/08/2017 00:23:23
Quote Anchor link
Op dit moment werkt het programma op mijn thuisnetwerk. (Of eigenlijk werkt het er nog niet ;-) ) Maar dat is de eerste situatie. Ik heb een plekje toegewezen waar ik een web-based programa wil bouwen. Hiermee hoop ik ook gelijk PHP te leren schrijven. Dat dan wel met PDO.

De opbouw van mijn bestand is nu nog heel klein. Maar dat is misschien ook een goed moment om de structuur gelijk goed neer te zetten.

Wouw wat heb ik een hoop geleerd vanavond. Heel erg bedankt. Ik ga het maken van mijn ini-bestand wijzigen. En dan ga ik dit voorbeeld over nemen.
Is daar ook zo'n functie voor? Of moet ik dat op de manier doen zoals ik die eerder liet zien?

Voor nu heb ik even genoeg achter de computer gezeten. Morgen zal ik waarschijnlijk wel weer verder gaan.
Dus slaap lekker allemaal en tot de volgende keer.
 
Ben van Velzen

Ben van Velzen

15/08/2017 00:32:59
Quote Anchor link
Ik zou vandaag de dag sowieso niet meer met fopen en consorten werken als het niet strict noodzakelijk is. Voor het snel lezen en schrijven van bestanden hebben we file_get_contents en file_put_contents. Of, als je de inhoud van een bestand per regel in een array wil hebben: file. Uiteraard niet vergeten te trimmen per regel, wat waarschijnlijk nu ook je probleem is.
 
- Ariën  -
Beheerder

- Ariën -

15/08/2017 00:49:39
Quote Anchor link
Frits van Leeuwen op 15/08/2017 00:23:23:
Ik ga het maken van mijn ini-bestand wijzigen. En dan ga ik dit voorbeeld over nemen.
Is daar ook zo'n functie voor? Of moet ik dat op de manier doen zoals ik die eerder liet zien?


Met deze functie:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
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
function write_php_ini($array, $file)
{
    $res = array();
    foreach($array as $key => $val)
    {
        if(is_array($val))
        {
            $res[] = "[$key]";
            foreach($val as $skey => $sval) $res[] = "$skey = ".(is_numeric($sval) ? $sval : '"'.$sval.'"');
        }
        else $res[] = "$key = ".(is_numeric($val) ? $val : '"'.$val.'"');
    }
    safefilerewrite($file, implode("\r\n", $res));
}

function safefilerewrite($fileName, $dataToSave)
{    if ($fp = fopen($fileName, 'w'))
    {
        $startTime = microtime(TRUE);
        do
        {            $canWrite = flock($fp, LOCK_EX);
           // If lock not obtained sleep for 0 - 100 milliseconds, to avoid collision and CPU load
           if(!$canWrite) usleep(round(rand(0, 100)*1000));
        } while ((!$canWrite)and((microtime(TRUE)-$startTime) < 5));

        //file was locked so now we can store information
        if ($canWrite)
        {            fwrite($fp, $dataToSave);
            flock($fp, LOCK_UN);
        }
        fclose($fp);
    }

}


Je stopt er een array in, dus vergelijkbaar is met de output van parse_ini_file. Commentaarregels worden hierin wel genegeerd. Maar dat heb je toch niet nodig als je geautomatiseerd de ini-file aanpast.
 
Ben van Velzen

Ben van Velzen

15/08/2017 10:16:22
Quote Anchor link
Waar is je "safefileread" functie dan die een shared lock pakt, die je nodig zal hebben om safefilewrite nuttig te laten zijn? Locking zal anders doodleuk genegeerd worden.
 
- Ariën  -
Beheerder

- Ariën -

15/08/2017 10:56:19
Quote Anchor link
Ik heb deze functie niet zelf geschreven en ooit eens gevonden ergens. Ikzelf gebruik altijd een normale config-file met constantes en variabelen.
 
Ben van Velzen

Ben van Velzen

15/08/2017 11:27:34
Quote Anchor link
Ja, maar, als je de tegenhangende functie niet hebt is deze functie ook zinloos. Dan kun je beter gewoon file_put_contents gebruiken.
 
Thomas van den Heuvel

Thomas van den Heuvel

15/08/2017 15:25:48
Quote Anchor link
Los hiervan, het werken met handmatig geformatteerde bestanden is toch een beetje voortborduren op een minder slimme ontwerpbeslissing.

Toen ik de manual raadpleegde of er misschien een makkelijker alternatief was kwam ik meteen in de eerste user comment al een voorbeeld tegen met .ini file.

Daarnaast lijkt het ook mogelijk om via een alias rechtstreeks een DSN-string (Data Source Name) uit een .ini file te lezen, zonder allerlei gecompliceerde bestandsoperaties. Waarschijnlijk moet je dan wel definiëren wat geldige paden voor .ini bestanden zijn en dat ding dan op de goede plaats zetten uiteraard.

Vergeet vooral niet bij het opstellen van je DSN om een character encoding in te stellen via charset. Zoals de eerste comment op de laatstgenoemde pagina voorstelt.

Het kan (voor iedereen :p) waarschijnlijk geen kwaad om wat meer The Flipping Manual te (leren) Readen.
 

Pagina: 1 2 3 volgende »



Overzicht Reageren

 
 

Om de gebruiksvriendelijkheid van onze website en diensten te optimaliseren maken wij gebruik van cookies. Deze cookies gebruiken wij voor functionaliteiten, analytische gegevens en marketing doeleinden. U vindt meer informatie in onze privacy statement.