Fatal error: Call to undefined function testNome() in C:\xampp\...\...\index.php on line 51

  • Creatore Discussione Creatore Discussione oscar
  • Data di inizio Data di inizio

oscar

Nuovo Utente
17 Apr 2014
29
0
1
Buongiorno a tutti, volendo utilizzare una classe in php ho scritto un form con metodo POST e una classe che fa la validazione (approfittando di una funzione vista in w3school.com). Credo aver fatto bene ma non è cosi, da quando apro la pagina mi appare il : Fatal error: Call to undefined function testNome() in C:\xampp\...\...\index.php on line 51. Se qualcuno mi sa dire l'origine di questo errore, se c'è un concetto sbagliato, infine qualche idea, lo ringrazio in anticipo. Il form ha solo nome utente e password, il codice della classe:

class Control {
public $utente="";
public $pass="";
public function functionName() {
if ($_SERVER["REQUEST_METHOD"] == "POST"){
$this->utente = testNome($_POST["utente"]); LINE 51 NOMINATA ERRORE
$this->pass = testPass($_POST["pass"]);
}
else {
echo 'il metodo non è post';
}
}
public function testNome($dataut) {
$dataut = trim($dataut);
$dataut = stripslashes($dataut);
return $dataut;
}
public function testPass($datapa){
$datapa = trim($datapa);
$datapa = stripslashes($datapa);
return $datapa;
}
public function stampa_data (){
echo "<p>il nome dell'utente è " . $this->utente . "<br>";
echo "<p>la psw del utente è " . $this->pass . "<br>";
}
}
$escribe=new Control();
$escribe->functionName();
$escribe->stampa_data();
 
Semplicemente non trova testNome() e infatti nella classe ogni chiamata a membro interno va sempre usato il riferimento alla classe stessa, ovvero $this.
Le linee 51 e 52 vanno cambiate in:
PHP:
$this->utente = $this->testNome($_POST["utente"]);
$this->pass = $this->testPass($_POST["pass"]);
 
Tra l'altro ho dato un'occhiata a quella ...roba... e penso che bisognerebbe dargli una bella aggiustatina.
Presumo sia scritta per codice PHP 4 e prego tutti i santi sperando che nessuno lo usi più.
Quindi può diventare tranquillamente:
PHP:
<?php
class Controllo {
  public $dato;

  public function __construct( $dato ) {
    return trim( $this->controllaDato ( $dato );
  }

  public function __toString() {
    return $this->dato;
  }

  private function controllaDato( $dato ) {
    $options = array ( 'flags' => array( 'FILTER_FLAG_STRIP_LOW', 'FILTER_FLAG_STRIP_HIGH' ));
    $dato = filter_var( $dato, FILTER_SANITIZE_STRING, $options );
    return $dato;
  }
}

//  Poi richiami il tutto come sai:
//  Nota però che la funzione di controllo del metodo di invio è ora esterna alla classe!
//  Non solo, ho aggiunto la funzione di controllo del carattere, perché mica puoi dare per scontato che POST è sempre scritto a lettere maiuscole ;-)
if ( strtoupper( $_SERVER["REQUEST_METHOD"] ) == "POST" ) {
  $escribe = new Controllo( $_POST['utente'] );
}
//  Non devi fare altro, in $escribe ti trovi il dato di ritorno.
//  Riferimento: http://nl1.php.net/manual/en/language.oop5.magic.php#object.tostring
?>
Poi francamente non so come hai strutturato il tuo script, ma se questa è l'unica classe che usi, io eviterei proprio di usarla :)
Se programmi in OOP allora va bene usare gli oggetti ovunque, ma se è in procedurale non conviene usare una classe qua e la, meglio usare solo la procedurale e via.
In questo caso devi fare poco:
PHP:
<?php
function controllaDato( $dato ) {
    $options = array ( 'flags' => array( 'FILTER_FLAG_STRIP_LOW', 'FILTER_FLAG_STRIP_HIGH' ));
    $dato = filter_var( $dato, FILTER_SANITIZE_STRING, $options );
    return $dato;
}
if ( strtoupper( $_SERVER["REQUEST_METHOD"] ) == "POST" ) {
  $escribe = controllaDato( $_POST['utente'] );
}
?>
Che permette di usare meno codice di quanto scritto prima.
Io non so perché controlli anche la password dato che è meglio se ci sono caratteri "strani" la funzione che ho scritto li toglie e poi perché mostrarla all'utente, lui la sa già, meglio non farlo mai, se qualcuno sbircia gliela frega :)
 
grazie marcograzia, ma ancora non sono arrivato a questo livello di programmazione, lo script era solo per vedere come funziona la classe con un suo oggetto. Comunque risultano interessanti i consigli, domani li vedrò in dettaglio. Ho iniziato da poco a vedere PHP5.
 

Discussioni simili