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
<!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
Test
0.1.0.alpha.8
localhost
Test
Test
db_test

Wat een hoop fratsen om een .ini file uit te lezen. Dat kan ook eenvoudig met: [php]parse_ini_file[/php]. 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.
- 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.....
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
blijkbaar wordt localhost niet gefetched naar het IP-adres op de server. Probeer eens 127.0.0.1
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.
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.
Ik maak met dit stukje code bestand.ini aan. Ik zie dus niet waar die spatie staat.

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());
}


Offtopic: nogal vreemd dat je op zoek gaat naar exceptions (en al helemaal PDOException) bij functies die geen exceptions gooien.
Misschien dat het er op een andere manier inkomt, maar wat houd je tegen om [php]parse_ini_file[/php] te gebruiken? Dan ben je zeker dat een spatie ooit je script niet zal laten stoppen,

Reageren