• User

    [mysql+php] errore mysql_result

    Ciao a tutti,
    questa sera ho trasferito da un server Aruba (PHP 5.2.1) a un server dove ho un hosting multidominio (PHP 5.1.2) il sito web per un mio cliente.
    Tutto funziona perfettamente tranne quando :arrabbiato: utilizzo la funzione mysql_result, in particolare quando la utilizzo più volte con più variabili per richiamare il risultato di una query:

    [PHP] $sql="SELECT descrizione FROM prodotti WHERE id='$id'";
    $risultato=mysql_query($sql,$connessione);
    $nome=mysql_result($risultato,0);
    echo $nome;[/PHP]

    Nello specifico, il debug mi segnala:
    Warning: mysql_result() [function.mysql-result]: Unable to jump to row 0 on MySQL result index 5 in /var/www/vhosts/dominio.it/httpdocs/admin/modifica-prodotto.php on line 92

    Due domande:

    1. potete suggerirmi una funzione alternativa da utilizzare? mysql_fetch_array/row?
    2. Qual'è la causa dell'errore?

    Grazie in anticipo 😉

    Alessandro


  • User

    mysql_result() restituisce un E_Warning quando la query ritorna 0 righe, prova a controllare con un mysql_num_rows() se le righe restituite sono 1 o più prima di adoperare il mysql_result();

    Se è così e se sei sicuro che almeno un record è presente, allora forse c'è qualche errore nel trattamento di $id, in caso prova a stampare la query per vedere se è come ti aspettavi che fosse 😉


  • User

    Ciao Blancks, grazie dell'info 😉
    Mi sono però dimenticato di dirvi una cosa fondamentale: ovviamente nel precedente server il codice in questione funzionava perfettamente!!

    Proverò comunque ad applicare il tuo suggerimento, anche se secondo me non è un errore di codice ma un problema di versione di PHP..


  • User

    Purtroppo continuo ad avere questo problema..
    Ho appena importato un altro sito sullo stesso server e mi da ancora lo stesso identico errore, mentre sull'originale server dove ho creato il codice funziona tutto perfettamente..

    Cosa fare quindi? Sono davvero sicuro al 90% che sia un problema di configurazione del server: ho mandato un ticket all'hosting ma mi ha risposto che la configurazione del server sembra essere corretta..

    Ho controllato il DUMP MySql e il contenuto dei database è identico ovviamente.
    Ho controllato la sintassi della funzione ed è giusta.

    Grazie per ogni suggerimento!!

    Alessandro


  • User

    A questo punto ti consiglio di provare con un fetch:

    [PHP]$sql = "SELECT descrizione FROM prodotti WHERE id='$id'";
    $res = mysql_query($sql,$connessione)or die(mysql_error());

    if ($row = mysql_fetch_row($res))
    echo $row[0];
    else
    echo "Non sono stati trovati record.";
    [/PHP]

    Se si tratta semplicemente di recuperare determinati dati da database questa soluzione non ti cambia molto la vita.

    :ciauz:


  • User

    Stranissimo.. ho provato e mi segnala l'errore dell'else: "Non sono stati trovati record."

    Da qui capisco che allora qualcosa non và a livello di codice.. Ma il database di collega perfettamente e non da errori.. e il codice è lo stesso identico di quello del server Aruba.. allucinante!

    Che sia un problema del DB MySql che si collega ma non trasferisce i dati? Però mi funziona quando uso il fetch_array.. e se provassi ad utilizzare questa funzione per visualizzare la variabile? Macchinoso.. ma se funziona.. ci provo


  • User

    Prova a stampare la query sql a schermo, così controlli se la variabile $id contiene effettivamente qualcosa, se è quello che ti aspettavi di trovare ed.. in caso.. copiarla nella finestra delle query del phpMyAdmin per vedere cosa ti dice il manager del database.

    Se ti restituisce un insieme vuoto la questione è semplice: il record non esiste.

    Comunque questa prova col fetch conferma la mia impressione iniziale, l'errore restituitoti dal mysql_result derivava appunto dal fatto di non aver trovato risultati, per questo ti ho suggerito il num_rows.

    Sul tuo vecchio server probabilmente nel php.ini erano disabilitati gli E Warning, per questo non visualizzavi l'errore.


  • User

    @Blancks said:

    Prova a stampare la query sql a schermo, così controlli se la variabile $id contiene effettivamente qualcosa, se è quello che ti aspettavi di trovare ed.. in caso.. copiarla nella finestra delle query del phpMyAdmin per vedere cosa ti dice il manager del database.

    Sul tuo vecchio server probabilmente nel php.ini erano disabilitati gli E Warning, per questo non visualizzavi l'errore.

    Mmhmhhm.. non mi è chiaro cosa intendi con i passaggi "stampare la query sql a schermo" e in secundis "copiarla nella finestra delle query del phpMyAdmin per vedere cosa ti dice il manager del database". Riusciresti a spiegarmi i passaggi?

    E terzo.. se il server vecchio non mi visualizzava gli E Warning, possibile che comunque funzionasse?

    Grazie davvero!


  • User

    Non mi veniva altro termine per indicarti di fare una cosa del genere:
    [PHP]echo $sql;[/PHP]

    A questo punto logicamente visualizzerai nella pagina la query sql eseguita, in questo modo potrai verificare se risulta essere scritta come ti aspettavi.

    Se il problema era semplicemente l'id penso che dovresti saper trovare infretta l'errore che chiaramente è altrove..

    Se non è così accedi al phpMyAdmin o a qualunque altro software di gestione del database e delle tabelle ivi conservate ed esegui la query mostrata nella pagina direttamente nella zona dedita che si chiama, perl'appunto, finestra delle query.


  • User

    Ok.. era una banalità, scusami. Non ne avevo capito il senso.
    Bene, ho provato a stampare a schermo e mi restituisce:

    SELECT title FROM pagine WHERE id=''
    ```E anche qui è molto strano: l'url della mia pagina è dominio.it/pagina.php?id=nome_campo
    Possibile che stampando la query non mi prenda la variabile indicata nell'URL?
    
    Secondo: da phpmyadmin ho eseguito la query di cui sopra specificando un id che avevo nella tabella: il risultato è INSIEME VUOTO.. peccato che nella tabella il valore ci sia!! Ho controllato molto bene!!
    title è un varchar(100) latin1_swedish_ci.
    Il problema potrebbe essere l'uso dell'underscore?
    
    Mistero..

  • User

    Affatto, non recuperi l'id usando l'array superglobale $_GET.

    In sostanza, prova aggiungendo la seguente riga subito prima della query:
    [php]$id = $_GET['id'];[/php]Inoltre, se ti aspetti sempre e solo un dato numerico filtra l'id forzando il dato come intero, ovvero in questa maniera:
    [php]$id = (int)$_GET['id'];[/php]In questo modo ti proteggi da eventuali sql injection.

    :ciauz:


  • User

    GRANDE!!
    Risolto il problema.. pensa che nel frattempo avevo aperto un ticket e il capoccia dell'hosting mi ha chiamato su Skype per risolvere assieme il problema.. stavamo smanettando sui DUMP del MySql quando è arrivata la tua risposta e ha risolto tutto 😉
    Devo ancora studiarmi bene PHP.. questo è stato un esempio eclatante!

    Sui server di Aruba ho avuto la conferma che gli E Warning non vengono visualizzati.

    Ti devo una birra ;), quando vieni a Milano chiamami 😄

    Alessandro


  • User

    Volentieri 😄


  • User

    Ci risiamo.. oggi mi si è presentato un altro problema simile a questo, ma di cui non riesco a capirne la causa.

    Ho progettato questo pannello di controllo che serve ad aggiornare le pagine di un sito web: in sostanza richiamo i campi del mio DB MySql e utilizzo un form per aggiornarli.
    Sul precedente server non ho mai avuto problemi con l'aggiornamento dei dati, ora si.
    Nel momento in cui passo i dati tramite il metodo POST del form, richiamo nella pagina successiva conferma_pagina.php tutte le variabili e le inserisco nel DB:

    [PHP]include("../connessione.php");
    $id = $_GET['id'];
    $testo = $_GET['testo'];
    $titolo = $_GET['titolo'];
    $descrizione = $_GET['descrizione'];
    $sql="UPDATE pagine SET code='$testo' WHERE id='$id'";
    if (!mysql_query($sql,$connessione)) {
    echo"<h1>Errore, modifica della pagina non eseguita. Contattare <a href="mailto:[email protected]">Alessandro Modena</a></h1><br />";
    exit;
    } else {
    echo"<h2>La pagina $id è stata modificata correttamente. <br /><br /><a href="../pagina.php?id=$id">Vai alla pagina</a> appena modificata, oppure torna al <a href="index.php">Pannello di Controllo</a>.<br /></h2>";
    }
    $sql="UPDATE pagine SET title='$titolo' WHERE id='$id'";
    $testosidebar=mysql_query($sql,$connessione);
    $sql="UPDATE pagine SET description='$descrizione' WHERE id='$id'";
    $testosidebar=mysql_query($sql,$connessione);
    mysql_close($connessione);[/PHP]

    Utilizzando quello che ho capito ieri dopo la spiegazione di Blanks, ho richiamato i dati con l'array superglobale GET.
    In sostanza ora le variabili sono VUOTE e quindi mi aggiorna il record del DB cancellando tutte le informazioni precedentemente inserite!

    Qualcuno sa dirmi come mai?

    Grazie.. Ale


  • User

    Se il form ha il metodo post, le variabili passate tramite esso non le richiami più con l'array superglobale $_GET, bensì $_POST 😉

    Inoltre fai ben tre query di update quando, in questo caso, puoi riassumere tranquillamente tutto in una:
    [PHP]$sql="UPDATE pagine SET title='$titolo', code='$testo', description='$descrizione' WHERE id='$id'";[/PHP]

    Fammi sapere come va 😉


  • User

    Ehm.. 🙂
    Avevo avuto questa intuizione, ma passando la variabile id direttamente nell'url [PHP]conferma_pagina.php?id=<?php echo $id; ?>[/PHP] pur cambiando il $_GET in $_POST, non passava id e quindi non funzionava nulla ;).

    Ora ovviamente tutto ok 😉 Grazie ancora.

    E siamo a 2 birre..!


  • User

    Ci si può fare un po di confusione inizialmente, per cui meglio specificare nel qual caso altri utenti rischino di incappare nello stesso problema e trovare questo topic 😉

    L'array superglobale $_GET lo si utilizza per il recupero di dati da url o da form con method impostato, ovviamente, su get.

    L'array superglobale $_POST invece per il recupero di informazioni passate da form con il method impostato su post.

    Lieto di esserti stato nuovamente d'aiuto :ciauz: