Ankündigung

Einklappen
Keine Ankündigung bisher.

PHP - PDO, Slim und MySQL für REST Web Service

Einklappen

Neue Werbung 2019

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

  • PHP - PDO, Slim und MySQL für REST Web Service

    Hallo,

    ich versuche gerade ein einfachen Web Service zu bauen der aus eine Datenbank etwas aus liest.

    Das ganze soll dann irgend wann mal teil einer größeren REST API werden. Ich nutze das "Slim Framework" um mir die Arbeit etwas zu vereinfachen und die "PHP Database Ojects" um die Arbeiten mit einer MySQL Datenbank zu erleichtern.

    Ich Teste meine Schnittstelle mit dem Google Chrome Plugin "Advanced Rest Client".

    PHP-Code:
    function getConnection() {
        
    $dbhost "localhost";
        
    $dbuser "user";
        
    $dbpass "password";
        
    $dbname "database";
        
        try {
            
    $con = new PDO ("mysql:host=$dbhost;dbname=$dbname"$dbuser$dbpass);
            return 
    $con;
        } catch ( 
    Exception $e ) {
            echo 
    '{"error":{"Datenbank-Fehler":' $e->getMessage () . '}}';
        }
    }

    function 
    getMovies() {
        
    $app = \Slim\Slim::getInstance ();
        
    $sql_query "SELECT name FROM movietabelle";
        try {
            
    $dbCon getConnection();
            
    $stmt   $dbCon->query($sql_query);
            
    $movies  $stmt->fetchAll(PDO::FETCH_OBJ);
            
    $dbCon null;
            
    $app->response ()->headers->set 'Content-Type''application/json' );
            echo 
    json_encode($movies);
            exit();
        }
        catch(
    PDOException $e) {
            echo 
    '{"error":{"text":'$e->getMessage() .'}}';
        }    

    Aber ich bekomme immer einen leeren Respons in der Datenbank befinden sich weit über 100 Test Einträge.

    $3A154B8E1EF7B1F1.jpg

    Ich weiß nicht mehr woran es liegen könnte ich wäre für Hilfe sehr dankbar


  • #2
    Du musst den PDO ErrorMode auf Exception setzen, ansonsten wird PDO nur eine Warning ausspucken die (wie ich annehme) einfach unterdrückt wird. Rufst du die Funktion überhaupt auf?
    [QUOTE=nikosch]Macht doch alle was Ihr wollt mit Eurem Billigscheiß. Von mir aus sollen alle Eure Server abrauchen.[/QUOTE]

    Kommentar


    • #3
      Er wirft ja keine Exception... Oder verstehe ich dich jetzt falsch?

      Gesendet von meinem GT-I9300 mit Tapatalk

      Kommentar


      • #4
        Das meint er ja.. mach die conn mal so: http://php-de.github.io/jumpto/pdo/#create-conn
        The string "()()" is not palindrom but the String "())(" is.

        Debugging: Finde DEINE Fehler selbst! | Gegen Probleme beim E-Mail-Versand | Sicheres Passwort-Hashing | Includes niemals ohne __DIR__
        PHP.de Wissenssammlung | Kein Support per PN

        Kommentar


        • #5
          Okey habe das geändert aber das bewirkte auch nichts.

          PHP-Code:
          <?php
          require 'vendor/autoload.php';
          $app = new \Slim\Slim ();

          // MAPPING der URL auf function
          $app->get '/movies''getMovies' );


          // Wird bei aufruf der root URL angezeigt
          $app->get '/', function () use($app) {
              
          $app->response->setStatus 200 );
          });

          function 
          getConnection() {
              
          $dbhost "localhost";
              
          $dbuser "user";
              
          $dbpass "password";
              
          $dbname "database";  
              
          $options = array(
                      
          PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION,
                      
          PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_OBJ,
                      
          PDO::ATTR_EMULATE_PREPARES => false
              
          );
              
              try {
                  
          $con = new PDO ("mysql:host=$dbhost;dbname=$dbname"$dbuser$dbpass$options);
                  return 
          $con;
              } catch ( 
          Exception $e ) {
                  echo 
          '{"error":{"Datenbank-Fehler":' $e->getMessage () . '}}';
              }
          }

          function 
          getMovies() {
              
          $app = \Slim\Slim::getInstance ();
              
          $sql_query "SELECT c00 FROM movieview";
              try {
                  
          $dbCon getConnection();
                  
          $stmt   $dbCon->query($sql_query);
                  
          $movies  $stmt->fetchAll();
                  
          $dbCon null;
                  
          $app->response ()->headers->set 'Content-Type''application/json' );
                  echo 
          json_encode($movies);
                    exit();
              }
              catch(
          PDOException $e) {
                  echo 
          '{"error":{"text":'$e->getMessage() .'}}';
              }    
          }
          //Lauf APP lauf
          $app->run ();

          ?>

          Kommentar


          • #6
            Und du bist dir sicher, dass nicht die zweite Route matched, aus welchem Grund auch immer?
            [QUOTE=nikosch]Macht doch alle was Ihr wollt mit Eurem Billigscheiß. Von mir aus sollen alle Eure Server abrauchen.[/QUOTE]

            Kommentar


            • #7
              was meinst du mit zweite Route?

              Kommentar


              • #8
                Das hier:

                PHP-Code:
                // Wird bei aufruf der root URL angezeigt
                $app->get '/', function () use($app) {
                    
                $app->response->setStatus 200 );
                }); 
                [URL="https://github.com/chrisandchris"]GitHub.com - ChrisAndChris[/URL] - [URL="https://github.com/chrisandchris/symfony-rowmapper"]RowMapper und QueryBuilder für MySQL-Datenbanken[/URL]

                Kommentar


                • #9
                  Ja eigentlich sollte das vollkommen ignoriert werden ich rufe ja eine andere funktion auf.

                  Gesendet von meinem GT-I9300 mit Tapatalk

                  Kommentar


                  • #10
                    Eigentlich ist nicht gerade eine präzise Aussage. http://php-de.github.io/jumpto/leitfaden/
                    [URL="https://github.com/chrisandchris"]GitHub.com - ChrisAndChris[/URL] - [URL="https://github.com/chrisandchris/symfony-rowmapper"]RowMapper und QueryBuilder für MySQL-Datenbanken[/URL]

                    Kommentar


                    • #11
                      getMovies() wird nicht aufgerufen, weder der Header (try Block) ist gesetzt noch die Fehlermeldung (catch Block) tauchen im reponse auf.

                      Kommentar


                      • #12
                        Zitat von erc Beitrag anzeigen
                        getMovies() wird nicht aufgerufen
                        Eigentlich sollte das passieren wenn ich die URL /movies anspreche. Da ich ja mappe von /movies auf getMovies.

                        PHP-Code:
                        // MAPPING der URL auf function
                        $app->get '/movies''getMovies' ); 
                        und mit

                        PHP-Code:
                        $app->get 
                        Sage ich ja nur das es eine GET Anfrage ist.

                        Ich habe noch ein bisschen weiter rum gespielt und folgendes Festgestellt. Der Code funktioniert. Nur nicht mit der Datenbank....

                        Ich habe es mit einer Datenbank des Contao CMS ausprobiert und dort erhalte ich folgendes.

                        Dieses Ergebnis im Advanced Rest Client
                        contao.JPG


                        Und dieses Ergebnis im Browser bei direktem Auf ruf der /movies URL

                        browser.JPG

                        Beide wie erwartet also kann man ausschließen das es am Code liegt. Denke ich zu mindestens. Fehler bei den Benutzer könnte ich auch grob ausschließen da ich den selben Benutzer für beide Datenbanken frei geschaltet habe und er hat dort GRANT Access.

                        Die Unterschiede beider DB's bei der Movie DB rufe ich einen VIEW ab aber das sollte eigentlich vollkommen egal sein denn genau dazu ist er ja da und die Movie DB ist eine InnoDB und die Contao eine MyISAM sollte aber dem Abruf der daten auch nichts in den weg legen geht ja hauptsächlich nur um Transaktionen und Fremdschlüssel. Also für den abruf von Daten irrelevant oder?

                        Kommentar


                        • #13
                          Ich habe jetzt mal alle datensätze die Umlaute enthalten entfernt. Dann funktioniert es. Wie kann ich diese maskieren oder raus filtern? Kann ich der Abfrage eine Option mit geben die das in UTF8 wandelt oder so was?

                          Kommentar


                          • #14
                            Ich haba das Problem gelöst, es lag daran das json_encode nur mit UTF8 umgehen kann. Da es in einigen Datensätzen aber Umlaute und Sonderzeichen gab bekamm ich hier mit Probleme ich habe als weitere Option dann den MYSQL_ATTR_INIT_COMMAND UTF8 mit übergeben.

                            PHP-Code:
                            $options = array(
                                        
                            PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION,
                                        
                            PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_OBJ,
                                        
                            PDO::ATTR_EMULATE_PREPARES => false,
                                        
                            PDO::MYSQL_ATTR_INIT_COMMAND => "SET NAMES utf8"
                                
                            ); 
                            So konnte ich die Datensätze dann ohne Probleme abrufen.

                            Danke für eure Ideen und Anteilnahme

                            <----- CLOSED ---->

                            Kommentar


                            • #15
                              Alternativ wie hier bereits erwähnt:

                              Zitat von hausl Beitrag anzeigen
                              Das meint er ja.. mach die conn mal so: http://php-de.github.io/jumpto/pdo/#create-conn
                              PHP-Code:
                              $dsn  'mysql:dbname=test;host=localhost;charset=utf8';
                              $user 'root';
                              $pass '';
                              $options = array(
                                  
                              PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION,
                                  
                              PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_OBJ,
                                  
                              PDO::ATTR_EMULATE_PREPARES => false
                              );
                              $pdo = new PDO($dsn$user$pass$options); 
                              The string "()()" is not palindrom but the String "())(" is.

                              Debugging: Finde DEINE Fehler selbst! | Gegen Probleme beim E-Mail-Versand | Sicheres Passwort-Hashing | Includes niemals ohne __DIR__
                              PHP.de Wissenssammlung | Kein Support per PN

                              Kommentar

                              Lädt...
                              X