PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : DB-Verbindungen und Verwaltung der Verbindungen - mit PDO auf einem Linux-Server



diver
27.11.20, 15:48
Moin hallo Commuity,


hier eine Frage zu Verbindungen und Verwaltung der Verbindungen - insbes. zur PDO-Basisklasse. Es geht um eine Webanwendung auf einem Server - einem Linux-Server (läuft auf OpenSuse).

vgl. https://www.php.net/manual/de/pdo.connections.php



Verbindungen werden durch das Erstellen von Instanzen der PDO-Basisklasse erzeugt. Es ist unerheblich, welchen Treiber Sie benutzen wollen. Sie benutzen immer den PDO-Klassennamen.Der Konstruktor erwartet Parameter zur Angabe der Datenbankquelle (auch bekannt als DSN) und optional für Benutzername und Passwort (falls vorhanden).


Beispiel #1 Mit MySQL verbinden



<?php

$dbh = new PDO('mysql:host=localhost;dbname=test', $user, $pass);

?>



Wenn es Fehler bei der Verbindung gibt, wird eine Ausnahme vom Typ PDOException geworfen. Sie können die Ausnahme abfangen, wenn Sie sich selbst um die Fehlerbedingung kümmern wollen, oder Sie können es einer globalen Routine zur Ausnahmebehandlung überlassen, die Sie mit set_exception_handler() konfigurieren.

Beispiel #2 Verbindungsfehler behandeln



?php

try {

$dbh = new PDO('mysql:host=localhost;dbname=test', $user, $pass);

foreach ($dbh->query('SELECT * from FOO') as $row) {

print_r($row);

}

$dbh = null;

} catch (PDOException $e) {

print "Error!: " . $e->getMessage() . "<br/>";

die();

}

?>


....also ich geh nochmals einen Schritt zurück zu einem Fehler: beim Installieren einer PHP Anwendung - ( https://www.Limesurvey.org) auf einem Server ) der doch ganz stabil läuft und auf dem es im Grunde keine DB-Fehler(Verbindungsfehler) gibt.

Der Fehler:
db-connection: SQLSTATE[HY000] [2002] No such file or directory

vgl. die Fehlerbeschreibung: https://forums.limesurvey.org/forum/installation-a-update-issues/122941-weird-things-in-db-connection-during-installprocess-what-to-do-here#208597

Hintergrund: Also das bedeutet dass php nicht den mysql.default_socket file finden kann. Ich denke dass ich hier mal ein paar Tests anstellen muss um zu sehen, ob ich zur mysql mittels pdo Verbindung herstellen kann.



try{

$dbh = new pdo( 'mysql:host=127.0.0.1:3308;dbname=axpdb',

'admin',

'1234',

array(PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION));

die(json_encode(array('outcome' => true)));

}

catch(PDOException $ex){

die(json_encode(array('outcome' => false, 'message' => 'Unable to connect')));

}




....ist die Frage ob ich hier display errors off gleich noch brauche & das exception-Handling? Hier noch eine weitere Version:




$host = "localhost";//the type of our database, in this case my host machine - well it is possible to use mysql:host=127.0.0.1:3308;dbname=axpdb',

$user = "root"; //here we need the Username to use the database

$pass = "qwerty123xyz";// here the password for that user

$dbname = "DB";//Name of the corresponding database

$port = "3306";

$charset = 'utf8mb4';


try {

$connection = new PDO("mysql:host=$host;dbname=$dbname", $user, $pass);

$connection->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);


}catch(PDOException $e)

{

echo $e->getMessage();

}




mir oder ohne error-handling .... hier mit:




<?php

$host = "localhost";// the type of our database, in this case my host machine - well it is possible to use mysql:host=127.0.0.1:3308;dbname=axpdb',

$servername = "localhost";

$username = "username";//here we need the Username to use the database

$password = "qwerty123xyz";// here the password for that user

$port = "3306"; //here we need the port

$charset = 'utf8mb4';// the charset is pretty important!


try {

$conn = new PDO("mysql:host=$servername;dbname=myDB", $username, $password);

// set the PDO error mode to exception

$conn->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);

echo "Connected successfully";

} catch(PDOException $e) {

echo "Connection failed: " . $e->getMessage();

}

?>



wie auch hier...:




$host = "localhost";// the type of our database, in this case my host machine - well it is possible to use mysql:host=127.0.0.1:3308;dbname=axpdb',

$servername = "localhost";

$username = "username";//here we need the Username to use the database

$password = "qwerty123xyz";// here the password for that user

$port = "3306"; //here we need the port

$charset = 'utf8mb4';// the charset is pretty important!


try {

$connection = new PDO("mysql:host=$host;dbname=$dbname", $user, $pass);

$connection->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);

}catch(PDOException $e)

{

echo $e->getMessage();

}



für ein Array mit PDO hier die einzelnen Teile:

PDO::ATTR_ERRMODE - wichtig - immer auf PDO::ERRMODE_EXCEPTION. Es soll immer ein Error rauswerfen wenns nicht geklappt hat wenn es zu einem Fehler kommt mit mysql_query()
PDO::ATTR_EMULATE_PREPARES - diese Option zeigt ob PDO entweder einen emulation mode verwendet oder eben nicht.
PDO::setAttribute() method, turned off by default als eine Verbindungsoption
PDO::ATTR_DEFAULT_FETCH_MODE - Eine Komfort-Option. Obwohl die fetch method immer im fetch function call (wie etwa hier $row = $stmt->fetch(PDO::FETCH_ASSOC);) läuft - sind dies die beliebteste Fetch-Modes:
PDO::FETCH_ASSOC and PDO::FETCH_OBJ welches PDO veranlasset die Ergebnisse als Reihen zu holen - als assozotatives array oder als ein Objket



Vorhaben: ich werde jetzt mit dem Script testen wie die Verbindung via PDO zur DB aufgenommen wird.



Also es geht um diesen Thread hier;

https://forums.limesurvey.org/forum/installation-a-update-issues/122941-weird-things-in-db-connection-during-installprocess-what-to-do-here#208597

da denke ich. ist das unbed. meine Servereinstellung oder kann das ggf auch noch daran liegen dass ich ggf. in dem LimeSurvey noch was besser anpassen sollte - also ggf. nach einem Workaround in dem LimeSurvey-Script suchen welcher mir erlaubt um diese dämliche (sorry) Installationsroutine zu kommen!?

Gibt es da ggf. eine Möglichkeit. Das Interessante ist - alles was auf dem Server noch läuft - (z.B. Wordpress ) lässt sich einfach installieren - da ist es nie ein Problem die Verbindung zur DB herzustellen... !

Nur bei dem Limesurvey hab ich diese Socket_Probleme.

ich werde mir das von dir verlinkte nochmals genau durchlesen und durcharbeiten


update:

Bei mit läuft der Server unter Linux t, und ich hab schon öfter gehoert dass man dann Probleme beim Verbindungsaufbau bekommen kann.

ggf. sollte ich das mal mit dem charset UTF8 und einer der folgenden DSN testen;

mysql:host=localhost;port=3307;dbname=testdb
mysql:unix_socket=/tmp/mysql.sock;dbname=testdb

Quelle:

https://www.php.net/manual/en/ref.pd...connection.php

Hatte vor einem Jahr schon mal die Probleme: Kann mich leider nicht mehr erinnern, welche Lösung damals die richtige war, glaube aber der socket.
Letztendlich sollte ich mir halt auch mal funktionierende Beispiele anschauen, das ist oft besser als die PDO Dokumentation (leider):
Beispiel Laravel Framework: https://github.com/laravel/framework...lConnector.php