database openen?
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)
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
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>
<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
- Ariën -:
Gelieve in het vervolg bij code de [code][/code]-tags gebruiken.
Hier kan je meer lezen over de mogelijke opmaakcodes.
Alvast bedankt!
Hier kan je meer lezen over de mogelijke opmaakcodes.
Alvast bedankt!
Gewijzigd op 14/08/2017 21:16:01 door - Ariën -
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 buitenvariabelen quotes. Nu wordt deze als een normale tekst geinterpreteerd.
Wat een hoop fratsen om een .ini file uit te lezen. Dat kan ook eenvoudig met: 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
Gewijzigd op 14/08/2017 21:35:01 door - Ariën -
- Ariën - op 14/08/2017 21:21:10:
Haal de variabele $mysql op lijn 32 eens buiten variabelen.
buiten variabelen => buiten quotes.
I need coffee.....
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
blijkbaar wordt localhost niet gefetched naar het IP-adres op de server. Probeer eens 127.0.0.1
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
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 -
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());
}
$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
Offtopic: nogal vreemd dat je op zoek gaat naar exceptions (en al helemaal PDOException) bij functies die geen exceptions gooien.
parse_ini_file te gebruiken? Dan ben je zeker dat een spatie ooit je script niet zal laten stoppen,
Misschien dat het er op een andere manier inkomt, maar wat houd je tegen om Gewijzigd op 14/08/2017 23:51:37 door - Ariën -
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.
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.
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)
1
2
3
4
5
6
7
8
9
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
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 -
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.
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.
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 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?
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)
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
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);
}
}
{
$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.
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.
Ik heb deze functie niet zelf geschreven en ooit eens gevonden ergens. Ikzelf gebruik altijd een normale config-file met constantes en variabelen.
Ja, maar, als je de tegenhangende functie niet hebt is deze functie ook zinloos. Dan kun je beter gewoon file_put_contents gebruiken.
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.