Visualizzazione risultati 1 fino 22 di 22
Like Tree1Likes
  • 1 Post By marcoimprota

Discussione: Problemi di connessione al database

  1. #1
    marcoimprota non è connesso Neofita
    Data registrazione
    24-01-2015
    Messaggi
    26

    Predefinito Problemi di connessione al database

    Salve, premetto che sono un neofita in php e in apache. Sto realizzando un mio sito in locale ed ora voglio metterlo online.
    In locale funziona tutto perfettamente e la pagina php dialoga con il localhost perfettamente, ma quando metto i dati del server Altervista non va più nulla.
    Il risultato è questo:

    Fatal error: Call to a member function fetch() on a non-object in Blog/Archivio/Riflessioni_a_caldo.php on line 16

    dove alla linea 16 corrisponde la connessione al database:

    Codice PHP:
    $host = "localhost";
    $db_name = "xxx";
    $username = "xxx";
    $password = "0";

    global
    $connessione;
    $connessione = new PDO ("mysql:host=$host; db_name=$db_name", $username, $password);
    return
    $connessione;
    Mi chiedo quindi quale sia il problema, è per caso il metodo PDO? scrivo male qualcosa?
    Fatemi sapere, grazie.

  2. #2
    karl94 non è connesso Staff AV
    Data registrazione
    03-10-2005
    Messaggi
    17,744

    Predefinito

    Quali parametri hai usato per la connessione al database? Assicurati che il nome del database sia my_marcoimprota.

  3. #3
    marcoimprota non è connesso Neofita
    Data registrazione
    24-01-2015
    Messaggi
    26

    Predefinito

    Innanzitutto grazie per la risposta molto rapida, non pensavo servisse così poco tempo. Comunque copio e incolla per intero i parametri che inserisco per connettermi:

    Codice PHP:
    $host = "localhost";
    $db_name = "my_marcoimprota";
    $username = "marcoimprota";
    $password = "0";

    global
    $connessione;
    $connessione = new PDO ("mysql:host=$host; db_name=$db_name", $username, $password);
    return
    $connessione;

  4. #4
    karl94 non è connesso Staff AV
    Data registrazione
    03-10-2005
    Messaggi
    17,744

    Predefinito

    No, non è quello. Rileggendo con attenzione il problema è relativo al metodo fetch. Quindi è un problema della query che effettui, che avviene in una porzione di codice che qua non hai riportato.
    Puoi riportare le parti di codice dove effettui la query e richiami il metodo fetch?

  5. #5
    marcoimprota non è connesso Neofita
    Data registrazione
    24-01-2015
    Messaggi
    26

    Predefinito

    Il problema l'ho quasi risolto, ma non del tutto.

    Per il precedente problema mi diceva che aveva un problema di Fetch perché dalla query non uscivano i dati dal Database (non essendo collegato).

    Ora, il problema è questo:

    Codice PHP:
    connessione_online();
    if (!
    $connessione_online) {
    Echo
    "non posso connettermi";
    } Else {
    $query = $connessione_online->query("SELECT Titolo FROM Post WHERE ID_Post=1");
    while (
    $row = $query->fetch(PDO::FETCH_ASSOC)) {
    echo
    "<title>" . $row['Titolo'] . "</title>";
    }
    }
    ?>
    PS: notare che avevo dimenticato di sostituire il $connessione con il $connessione_online :P

    mi risponde sempre "non posso connettermi".
    Senza dare errori di PHP
    Ultima modifica di marcoimprota : 02-03-2015 alle ore 13.10.32

  6. #6
    karl94 non è connesso Staff AV
    Data registrazione
    03-10-2005
    Messaggi
    17,744

    Predefinito

    Ma connessione_online non è solo la funzione? L'istanza della classe PDO la memorizzi in $connessione, quindi era giusto usare $connessione.

  7. #7
    marcoimprota non è connesso Neofita
    Data registrazione
    24-01-2015
    Messaggi
    26

    Predefinito

    Copio tutto, capisco che sto facendo del casino:

    Codice PHP:
    function connessione() {
    $host = "localhost";
    $dbname = "sito";
    global
    $connessione;
    $connessione = new PDO ("mysql:host=$host; dbname=$dbname", 'root', '');
    return
    $connessione;
    }

    function
    connessione_online() {
    $host = "localhost";
    $db_name = "my_marcoimprota";
    $username = "marcoimprota";
    $password = "0";

    global
    $connessione_online;
    $connessione = new PDO ("mysql:host=$host; db_name=$db_name", $username, $password);
    return
    $connessione_online;

    if (
    $connessione_online->connect_error) {
    die(
    "Connection failed: " . $connessione->connect_error);
    }
    }
    Per l'offline ho fatto la funzione di connessione con la variabile $connessione
    per l'online ne ho fatto un'altra. Proprio per tenerle separate.
    Non ho saputo far di meglio :D

  8. #8
    karl94 non è connesso Staff AV
    Data registrazione
    03-10-2005
    Messaggi
    17,744

    Predefinito

    Mettiamo un po' di ordine: la variabile globale non ti serve e in generale non usare variabili globali, evitiamo di scrivere codice duplicato mettendo insieme le due funzioni e cambiano solo le variabili che tengono i parametri di connessione. Infine quel controllo che hai aggiunti alla fine di connessione_online non verrà mai eseguito in quanto dopo l'istruzione return.

    Codice PHP:
    function connetti() {
    if(
    strrpos($_SERVER['SERVER_NAME'], 'altervista') !== false){
    $host = "localhost";
    $db_name = "my_marcoimprota";
    $username = "marcoimprota";
    $password = "0";
    }else{
    $host = "localhost";
    $dbname = "sito";
    $username = "root";
    $password = "0";
    }

    if (
    $connessione->connect_error) {
    die(
    "Connection failed: " . $connessione->connect_error);
    }

    $connessione = new PDO ("mysql:host=$host; db_name=$db_name", $username, $password);
    return
    $connessione;
    }

    $connessione = connetti();

    $query = $connessione->query("SELECT Titolo FROM Post WHERE ID_Post=1");
    while (
    $row = $query->fetch(PDO::FETCH_ASSOC)) {
    echo
    "<title>" . $row['Titolo'] . "</title>";
    }
    Attenzione: codice non troppo testato.

  9. #9
    marcoimprota non è connesso Neofita
    Data registrazione
    24-01-2015
    Messaggi
    26

    Predefinito

    Rileggendo avevo notato che avevo dimenticato di mettere un $connessione_online nella funzione di connessione.

    Codice PHP:
    global $connessione_online;
    $connessione = new PDO ("mysql:host=$host; db_name=$db_name", $username, $password);
    return
    $connessione_online;
    Ma se la sostituisco torna l'errore di prima:

    Fatal error: Call to a member function fetch() on a non-object in /membri/marcoimprota/Blog/Archivio/Riflessioni_a_caldo.php on line 16

  10. #10
    marcoimprota non è connesso Neofita
    Data registrazione
    24-01-2015
    Messaggi
    26

    Predefinito

    Citazione Originalmente inviato da karl94 Visualizza messaggio
    la variabile globale non ti serve
    Ho diversi momenti nella pagina PHP che mi serve richiamare la connessione, per questo avevo pensato di usare una Global che mi portasse la connessione in più punti della pagina, senza tutte le volte. Ma ora che mi hai proposto la soluzione di una variabile attribuita alla funzione (cosa a cui non avevo minimamente pensato) la trovo una buona soluzione.

    Ora provo a modificare la cosa...

  11. #11
    marcoimprota non è connesso Neofita
    Data registrazione
    24-01-2015
    Messaggi
    26

    Predefinito

    Ho solo copiato ed incollato, devo sostituire qualcosa? Qualche valore?
    Mi riferisco soprattutto alle impostazioni dell'If

    Codice PHP:
    if(strrpos($_SERVER['SERVER_NAME'], 'altervista') !== false){

  12. #12
    Guest

    Predefinito

    Per la connessione io uso due file separati "config.php" e "connect.php"
    strutturati cosi:

    config.php
    Codice PHP:
    $DB_host='localhost';
    $DB_user='root';
    $DB_password='';
    $DB_name='gestioniturni';
    connect.php
    Codice PHP:
    <?php
    $link
    =mysql_connect($DB_host,$DB_user,$DB_password);
    if(!
    $link){
    die(
    'NON RIESCO A CONNETTERMI:'.mysql_error());
    }
    $db_selected=mysql_select_db($DB_name,$link);
    if(!
    $db_selected){
    die(
    'ERRORE NELLA SELEZIONE DEL DATABASE:'.mysql_error());
    }
    ?>
    Poi li richiamo nelle pagine interessate mediante il codice:
    Codice PHP:
    require 'config.php';
    require
    'connect.php';
    E mi trovo bene
    Ultima modifica di provagestionemagazzino : 02-03-2015 alle ore 14.02.54

  13. #13
    Guest

    Predefinito

    Si sta parlando di un connettore PDO non di php5-Mysql (mysqli sarebbe meglio).

    Mi ci sono messo e non ho capito il problema, faccio notare comunque che qualsiasi dato si metta la connessione da esito posito, anche con host/passoword/username sbagliati.

  14. #14
    marcoimprota non è connesso Neofita
    Data registrazione
    24-01-2015
    Messaggi
    26

    Predefinito

    Faccio il punto della situazione:

    io il file funzione.php per collegarmi al database di Altervista [premetto che in locale funziona tutto perfettamente],
    dove utilizzo una funzione nel caso sia offline e un'altra se è online:
    Codice PHP:
    function connessione() {
    $host = "localhost";
    $dbname = "sito";

    $connessione = new PDO ("mysql:host=$host; dbname=$dbname", 'root', '');
    return
    $connessione;
    }

    function
    connessione_online() {
    $host = "localhost";
    $db_name = "my_marcoimprota";
    $username = "marcoimprota";
    $password = "0";

    $connessione = new PDO ("mysql:host=$host; db_name=$db_name", $username, $password);
    return
    $connessione;

    }
    Nella pagina Home, ad esempio, vado quindi a richiamare la funzione di connessione al database per estrarre il Titolo della pagina ed inserirlo nel tag Html

    Codice PHP:
    <?PHP
    include 'funzioni.php';

    $connessione = connessione_online();
    if (!
    $connessione) {
    Echo
    "non posso connettermi";
    } Else {
    $query = $connessione->query("SELECT Titolo FROM Post WHERE ID_Post=1");
    while (
    $row = $query->fetch(PDO::FETCH_ASSOC)) {
    echo
    "<title>" . $row['Titolo'] . "</title>";
    }
    }
    Ma, la visualizzazione è solamente una laconica pagina bianca con la scritta di errore:
    Fatal error: Call to a member function fetch() on a non-object in /membri/marcoimprota/Blog/Archivio/Riflessioni_a_caldo.php on line 16

    Questo mi succedeva in locale quando non avevo collegato il database, e l'array associativa risultava vuota. Ho provato i consigli di Karl94, ma la struttura del testo per me è ancora difficile da comprendere [sono alle prime armi] e non riesco a modificarlo o a "leggerlo" in modo chiaro, che io possa capirlo e modificarlo adattandolo al mio caso.

  15. #15
    karl94 non è connesso Staff AV
    Data registrazione
    03-10-2005
    Messaggi
    17,744

    Predefinito

    Citazione Originalmente inviato da marcoimprota Visualizza messaggio
    Ho solo copiato ed incollato, devo sostituire qualcosa? Qualche valore?
    Mi riferisco soprattutto alle impostazioni dell'If

    Codice PHP:
    if(strrpos($_SERVER['SERVER_NAME'], 'altervista') !== false){
    Quello è solamente per cambiare automaticamente i parametri di connessione al database, cercando di capire se lo script viene eseguito su AlterVista o meno. Se la condizione specificata è vera, lo script sta venendo eseguito su AlterVista.
    Nota adesso che però ci sono piccoli errori: la variabile $dbname dovrebbe essere piuttosto $db_name e l'if andava sotto:
    Codice PHP:
    function connetti() {
    if(
    strrpos($_SERVER['SERVER_NAME'], 'altervista') !== false){
    $host = "localhost";
    $db_name = "my_marcoimprota";
    $username = "marcoimprota";
    $password = "0";
    }else{
    $host = "localhost";
    $db_name = "sito";
    $username = "root";
    $password = "0";
    }
    $connessione = new PDO ("mysql:host=$host; dbname=$db_name", $username, $password);

    if (
    $connessione->connect_error) {
    die(
    "Connection failed: " . $connessione->connect_error);
    }

    return
    $connessione;
    }

    $connessione = connetti();

    $query = $connessione->query("SELECT Titolo FROM Post WHERE ID_Post=1");
    while (
    $row = $query->fetch(PDO::FETCH_ASSOC)) {
    echo
    "<title>" . $row['Titolo'] . "</title>";
    }
    C'era anche da correggere il la stringa db_name che passavi al costruttore della classe PDO, la sintassi corretta è senza il trattino basso.
    Così dovrebbe andare.

    L'errore è causato dal fatto che col codice che hai scritto tu, non viene selezionato il database da usare, e la chiamata al metodo query restituisce false (l'errore dice appunto che false non è un oggetto). In questi casi è bene controllare cosa è andato storto con errorInfo.

    Un'alternativa decisamente migliore alle variabili globali è usare un singleton, o ancora meglio una classe con metodi statici.
    Ultima modifica di karl94 : 02-03-2015 alle ore 21.30.29

  16. #16
    marcoimprota non è connesso Neofita
    Data registrazione
    24-01-2015
    Messaggi
    26

    Predefinito

    Mi scuso per il ritardo della risposta, l'ho notata solo poco fa.
    Tra la scoperta e l'ora ho provato il codice che mi hai passato, e con sorpresa, non funziona ancora. La scritta è sempre quella di prima:

    Fatal error: Call to a member function fetch() on a non-object in /membri/marcoimprota/Blog/Archivio/Riflessioni_a_caldo.php on line 14

    ho provato a incollare -cambiando i dati- con quella che uso per connettermi al server locale (il quale va correttamente) ma nemmeno questa mossa sembra funzionare... io sinceramente non so più che fare.

  17. #17
    karl94 non è connesso Staff AV
    Data registrazione
    03-10-2005
    Messaggi
    17,744

    Predefinito

    Non disperare: piazza sotto la query
    Codice PHP:
    if(!$query){
    print_r($connessione->errorInfo());
    }
    E vediamo cosa dice il messaggio di errore.

  18. #18
    marcoimprota non è connesso Neofita
    Data registrazione
    24-01-2015
    Messaggi
    26

    Predefinito

    mi printa questo:

    Array ( [0] => 42S02 [1] => 1146 [2] => Table 'my_marcoimprota.Post' doesn't exist )
    Fatal error: Call to a member function fetch() on a non-object in /membri/marcoimprota/Blog/Archivio/Riflessioni_a_caldo.php on line 16
    in pratica mi dice che la tabella Post non esiste?
    Ultima modifica di karl94 : 03-03-2015 alle ore 13.28.31

  19. #19
    karl94 non è connesso Staff AV
    Data registrazione
    03-10-2005
    Messaggi
    17,744

    Predefinito

    Esatto. Verifica di aver caricato le tabelle necessarie nel database.

  20. #20
    marcoimprota non è connesso Neofita
    Data registrazione
    24-01-2015
    Messaggi
    26

    Predefinito

    Ok, ho risolto.

    Mi sono accorto che i nomi delle tabelle nel database erano con la iniziale minuscola...

    ok, possono partire gli insulti nei miei confronti.

    Grazie mille per l'impegno e la buona volontà dimostrata.

  21. #21
    karl94 non è connesso Staff AV
    Data registrazione
    03-10-2005
    Messaggi
    17,744

    Predefinito

    Citazione Originalmente inviato da marcoimprota Visualizza messaggio
    ok, possono partire gli insulti nei miei confronti.
    Ma no, niente insulti, è normale commettere errori di questo tipo.

    Comunque hai avuto modo di imparare qualcosa, no? Questo è l'importante.

  22. #22
    marcoimprota non è connesso Neofita
    Data registrazione
    24-01-2015
    Messaggi
    26

    Predefinito

    Citazione Originalmente inviato da karl94 Visualizza messaggio

    Comunque hai avuto modo di imparare qualcosa, no? Questo è l'importante.
    Certo, mi è servito molto. Anche perché, nel corso che ho frequentato, ci hanno fatto fare molta teoria e poca pratica.
    Al meno, ora, ho molto le idee più chiare e "pratiche" della questione. Sicuramente non finirà qua il mio interesse per il PHP.
    karl94 likes this.

Regole di scrittura

  • Non puoi creare nuove discussioni
  • Non puoi rispondere ai messaggi
  • Non puoi inserire allegati.
  • Non puoi modificare i tuoi messaggi
  •