Pagina 1 di 2 1 2 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 11
  1. #1

    Connessione al database

    Salve,
    ho cercato di creare una classe per la connessione al database, non capisco perché non funziona inoltre non mi ritorna nessun errore. Dove sbaglio? I dati inseriti che fornisco per la connessioni sono corretti, perché ho provato a far mysql_connect(dati) e funziona

    Vi riporto qui sotto la classe, magari una volta risolto il problema potrà tornare utile a qualche altra persona.

    Codice PHP:
    <?php
    /**
     * Connessione al database
     */

    class Connection {
      
        private 
    $s_conn;

        public function 
    Connection() {
            global 
    $DB;

            
    $this->s_conn $this->mysql($DB['host'], $DB['user'], $DB['pass'], $DB['name']);
        
            return 
    $this->s_conn;
        }
      
        
    /**
         * Funzione per la connessione al database
         */
        
    public function mysql($host$user$pass$dbname) {
        
            
    // Connessione
            
    $conn = @mysql_connect($host$user$pass);
            
    // Scelta del database
            
    $select_db = @mysql_select_db($dbname$conn);
                    
            
    // Verifico eventuali errori di connessione
            
    if($conn == FALSE || $select_db == FALSE){
                
    $conn $this->error();            
            }
        
            
    // Codifica dei caratteri    
            
    $this->query("SET NAMES 'utf8'");
            return 
    $conn;
         }    

        
    /**
         * Funzioni per l'interazione con il database 
         */
        
    public function query() {
            
    // Controllo i dati forniti
            
    $query $this->mysql_escape_query(func_get_args());
            
    // Ritorno la query eseguita
            
    return mysql_query($query);
          }    
      
          public function 
    fetch_array($result) {
              
    // Ritorno i dati risultati da una query in un array associativo, numerico o entrambi
               
    return mysql_fetch_array($result);
          }
      
          public function 
    fetch_assoc($result) {
              
    // Ritorno i dati risultati da una query in un array associativo
            
    return mysql_fetch_assoc($result);
          }
      
          public function 
    fetch_object($result) {
              
    // Ritorno i dati risultati da una query sotto forma di oggetto
            
    return mysql_fetch_object($result);
          }
      
          public function 
    num_rows($result) {
              
    // Ritorno il numero di righe generati da una query
               
    return mysql_num_rows($result);
          }
      
          public function 
    insert_id() {
              
    // Ritorno l'ultimo id inserito
               
    return mysql_insert_id();
          }  
      
          public function 
    error() {
              
    // Ritorno il messaggio d'errore 
            
    return mysql_error();
          }    
      
          public function 
    close() {
            
    mysql_close($this->s_conn);
          }
      
          public function 
    mysql_escape_query($argv) {
              
    // Eseguo un controllo sui dati, per filtrare e prevenire tentativi di SQL injection
            
    $argc count($argv);
            
    $q '';
            for (
    $i 0$i $argc$i++) {
                  if (
    $i&1) {
                    if (
    is_array($argv[$i])) {
                          
    $aux "";
                          foreach(
    $argv[$i] as $x)
                            
    $aux .= "'".mysql_escape_string(trim($x))."',";
                          
                        
    $q .= trim($aux,",");
                    } else {
                          
    $q .= "'".mysql_escape_string(trim($argv[$i]))."' ";
                    }
                  } else {
                    
    $q .= $argv[$i];
                  }
            }
            return 
    $q;
          }
          
          public function 
    super_escape_string($in_str) {
            
    // Altra funziuone di controllo sui dati
            
    $conn = new Connection;
            
            
    $in_str trim($in_str);
            
    $in_str stripslashes($in_str);
            
    $character get_html_translation_table(HTML_ENTITIESENT_QUOTES);
            
    $in_str strtr($in_str$character);    
            
    $in_str mysql_real_escape_string($in_str);
            
            
    $conn->close();
            return 
    $in_str
        }
        
    }

    ?>
    Per richiamarla faccio semplicemente

    Codice PHP:
    $conn = new Connection;
    $conn->query("query da eseguire"); 
    Grazie in anticipo a tutti coloro che mi aiuteranno a risolvere il problema.
    La rovina del mondo sara' l'indifferenza. Ma chi se ne frega!!

  2. #2
    Mmmm... La classe è alquanto complicata.
    Da un primo esame direi che il problema è certamente causato dalla funzione query, dato che però mi sembra corretta, direi che, più precisamente, è dato dalla funzione mysql_escape_query, che, evidentemente ritorna "", perciò la query eseguita risulta vuota. Non ho captio molto di questa funzione (in particolare, che vuol dire $i&1?), ma, ad occhio, mi sembra corretta anche questa. C'è solo un'altra possibilità, dunque:super_escape_string.
    Secondo me il problema è quel new Connection. Forse creare un oggetto con una classe in se stessa genera un errore.


    Un'altra possibilità può essere, molto semplicemente, che ti sei dimenticato, nel codice, di inserire $conn->Connection(), prima di utilizzare le altre funzioni della classe, altrimenti risulteranno ovviamente inutili senza la connessione al database.
    Se vuoi che una funzione venga eseguita alla creazione di un oggetto, devi chiamarla __construct(....

    Un'ultima cosa: togli quelle @, forse l'errore avviene a livello di connessione.

    Spero di esserti stato utile!
    Fammi sapere!

  3. #3
    il fatto è che con il test eseguito non ho provato a eseguire una query, mi sono limitato solamente alla connessione.

    Ho provato come hai detto tu a sostituire il nome della funzione che deve partire automaticamente con __construct, e a togliere le @ ma sempre con il medesimo risultato.. quando viene chiamata la classe il codice dopo non viene eseguito.
    La rovina del mondo sara' l'indifferenza. Ma chi se ne frega!!

  4. #4
    Ho risolto, non era la classe ad essere sbagliata, ma era sbagliato come includevo il file usavo l'url del file invece che il path.

    Ho notato però che la classe non mi ritorna gli errori.

    Se si prova a verificare la connessione in questa maniera
    Codice PHP:
    $conn = new Connection;
    if(
    $conn
      echo 
    'Connessione OK';
    else
      echo 
    'Errore: ' $conn->error(); 
    Ho provato a inserire la password per la connessione sbagliata ma il codice di verifica mi ritorna sempre Connessione OK
    La rovina del mondo sara' l'indifferenza. Ma chi se ne frega!!

  5. #5
    direi di partire a studiare le basi della programmazione a oggetti
    http://www.php.net/manual/en/language.oop5.basic.php

    inoltre è poco sensato usare una variabile globale per passare i valori alla classe, passali direttamente al costruttore come singoli elementi ^^ (le variabili globali sono lente, sconsigliate e soprattutto ti troncano la portabilità del codice)

  6. #6
    Ho fatto come hai suggerito e ho eliminato le variabili globali

    Codice PHP:
    ...
    private 
    $s_conn
    private $db_host 'localhost';
    private 
    $db_user 'user';
    private 
    $db_pass '*****';
    private 
    $db_name 'dbname';

    ... 
    ma il mio problema rimane che non riesco a far tornare l'errore dalla funzione mysql

    teoricamente se $conn='' dovrebbe ritornare FALSE e quindi catturare l'errore ma non è così.

    Codice PHP:
    ..
        public function 
    mysql($host$user$pass$dbname) { 
         
            
    // Connessione 
            
    $conn = @mysql_connect($host$user$pass); 
            
    // Scelta del database 
            
    $select_db = @mysql_select_db($dbname$conn); 
                     
            
    // Verifico eventuali errori di connessione 
            
    if($conn == FALSE || $select_db == FALSE){ 
                
    $conn FALSE
            
    } else {
                   
    // Codifica dei caratteri     
                   
    $this->query("SET NAMES 'utf8'"); 
           }
            return 
    $conn
        }     
    .. 
    Grazie per l'aiuto che mi state offrendo
    La rovina del mondo sara' l'indifferenza. Ma chi se ne frega!!

  7. #7
    Il problema è che $conn, non è il valore ritornato da __construct, che di fatto non può ritornare nulla, ma, bensì un'oggetto, che quindi ha sempre valore true.
    Se vuoi verificare la connessione devi chiamare la funzione, non __construct, ma, ad esempio, connection. In questo modo puoi utilizzarla così:
    $verifica=$conn->connection();
    Allora sì che ti restituirà il valore desiderato.

  8. #8
    Originariamente inviato da Chef89
    teoricamente se $conn='' dovrebbe ritornare FALSE e quindi catturare l'errore ma non è così.
    Il costruttore della classe, che tu dichiari con public function Connection() ...., non può restituire assolutamente nulla ... perché serve a inizializzare la classe, ovvero serve a preparare la classe a far svolgere il suo ruolo (inclusioni di altri file, letture dal database e via dicendo)

    leggere il manuale fa bene alla salute e fa risparmiare tempo

    Ho fatto come hai suggerito e ho eliminato le variabili globali

    Codice PHP:
    ...
    private 
    $s_conn
    private $db_host 'localhost';
    private 
    $db_user 'user';
    private 
    $db_pass '*****';
    private 
    $db_name 'dbname';

    ... 
    ehm ... se le metti li, già impostate, non cambia molto ... le devi passare al costruttore cosi il costruttore le imposta con

    $this->db_host = $db_host;

    e via dicendo

    (se tu dichiari il costruttore con public function Connection($db_host, .....) ....)

  9. #9
    Originariamente inviato da daniele_dll
    Il costruttore della classe, che tu dichiari con public function Connection() ...., non può restituire assolutamente nulla ... perché serve a inizializzare la classe, ovvero serve a preparare la classe a far svolgere il suo ruolo (inclusioni di altri file, letture dal database e via dicendo)

    leggere il manuale fa bene alla salute e fa risparmiare tempo



    ehm ... se le metti li, già impostate, non cambia molto ... le devi passare al costruttore cosi il costruttore le imposta con

    $this->db_host = $db_host;

    e via dicendo

    (se tu dichiari il costruttore con public function Connection($db_host, .....) ....)
    Non è che non lo leggo il manuale o che non ne abbia già letti, anzi ho diversi libri in quanto mi documento e imparo da autodidatta. La questione è che talvolta certe spiegazioni mi risultano più semplici capirle quando ho già una base mentre altre non vogliono proprio entrarmi in testa

    Per intenderci le altre classi che ho fatto funzionano correttamente è solo questa della connessione che da quando l'ho implementata mi sta dando diversi problemi.

    Riguardo a quanto dici di passarle direttamente al costruttore ti riferisci a scrivere cosÌ? Ma teoricamente ogni volta che dovrei fare una connessione dovrei passare tutti i dati, mentre prima li settavo dal file di configurazione.

    Codice PHP:
    ... 
    private 
    $s_conn 
      
        private 
    $s_conn;

        public function 
    Connection($DB_HOST$DB_USER$DB_PASS$DB_NAME) {
            
            
    $this->host $DB_HOST;
            
    $this->user $DB_USER;
            
    $this->pass $DB_USER;
            
    $this->name $DB_NAME;

            
    $this->s_conn $this->mysql($this->host$this->user$this->pass$this->name);
        
            return 
    $this->s_conn;
        }
      
    ... 
    La rovina del mondo sara' l'indifferenza. Ma chi se ne frega!!

  10. #10
    Originariamente inviato da quit10
    Il problema è che $conn, non è il valore ritornato da __construct, che di fatto non può ritornare nulla, ma, bensì un'oggetto, che quindi ha sempre valore true.
    Se vuoi verificare la connessione devi chiamare la funzione, non __construct, ma, ad esempio, connection. In questo modo puoi utilizzarla così:
    $verifica=$conn->connection();
    Allora sì che ti restituirà il valore desiderato.
    Facendo come mi hai consigliato ora vedo che funziona.. ovvero riesco a verificare se la connessione è OK o c'è un errore.. però non riesco a stampare a video l'errore.

    [php]$conn-> new Connection;
    if($conn->Connection())
    echo 'Connessione OK';
    else
    echo 'Errore: ' . $conn->error();[/php|

    facendo un var_dump di $conn ottengo
    codice:
    object(Connection)#1 (1) { ["s_conn:private"]=> string(63) "Access denied for user 'root'@'localhost' (using password: YES)" }
    Perchè non mi mostra l'errore? teoricamente $conn->error() è l'equivalente di mysql_error() ma nessuno dei due riesce a mostrare l'errore.

    So che magari sembrano banalità ma non riesco a concepire il perchè.
    La rovina del mondo sara' l'indifferenza. Ma chi se ne frega!!

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.