Visualizzazione dei risultati da 1 a 7 su 7
  1. #1

    Forward di dati tra due siti diversi

    Salve, anticipo che non sono molto esperto di PHP e HTML.
    Sto cercando di realizzare una pagina web che visualizzi i dati raccolti da alcuni sensori tramite Arduino.
    Ho sottoscritto un servizio di hosting gratuito nel quale ho creato la pagina e il database necessario. Purtroppo non riesco ad inviare direttamente i dati a questa pagina, probabilmente perchè si tratta di un server condiviso ed arduino non gestisce bene la cosa. Per risolvere il problema ho installato Apache /MySQL/PHP su una macchina nella mia rete e qui posso popolare il database. Ho pensato quindi di fare in modo che quando il mio pc riceve i dati li invii a sua volta al server remoto tramite una chiamata GET nello script PHP che uso per inserire i dati nel DB. Inserendo i dati tramite un form HTML tutto funziona regolarmente, quando i dati vengono inviati da Arduino invece finiscono solo nel database locale.
    Sapete darmi una mano? Come fa il server remoto a distinguere i due casi. Ho cercato nei log di Apache ed ho trovato questa differenza: nella richiesta fatta da messaggio Arduino dopo la stringa GET/..... ci sono due codici 302 e 49 seguiti da "-" "-"
    Nella richiesta generata da inserimento dati nel form i codici sono 302 697 seguiti dal nome della pagina php "http://localhost/get_test.html" e da un header "Mozzilla(5.0 (windows NT 10; Win64; x64) ..........."
    Sapete aiutarmi a fare in modo che lo script funzioni in entrambi i casi?
    Grazie in anticipo
    Questo è il codice PHP:
    Codice PHP:
    REPLACE with your Database name
    $dbname 
    "sensor_data";
    // REPLACE with Database user
    $username "username_DB";
    // REPLACE with Database user password
    $password "PWD_DB";

    // Keep this API Key value to be compatible with the ESP32 code provided in the project page. If you change this value, the ESP32 sketch needs to match
    $api_key_value "xxxxxxxxx";
     
    $api_key $value1 $value2 $value3 "";

    foreach(
    getallheaders()as $name=>$value){

    echo
    "$name:$value\n";

    }
     
     
    header("Location: http://aqair.byethost31.com/getdata.php?api_key=xxxxxxxxx&value1=12&value2=13&value3=14&submit_b=");

    if (
    $_SERVER["REQUEST_METHOD"] == "GET") {

        
    $api_key test_input($_GET["api_key"]);

        if(
    $api_key == $api_key_value) {
            
    $value1 test_input($_GET["value1"]);
            
    $value2 test_input($_GET["value2"]);
            
    $value3 test_input($_GET["value3"]);
             
    // Create connection
            
    $conn = new mysqli($servername$username$password$dbname);
            
    // Check connection
            
    if ($conn->connect_error) {
                die(
    "Connection failed: " $conn->connect_error);
            }
            
    $sql "INSERT INTO Sensor (value1, value2, value3)
            VALUES ('" 
    $value1 "', '" $value2 "', '" $value3 "')";

            if (
    $conn->query($sql) === TRUE) {
                echo 
    "New record created successfully";
            }
            else {
                echo 
    "Error: " $sql "<br>" $conn->error;
            }
            
    $conn->close();
        }
        else {

            echo 
    "Wrong API Key provided.";
        }
    }
    else {

        echo 
    "No data posted with HTTP GET.";

    }
    function 
    test_input($data) {
        
    $data trim($data);
        
    $data stripslashes($data);
        
    $data htmlspecialchars($data);
        return 
    $data;

    Ultima modifica di Alhazred; 26-08-2021 a 20:03

  2. #2
    Moderatore di PHP L'avatar di Alhazred
    Registrato dal
    Oct 2003
    Messaggi
    12,257
    Ciao,
    questo codice non ti va in errore? Esegui una chiamata ad header() dopo degli echo, il che dovrebbe sollevare un errore.

    Nel caso gli echo non fossero eseguiti perché la condizione del ciclo fosse subito falsa, header() ti manderebbe al link indicato come "location" ed il resto del codice non sarebbe eseguito.

    Io ci vedo diversi problemi in questo codice, ma non saprei come aiutarti perché non so di preciso come deve funzionare il processo che stai mettendo su.
    Prova a spiegare passo passo cosa dovrebbe succedere nel tuo codice o cosa vorresti che succedesse.

    P.S. come hai fatto per nome db e password, evita di inserire in chiaro qualsiasi dato di accesso a servizi, tipo la API Key, adesso te la modifico io.
    Earth2: 3QCNSPFQUH

  3. #3
    Innanzi tutto grazie per la risposta. Non preoccuparti il valore api_key non è quello vero.
    La chiamata header l'ho spostata li per debug, per capire se non venisse eseguita perchè il codice si bloccava prima, il posto corretto è in fondo allo script.
    Cerco di spiegare meglio quello che devo fare:
    Lo script allegato riceve una serie di dati da una fonte esterna tramite una chiamata GET. I dati vengono inseriti nelle rispettive variabili e se il valore di api_key è corretto vengono inserite in un database locale.
    Il passo successivo è eseguire una nuova chiamata GET ad una pagina che si trova su un server esterno (il vero obbiettivo di tutto il progetto) che è esattamente uguale a questa, e che serve per inserire i dati nel db remoto.
    Questo script mi serve come trucco per riuscire a far dialogare arduino con il server remoto.
    Quando inserisco i dati manualmente tramite un form HTML funziona tutto, i dati vengono inseriti in entrambi i database. Quando la chiamata allo script arriva da arduino invece i dati vengono inseriti solo nel DB locale.
    Spero di essermi spiegato meglio.

  4. #4
    Per quale motivo usi header location?

    Effettua direttamente la chiamata HTTP dal PHP usando una client (es. Zttp) oppure se è una semplice richiesta GET, con un file_get_contents().

  5. #5
    Purtroppo non sono molto pratico di PHP quindi non so come fare. Potresti spiegarti un pò meglio? Grazie

  6. #6
    Per maggiore completezza vi riporto i log di Apache generati dallo script nei due casi:
    1) input manuale da form: "GET /getdata.php?api_key=xxxxxx&value1=7&value2=2&value 3=7&submit_b= HTTP/1.1" 302 31 "http://localhost/get_test.html" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/92.0.4515.159 Safari/537.36 Edg/92.0.902.78"
    2)Chiamata eseguita da arduino:
    192.168.1.45 - - [26/Aug/2021:21:34:38 +0200] "GET /getdata.php?api_key=xxxxxx&value1=12&value2=13&val ue3=14&submit_b= HTTP/1.1" 302 31 "-" "-"
    192.168.1.45 - - [26/Aug/2021:21:34:43 +0200] "Connection: close" 400 325 "-" "-"

  7. #7
    Utente di HTML.it
    Registrato dal
    Oct 2011
    Messaggi
    106
    È difficile aiutarla perché è come se gioca alla Playstation con occhi bendati e premendo qualsiasi cosa al joystick senza cognizione di causa.
    Da codice php per effettuare connessioni esterne , è sufficiente impostare
    Codice PHP:
    //mostra Notice e Warnings
    error_reporting(-1); // sempre se l'intero di Arduino è a complemento a due, se gestito direttamente da php dovrebbe funzionare,
    //altrimenti complemento a uno ~0 (cioè in entrambi i casi imposta tutti i bit a 1, nel suo caso un numero intero).
    ini_set('display_startup_errors'true)
    ini_set('display_errors'true)
    var_dump($non_esisto); // Visualizza Notice o Warnings 
    var_dump(file_get_contents('https://www.google.com/'));
    //Mentre la variabile array $_GET è disponibile se la connessione esterna coincide dov'è installato e in esecuzione php.
    //non utilizzare la funzione test_input altrimenti ti stai bendando gli occhi
    if(isset($_GET['primo_valore'], $_GET['secondo_valore']))
    // solo se esistono tutti i valori,  altrimenti niente
    //..

    Beh semplicemente l'errore di stato http 400 significa pagina inesistente o più propriamente Richiesta errata.
    Inoltre ricorda il parser php opera solo con file con estensione .php e non .html se non configurato specificamente.

Tag per questa discussione

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2021 vBulletin Solutions, Inc. All rights reserved.