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

    Problema $_POST lettura database errato

    Salve, ho un problema con l'invio di una variabile allo script php.
    In pratica se setto la variabile sullo script php, la ricerca sul database va come dovrebbe, se invece la invio da un form sulla pagina html, questa variabile risulta corretta sullo script php, ma la ricerca nel database (che dipende da quella variabile) mi da risultati errati.

    ecco il codice di index.html
    codice:
    <input type="text" name="distanza" size="2">
    ed ecco il codice su index.php
    Codice PHP:
    $maxdist 20
    se su index.php lo setto a 20, la query mysql restituisce i dati esatti

    se invece su index.php metto questo
    Codice PHP:
    $maxdist $_POST['distanza']; 
    in entrambi i casi se metto un echo subito dopo questa istruzione, mi restituisce il valore esatto (ad esempio 20), ma le query si comportano in modo diverso.


    Premetto che eseguo dei calcoli su questa variabile prima di chiamare la query. La cosa strana è che eseguo dei calcoli anche con delle altre variabili inviate tramite form, e su quei dai tutto fila liscio. Per rendere più chiara l'idea:

    sul file index.html
    codice:
    <form action="index.php" method="post">
    Inserisci coordinate
    
    X: <input type="text" name="xx" size="3"> Y: <input type="text" name="yy" size="3">
    <hr>
    Inserisci distanza massima
    
    <input type="text" name="distanza" size="3">
    <hr>
    <input type="submit" value="Vai">
    </form>
    su index.php
    Codice PHP:
    $cpx $_POST['xx'];
    $cpy $_POST['yy'];
    $maxdist 20
    se impostato così funziona perfettamente, se mando dal form anche la variabile $maxdist, i risultati della query sono sbagliati.

    faccio anche un sempio di risultato delle 2 query.
    quella giusta mi da come risultato:

    Distanza
    2
    3
    4
    6
    6
    7
    eccetera

    quella errata mi da come risultato:

    Distanza
    2
    11
    12
    12
    12
    14
    14
    14
    eccetera


    Spero di aver fornito tutte le informazioni necessarie, grazie a chi saprà aiutarmi.

  2. #2
    Utente di HTML.it
    Registrato dal
    Apr 2004
    Messaggi
    3,709
    dovresti semplicemente stampare a video la query generata in entrambi i casi (magari c'è qualche carattere "spurio" con il "20" ed è sufficiente un type-casting)

  3. #3
    Posto un altro po' di codice così magari è più semplice

    Codice PHP:
    //calcolo distanza tra 2 punti in un piano cartesiano
    $potx bcpow(($cpx $cx), 2$scale null);
    $poty bcpow(($cpy $cy), 2$scale null);
    $distvirg sqrt($potx $poty);
    //tronco il risultato a sole due cifre dopo la virgola
    $dist number_format($distvirg2,",",".");

    if(
    $dist <= $maxdist) { //se la distanza è minore a quella inserita, inseriscila in una tabella temporanea
        
    $newquery "INSERT INTO tempo (id,nomeg,nomev,cordx,cordy,pop,dist) VALUES ('','$ngioc','$nvill','$cx','$cy','$pop','$dist')";
        
    mysql_query($newquery) or die(mysql_error());

    il problema è in quell'if, va ad inserire in tabella dei record che non mi interessano perchè non rispecchiano la condizione che ho dato (faccio sempre l'esempio con 20 come distanza massima), ma non capisco che condizione controllino!
    mandando in output $maxdist il valore è quello immesso nel form.
    che ci voglia qualche conversione?
    se si, come mai non devo fare la stessa con gli altri valori inseriti ($cpx) visto che comunque faccio delle operazioni matematiche, o in quel caso la conversione la fa in automatico? ($poty = bcpow(($cpy - $cy), 2, $scale = null)

  4. #4
    Utente di HTML.it
    Registrato dal
    Apr 2004
    Messaggi
    3,709
    prima dell'if fai due var_export delle due variabili usate... e cmq c'è un errore di fondo: usi number_format e utilizzi il valore restituito in un confronto numerico, ma number_format restituisce un tipo string... se devi approssimare i valori devi usare funzioni numeriche

  5. #5
    fatto il var_export, e questo è il risultato
    codice:
    '83,24''20''44,72''20''97,58''20''105,85''20''125,54''20''104,55''20''92,61''20'
    il codice l'ho fatto di fretta, e di php non ne sono molto esperto (o meglio, è da 3 anni che non lo uso)

    ho cercato con google la prima soluzione utile per evitare che il risultato fosse del tipo 83,24567543627 e lasciando solo le prime due cifre decimali.

    il confronto funziona se imposto la variabile manualmente, se la devo andare a recuperare dal form i risultati sono errati.

    se devi approssimare i valori devi usare funzioni numeriche
    in che modo?

    se il number_format restituisce un valore string, dovrebbe non funzionare anche se imposto la mia variabile manualmente? la variabile che mi invia il form non è pure di tipo stringa?

    perdonami se sto dicendo delle bestialità, ma come ho scritto prima non uso php da un bel po' di tempo, ci ho rimesso mano oggi ed è stato difficile anche fare un echo.....

  6. #6
    Utente di HTML.it
    Registrato dal
    Apr 2004
    Messaggi
    3,709
    a me sembra ci sia un problema con i tipi... ti direi di togliere "number_format" da lì spostandolo dopo l'if, quindi:

    Codice PHP:
    ...

    if(
    $distvirg <= $maxdist) { //se la distanza è minore a quella inserita, inseriscila in una tabella temporanea 
        
    $dist number_format($distvirg2,",","."); 
        
    $newquery "INSERT INTO tempo (id,nomeg,nomev,cordx,cordy,pop,dist) VALUES ('','$ngioc','$nvill','$cx','$cy','$pop','$dist')"
        
    mysql_query($newquery) or die(mysql_error()); 


  7. #7
    ho provato a spostarlo, ma il risultato è che adesso nella tabella non inserisce record, anzi inserisce solo il primo record (prelevato da un'altra tabella).

    il number format restituisce:
    A formatted version of number.

    ho risolto "forzando" il tipo int quando vado a ricavarla dal form.

    Codice PHP:
    $maxdist = (int)$_POST['distanza']; 
    essendo entrambi numeri riesce a fare il confronto nell'if e funziona!

    adesso ho però un'altra domanda....quando vado a scrivere il valore di $dist nella tabella, anzichè essere del tipo 83,24 è invece di tipo intero, quindi solo 83. non sono fondamentali quelle 2 cifre dopo la virgola, ma se riesco a tenerle non sarebbe affatto male (almeno, non sono fondamentali per quel che devo fare adesso, ma devo creare anche uno script che calcoli la distanza di due punti in un orario, e quelle 2 cifre mi serviranno)

    il campo dove va a finire $dist nella tabella, è di tipo INT, ho provato cambiandolo in FLOAT ma non ci sono differenze...in cosa sbaglio?

    un'altra cosa, c'è un modo per arrotondare il risultato senza usare number_format?

    grazie ancora

  8. #8
    Utente di HTML.it
    Registrato dal
    Apr 2004
    Messaggi
    3,709
    secondo me devi riscrivere un po' il pezzo di codice badando alle cose fin qui discusse... per arrotondare si deve usare round (es.: round(2.7324, 2) = 2.73), mentre number_format restituisce sì una formattazione ma il tipo è chiaramente indicato come "string"... nel db se hai messo un tipo FLOAT e stai inserendo il dato giusto (quindi NON arrotondato) verifica che il formato sia corretto (probabilmente con la notazione anglosassone e quindi il "." come separatore decimale)

  9. #9
    perfetto ho sostituito

    Codice PHP:
    $dist number_format($distvirg2,",","."); 
    con round()

    Codice PHP:
    $dist round($distvirg2); 
    e messo il risultato di round() nel campo della tabella di tipo float, e adesso funziona alla perfezione

    grazie mille per l'aiuto

  10. #10
    Utente di HTML.it
    Registrato dal
    Apr 2004
    Messaggi
    3,709
    Perfetto! Solved, allora.

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 © 2025 vBulletin Solutions, Inc. All rights reserved.