Ankündigung

Einklappen
Keine Ankündigung bisher.

PHP, API, Implode - Nicht mehr als 765 Zeichen werden in Datenbankfeld übernommen

Einklappen

Neue Werbung 2019

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

  • PHP, API, Implode - Nicht mehr als 765 Zeichen werden in Datenbankfeld übernommen

    Hallo,

    Mit dem folgenden Code gelingt es mir Daten aus der GND abzufragen und per API in die eigene Datenbank zu integrieren.

    PHP-Code:
    <?php
                    
    //PHP Infos anzeigen lassen
                   //phpinfo();
              
    header('Content-type: text/html; charset=utf-8');
                
    // Inhaltstyp und Zeichenkodierung für Skript festlegen
                    
    $User_Agent 'Mozilla/5.0 (Windows NT 6.1; rv:60.0) Gecko/20100101 Firefox/60.0';

                
    $id $_POST["id"];                
                    
    // Übernahme Formulareingabe
                    
    $url "http://hub.culturegraph.org/entityfacts/$id";
                    
    // URL festlegen

                    
    $request_headers[] = 'Accept: application/json';
                    
    $request_headers[] = 'charset=utf-8';
                  
    $request_headers[] = 'Content-Type: application/json; charset=utf-8';
                  
    $request_headers[] = 'Accept-Encoding:    gzip, deflate, identity';
                  
    $request_headers[] = 'Accept-Language: de,en-US;q=0.7,en;q=0.3';
                  
    $request_headers[] = 'X-picturemaxx-api-key: key';
                    
    $request_headers[] = "Authorization: Bearer token";

                  
    $ch curl_init($url);
                  
    //  Initiate curl
            
    curl_setopt($chCURLOPT_USERAGENT$User_Agent);
                    
    curl_setopt($chCURLOPT_HTTPHEADER$request_headers);
            
    curl_setopt($chCURLOPT_RETURNTRANSFERtrue);
            
    curl_setopt($chCURLOPT_ENCODING"");
                    
    // Anfrage optimieren
                    // Execute
                    
    $result curl_exec($ch); // Performs the Request, with specified curl_setopt() options (if any).
            
    curl_close($ch);
            
    // Closing

            
    $data json_decode($resulttrue); // Dekodiert eine JSON-Zeichenkette, Übergibt an Variable

    $url2 "https://bpk.bs.picturemaxx.com/api/v1/editing/classifications/42/elements/2156013";

    $alternativData = array();
    foreach(
    $data['variantName'] as $alternativ) {
        echo 
    $alternativ " ; ";
        
    $alternativData[] = $alternativ;
    }

    $dataj = array (
      
    'classification_element_parent_id' => 0,
      
    'classification_element_matchcode' => '',
      
    'classification_element_foreignref' => '',
      
    'localized' =>
      array (
        
    'en-us' =>
        array (
          
    'classification_element_name' => '',
        ),
        
    'de-de' =>
        array (
          
    'classification_element_name' => substr(implode(' ; '$alternativData),,765),
        ),
      ),
    );


            
    $data_json json_encode($dataj);

                  
    $ch curl_init($url2);
                  
    // Set the url
            
    curl_setopt$chCURLOPT_URL$url2 );
            
    curl_setopt($chCURLOPT_USERAGENT$User_Agent);
                    
    curl_setopt($chCURLOPT_HTTPHEADER$request_headers);
            
    curl_setopt($chCURLOPT_ENCODING"");
            
    curl_setopt($chCURLOPT_RETURNTRANSFERtrue);
            
    curl_setopt($chCURLOPT_CUSTOMREQUEST'PUT');
                    
    curl_setopt($chCURLOPT_POSTFIELDS$data_json);

                    
    // Execute
                    
    $result2 curl_exec($ch); // Performs the Request, with specified curl_setopt() options (if any).
                    
    $code curl_getinfo($chCURLINFO_HTTP_CODE);
                    
    // Closing
            
    curl_close($ch);
    echo 
    "<br><br>"var_dump($alternativData);


    ?>
    Das Problem ist das nur bis zu 765 Zeichen in das Datenbankfeld 'classification_element_name' eingetragen werden. Sobald ich die Zahl auf 766 erhöhe bleibt das Datenbankfeld leer. Auch wenn ich bpsw. versuche die Zeichen ab der Stelle 765 bis 800 ausgeben zu lassen bleibt das Feld leer. Woran kann das liegen?

    PHP-Code:
    $dataj = array (
      
    'classification_element_parent_id' => 0,
      
    'classification_element_matchcode' => '',
      
    'classification_element_foreignref' => '',
      
    'localized' =>
      array (
        
    'en-us' =>
        array (
          
    'classification_element_name' => '',
        ),
        
    'de-de' =>
        array (
          
    'classification_element_name' => substr(implode(' ; '$alternativData),,765),
        ),
      ),
    ); 
    Danke und Grüße

  • #2
    Zitat von SIB Beitrag anzeigen
    Das Problem ist das nur bis zu 765 Zeichen in das Datenbankfeld 'classification_element_name' eingetragen werden. Sobald ich die Zahl auf 766 erhöhe bleibt das Datenbankfeld leer. Auch wenn ich bpsw. versuche die Zeichen ab der Stelle 765 bis 800 ausgeben zu lassen bleibt das Feld leer. Woran kann das liegen?
    An der maximalen Feldlänge oder daran, dass ungültige Zeichen verwendet werden.

    Kommentar


    • #3
      Hallo Hellbringer,

      die maximale Feldlänge kann nicht sein da ich sobald die 765 Zeichen übertragen sind noch weitere Zeichen manuell nachtragen kann. Oder könnte das bei der PUT-Übetragung begrenzt sein?
      Ungültige Zeichen kann ich glaube ich auch ausschließen. Nachfolgend die Zeichenkette, die schon erfolgreich übernommen wird (also zeichen 0-765)

      Johann Wolfgang Goethe ; Johan Wolfgang von Goethe ; Johan Wolphgang Goethe ; Johan W. von Goethe ; Joh. Wolfg. v. Goethe ; J. Wolfgang Goethe ; J. W. v. Goethe ; J. W. Goethe ; Jan Wolfgang Goethe ; Jean Wolfgang von Goethe ; Juan Wolfgang von Goethe ; Juan Wolfgang Goethe ; Juan W. Goethe ; João Wolfgang von Goethe ; Iohann Wolfgang Goethe ; Iohan Wolphgang Goethe ; Ioannes W. Goethe ; I. W. Goethe ; Wolfgango Goethe ; Wolfango Goethe ; W. von Goethe ; Volfgango Goethe ; Volfango Goethe ; Giov. L. Goethe ; G. L. Goethe ; Goethe ; Johann Wolfgang Von Goethe ; Goethius ; Johann W. êvonë Göthe ; Jan Wolfgang Göthe ; Jan Wolfang Göthe ; J. W. von Göthe ; Giov. Volfango Göthe ; Göthe ; Iogann V. Göte ; Göte ; Iohan V. p'on Goete ; Iohan

      und so geht die Zeichenkette eigentlich weiter

      Volp'gang Goet'e ; Goet'e ; Goe te ; Gêôt'ê ; Jochan Volfgang G'ote ; Yohan Volfgang Gete ; V. f. G'ote ; G'ote ; J. V. Gót ; Gót ; I. V. Go't ; Goithios ; Gotenin ; Gejteh ; Jōhan Wolfgang fon Gete ; Johann Volʹfgang Gete ; Johans Volfgangs Géte ; Johanas Volfgangas Gėtė ; Jochan Volfgang Gete ; Jogann Vol'fgang fon Gete ; Jogann Vol'fgang êfonë Gete ; Jogann-Vol'fgang Gete ; J. V. Gete ; J.-V. Gete ; Iogann W. Gete ; I. W. Gete ; Iohan Volfgang Gete ; Iogann Vol'fgang Gëte ; Johann Volfgang Gëte ; Iogann Vol'fgang Ge͏̈te ; I. V. Gete ; I.-V. Gete ; Yohan Wolfgang Gete ; Yôhân Wôlfgang fôn Gete ; Yôhan Wolfgang Gête ; Yohann Volfqanq Gete ; Yogann Volʹfgang Gete ; Y. W. Gete ; Y. W. Gêtê ; Volʹfgang Gete ; V. Gete ; Egan Vol'fgang Gete ; Gete ; Gēte ; Gě'ṭe ; G. Gette ; Yuehan Wofugang Gede ; Gede ; Ge de ; Yohan Ṿolfgang fon Geteh ; Yūhān Wulfgāng fun Gūta ; Yūhān Wulfgāng fūn Gūta ; Yūhān Wulfǧānǧ fūn Ǧūta ; Gūta ; Ǧīta ; Ǧītā ; Ǧītah ; Ǧītih ; Johan Wolphgang Giote ; J. W. Giote ; Jochan Volfgang Gǐote ; J. V. Giote ; Yūhān Fūlfġānḡ Ġūta ; Yūhān Fūlfġānḡ Ġūtah ; Yūhān Vūlfġanġ fūn Ġūtih ; Yūhān Fūlfġānḡ Ġūtih ; Yohan Welfgang fon Goytä ; Johān Bholphgãā Gyote ; Yohan Wolfgang Gyot'e ; Yohan Volfgang Gyot'e ; YŚuhŚan VŚulf·gan·g fŚun GŚutih ; Giochan Bolphnkannk phon Gkaite ; Giochan Bolphnkannk êphonë Gkaite ; Giochan B. phon Gkaite ; Iōann Mpolphgang Gkaite ; Gkaite ; Yohan Polp'ŭgang p'on Koet'e ; Koet'e ; Volfkank Kêôt'ê ; Kēōthē ; Johann Volfgang Kote ; Jochann Volfgang Kote ; J. V. Kote ; V. Kote ; Johann-Vol'fhanh Hete ; E͏̈han Vol'fhanh He͏̈te ; Ëhan Vol'fhanh Hëte ; Iohann Volfqanq Höte ; Yo han Bol peu gang pon Goe te ; Yohan-Bolpeugang-pon-Goete ; Yue han Wo fu gang Ge de ; Yuehan-Wofugang-Gede ; Yohan Wolfgang Gyote ; Johann Wolfgang v. Goethe ; Johann W. von Goethe ; Johann W. Goethe ; J. W. von Goethe ; Wolfgang von Goethe ; Wolfgang Goethe ; Johan Volfgang Gete ; Iogann Volʹfgang Gete ; J.V. Gete ; I.V. Goithios ; Yohan Vorufugangu Fon Gēte ; Yūhān Fūlfġānġ fūn Ġūtih ; Goythe ; J.W. von Goethe ; J.W. Goethe ; Йоҳанн Волфганг Гёте ; 歌德 ; 約翰・沃爾夫岡・馮・歌德 ; 约翰・沃尔夫冈・冯・歌德 ; ヨハン・ヴォルフガング・フォン ゲーテ ; יוהן וולפגנג פון גתה ; 歌德 ; ヨハン・ヴォルフガング・フォン ゲーテ ;

      Wenigstens "Volp" müsste er doch wenigstens noch erfolgreich übernehmen.

      Kommentar


      • #4
        Dann frag mal den Anbieter der API, wo der Fehler liegt. Wenn Daten nicht übernommen werden, müsste am Zielsystem ja ein Fehler aufscheinen.

        Kommentar


        • #5
          Was soll den heißen:
          und so geht die Zeichenkette eigentlich weiter
          Ist da evtl. ein Steuerzeichen zwischen, das nicht verarbeitet werden kann, o.ä.
          Ansonsten, wie schon empfohlen: API-Anbieter kontaktieren, die haben das evtl. schon mal bei jemand anderem gehabt...
          Competence-Center -> Enjoy the Informatrix
          PHProcks!Einsteiger freundliche TutorialsPreComposed Packages

          Kommentar


          • #6
            Probleme mit speziellen Zeichen habe ich auch vermutet. Verstehe halt nur nicht warum nicht wenigstens das nachfolgende "V" noch übernommen wird. Also muss es ja etwas mit der Länger der Zeichenkette zu tun haben. Wenn ich die gesamte Zeichenkette manuell in das Datenbankfeld eintrage funktioniert das, auch mit allen Sonderzeichen.

            Mit var_dump sieht die Stelle an der es stoppt wie folgt aus

            string(19) "Iohan V. p'on Goete" [37]=> string(22) "Iohan Volp'gang Goet'e"

            Bis zum zweiten Iohan wird alles übernommen und dann geht es nicht weiter.

            Arne Drews das soll heißen das dies der Rest des Strings ist der nicht in das Datenbankfeld übernommen wird.

            Kommentar


            • #7
              Hast Du Dir auch mal $data, respektive $result angesehen, was da drin steckt?

              Ach nee, vergiss es... habs falsch gelesen im Quellcode...
              Competence-Center -> Enjoy the Informatrix
              PHProcks!Einsteiger freundliche TutorialsPreComposed Packages

              Kommentar


              • #8
                Ok ich habe den Fehler gefunden. Ich habe $request_headers[] = 'Expect: '; und $request_headers[] = 'Content-Length: ' . strlen($data_json); nicht gesetzt. Damit lassen sich nun beliebig viele Zeichen übertragen.
                Ich wurde inspiriert durch diese Lösung: https://stackoverflow.com/questions/...ctation-failed
                Begründung (aus obigen Link):
                I think I found out why it works, so for anyone curious: apparently for data > 1024 bytes CURL automatically sets "Expect: 100-continue" (the client expects the server to only fetch the header and then send a "100" return code to get the rest of the data). If the server can't be bothered, CURL produces this error. Setting "Expect: " explicitly disables this automatic behaviour.

                Kommentar

                Lädt...
                X