Ankündigung

Einklappen
Keine Ankündigung bisher.

von mysql zu pdo

Einklappen

Neue Werbung 2019

Einklappen
X
  • Filter
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge

  • von mysql zu pdo

    ICh möchte folgenden Code auf pdo stellen:

    PHP-Code:
    # Momentan verfügbare Sprachen im Frontend
    $aLanguage = array('de''en');
    if (
    $_REQUEST['Language'] and in_array($_REQUEST['Language'], $aLanguage)) {
        
    $_SESSION['Language'] = $_REQUEST['Language'];
    } else {
        
    $_SESSION['Language'] = 'de';
    }

    $Query "Select adminlang, Value from adminlang where Language = '{$_SESSION['Language']}'";
    # echo 'sprache'. $Query;
    $Query mysql_query($Query);
    $i 0;
    while (
    $aQuery mysql_fetch_assoc($Query)) {
        
    $aVocable[$aQuery['adminlang']] = $aQuery['Value'];
        
    $i++;

    Es wird auf ein Array zugegriffen (rechts, Index Value), wobei links der Eintrag (Index adminlang) festgelegt wird und das ganze in aVocable gespeichert wird. In der Spalte Language wird die Sprache gespeichert.
    Nun möchte ich es auf pdo umstellen, also keine Schleife mehr, dafür fetchall und oop mit prepare und execute.

    Ich verstehe nicht, wie ich das verschachtelte Array mit $Vocable und $Query in pdo umsetze.

  • #2
    Generell musst du mysql_connect() und mysql_select_db() durch eine PDO-Instanziierung ersetzen:

    PHP-Code:
    $link mysql_connect('localhost''username''password');
    mysql_select_db('datenbank'$link); 
    wird zu:
    PHP-Code:
    $db = new PDO('mysql:host=localhost;dbname=datenbank''root''password'); 
    Dabei rate ich dir an, als vierten Parameter bei PDO folgendes Array anzugeben:

    PHP-Code:
    $db = new PDO('...', array(
        
    PDO::ATTR_EMULATE_PREPARES => false,
        
    PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION
    )); 
    Die erste Zeile ermöglicht dir, von PDO nativ die Datentypen zurückgegeben zu bekommen. Also ein Integer in der Datenbank wird auch zu 'nem Integer in PHP.
    Die zweite Zeile sagt, dass PDO bei Fehlern eine Exception wirft. Diese kannst du mit try/catch-Blöcken fangen und verarbeiten.


    Um nun ein Query auszuführen, hast du zwei Möglichkeiten:
    Mit der query()-Methode oder der prepare()-Methode. Ich rate dir generell dazu, die prepare()-Methode zu benutzen.

    In deinem konkreten Beispiel sähe das dann so aus:

    PHP-Code:
    $sql "select adminlang, Value from adminlang where Language = :language";
    $statement $db->prepare($sql);
    $statement->bindValue(':language'$_SESSION['Language'], PDO::PARAM_STR);
    $statetement->execute();
    while (
    $aQuery $statement->fetch(PDO::FETCH_ASSOC)) {
        
    $aVocable[$aQuery['adminlang']] = $aQuery['Value'];
        ++
    $i;

    Pflücken wir das mal auseinander:
    Wie du siehst, wurde der Query-String etwas abgeändert. Statt direkt den Sprachwert zu übergeben, übergibst du einen Platzhalter mit dem Namen language. Platzhalter mit Namen beginnen mit Doppelpunkten. Platzhalter ohne Namen sind einfach nur Fragezeichen (select * from users where user_id = ?).

    Die bindValue()-Methode übergibt PDO den Wert, der den Platzhalter ersetzen wird. Erst sagst du, welchen Platzhalter du ersetzen willst, dann sagst du, durch welchen Wert und als letztes (das ist aber nicht notwendig), den Typen (es gibt PARAM_INT, PARAM_STR, PARAM_BOOL, PARAM_NULL, ...).

    Mit execute() sagst du PDO, die Abfrage mit den von dir vorher genannten Daten auszuführen. execute() kannst du auch ein Array übergeben, das die Daten direkt übergibt, nur kannst du dort dann nicht den Datentypen übergeben.

    Erst nachdem du das Statement ausgeführt hast, kannst du dann wie gewohnt fetchen.

    Kommentar


    • #3
      für alles weitere ist übrigens v.a. das Manual und auch Google eine sehr gute Lektüre.

      Kommentar


      • #4
        ok, das inkrementieren von i spare ich mir, wird ja nirgends verwendet.

        Kommentar


        • #5
          Mir ist aufgefallen, dass auf localhost die Methode bindvalue (also prepared statements) nicht funktioniert, auf einem anderen host dafür schon. Apache HTTP Server funktioniert nicht mehr. Windows kann online ... Dann Seiten-Fehler, Verbindung zum Server zurückgesetzt.

          Die Codezeilen, die nicht gehen sind:
          PHP-Code:
          $sql "select adminlang, Value from adminlang where Language = :language";
          $statement $db->prepare($sql);
          $statement->bindValue(':language'$_SESSION['Language'], PDO::PARAM_STR); 

          Kommentar


          • #6
            Was sagen die Log-Dateien?

            Kommentar


            • #7
              Zitat von UbuntuEmacs Beitrag anzeigen
              Mir ist aufgefallen, dass auf localhost die Methode bindvalue (also prepared statements) nicht funktioniert, auf einem anderen host dafür schon. Apache HTTP Server funktioniert nicht mehr. Windows kann online ... Dann Seiten-Fehler, Verbindung zum Server zurückgesetzt.

              Die Codezeilen, die nicht gehen sind:
              PHP-Code:
              $sql "select adminlang, Value from adminlang where Language = :language";
              $statement $db->prepare($sql);
              $statement->bindValue(':language'$_SESSION['Language'], PDO::PARAM_STR); 
              Benutze doch bitte eine Try & Catch Block um den Fehler abzufangen und schaue in die Log datei wie oben schon geschrieben.
              PS:Ich habe eine eigene PDO Klasse und die klappt perfekt auf localhost.(hier wird mamp verwendet)
              php.net - try & catch block

              Kommentar


              • #8
                Ich habe folgendes Beispiel verwendet:
                PHP-Code:
                function inverse($x) {
                    if (!
                $x) {
                       throw new 
                Exception('Division durch Null.');
                    }
                    else return 
                1/$x;
                }

                try {
                    echo 
                inverse(5) . "\n";
                    echo 
                inverse(0) . "\n";
                } catch (
                Exception $e) {
                    echo 
                'Exception abgefangen: ',  $e->getMessage(), "\n";
                }

                #mein Code
                try {

                    
                # Internationalitaet
                    
                $sql "select adminlang, Value from adminlang where Language = :language";
                    
                $statement mydb::getinstance()->prepare($sql);
                    
                $statement->bindValue(':language'$_SESSION['Language'], PDO::PARAM_STR); 

                    
                $statement->execute();
                     if (!
                $statement) {
                      throw new 
                Exception('PDO funktioniert nicht');

                    while (
                $aQuery $statement->fetch(PDO::FETCH_ASSOC)) {
                        
                $aVocable[$aQuery['adminlang']] = $aQuery['Value'];
                    } 

                } catch (
                Exception $e) {
                    echo 
                'Exception abgefangen: ',  $e->getMessage(), "\n";

                Wo ich die Abfrage if ! statement ansetze weiss ich nicht. Wo nachzulesen ?
                Meldung: Parse error: syntax error, unexpected 'catch' (T_CATCH) in C:\xampp_htdocs\index.php on line 79
                Ich habe try, catch und throw angewendet, und alles an den richtigen Ort gepackt..
                Ohne try-catch gibt es im Error - log (datei vorhanden im Ordner php/logs, xampp) keine Meldung.
                Nun wird der obige Syntax-Fehler eingetragen in den log .

                Kommentar


                • #9
                  kommando zurück, habe schliessende Klammer vergessen - nun kommt wieder die apache http server funktioniert nicht mehr meldung und skript bricht ab mit Fehler-Verb unterbrochen

                  Kommentar


                  • #10
                    du hast nach einem if, die schließende geschweifte Klammer vergessen:
                    PHP-Code:
                    if (!$statement) {
                          throw new 
                    Exception('PDO funktioniert nicht'); 
                    müsste
                    PHP-Code:
                    if (!$statement) {
                          throw new 
                    Exception('PDO funktioniert nicht');

                    sein.
                    Beitrag editiert:
                    Ich sehe, du hast es selbst gefunden.

                    Kommentar


                    • #11
                      Im Übrigen kann PDO selber Exceptions werfen und in 99,999% der Fälle ist es dabei nicht PDO, das nicht funktioniert, sondern das eigene Query, das fehlerhaft ist.

                      Kommentar


                      • #12
                        Hat jemand einen Tipp ? Es geht ja noch nicht.
                        Dann frage ich mich, ob die error_log_php Inhalte automatisch nach einer bestimmten Anzahl Zeilen gelöscht werden oder ob sie nicht gelöscht/geleert wird. Speicher kostet ja..

                        Kommentar

                        Lädt...
                        X