• User Attivo

    Query testarda che non va

    Ciauz!!

    Allora sono due giorni che cerco di far funzionare un mio piccolo script (lo testo in locale) ma incappo sempre nel seguente errore:

    Errore di sintassi nella query SQL vicino a '' linea 1

    e non capisco perchè..

    La situazione è questa:

    ho una tabella tutorial nella quale inserisco le info dei miei tutorial e la pagina leggi_tutorial.php che va a prelevare il tutorial giusto a seconda del parametro che le passo con GET..

    La funzione principale che fa tutto questo dovrebbe esser la seguente:

    [PHP]
    function leggi_tutorial($id){

    $leggi_tutorial = "SELECT * FROM tutorial WHERE id = '$id' ";

    $dati = mysql_query($leggi_tutorial) or die(mysql_error());
    $row = mysql_fetch_array ($dati);

    $nome = $row["nome"];
    $visite = $row["visite"];
    $descrizione = $row["descr"];
    $testo = $row["testo"];

    }
    [/PHP]

    La variabile $id la ricavo da un link proveniente da un altra pagina con il metodo get:

    [PHP]
    $id = $_GET['id'];
    [/PHP]

    Vi dico subito che il problema non sta nel passaggio della variabile perchè ho provato a stamparla all'interno della funzione e stampa un risultato non vuoto.. ho provato cambiando una marea di cose tra apice, virgolette ecc ma quel maledetto errore rimane..

    Vi prego illuminatemi :lol:

    Ps. la funzionalità di tutto ciò sarebbe l'avere una sola pagina dinamica per tutti i tutorial e non una pagina per ogni tutorial.. se avete un' idea migliore della mia per attuare tutto ciò dite pure:D

    Grazie mille e ciauzz


  • User Attivo

    Ciao Supernova,
    Mi sembra che ci voglia un While per prelevare + dati. (almeno credo)
    Prova il codice così e fammi sapere:
    [php]
    function leggi_tutorial($id){

    $leggi_tutorial = "SELECT * FROM tutorial WHERE id = '$id' ";

    $dati = mysql_query($leggi_tutorial) or die(mysql_error());
    while ($row = mysql_fetch_array($dati)) {
    $nome = $row["nome"];
    $visite = $row["visite"];
    $descrizione = $row["descr"];
    $testo = $row["testo"];

    }
    }
    [/php]
    Speriamo che non ho scritto una cavolata 😄
    Saluti.


  • User Attivo

    Non cambia niente.. ma non dovrebbe essere una questione di funzioni o cose del genere, perchè in questo caso darebbe altri errori o almeno una parte dei risultati..

    Sembra più un problema nella query che però apparentemente non ne ha.. forse qualche incompatibilità in locale..

    Qualcuno sa se su easyphp 1.7 possano verificarsi a volte problemi di questo tipo?

    grazie ciauzz


  • Moderatore

    punto uno serve il while^_^se non ricordo male anch'io

    punto due prova WMserver tool^_^ e risolvi


  • Moderatore

    punto due prova WMserver tool^_^ e risolvi
    Ah sì?
    Quindi con quel server riesci ad avere un valore in output da una funzione senza dichiararlo? 🙂

    Ottimo.

    while ($row = mysql_fetch_array($dati)) {
    $nome = $row["nome"];
    $visite = $row["visite"];
    $descrizione = $row["descr"];
    $testo = $row["testo"];

    }
    Questo ritorna solo l'ultimo valore, visto che ogni volta che il while avanza $visite e gli altri vengono ridichiarati.

    Pps http://it2.php.net/manual/it/function.return.php 🙂


  • User Attivo

    @massy said:

    Ah sì?
    Quindi con quel server riesci ad avere un valore in output da una funzione senza dichiararlo? 🙂

    Ottimo.

    Questo ritorna solo l'ultimo valore, visto che ogni volta che il while avanza $visite e gli altri vengono ridichiarati.

    Pps http://it2.php.net/manual/it/function.return.php 🙂

    Scusa non ho capito bene.. quindi il while non ci vuole e devo inserire return? Come?

    Sorry ma non sono molto ferrato :bho:

    Grazie


  • User Attivo

    Allora senza complicarti la vita, prova una cosa del genere
    [php]
    $leggi_tutorial = mysql_query("SELECT * FROM tutorial WHERE id = '$id' "); or die (mysql_error());
    while ($row = mysql_fetch_array($leggi_tutorial)) {
    $nome = $row["nome"];
    $visite = $row["visite"];
    $descrizione = $row["descr"];
    $testo = $row["testo"];
    }
    [/php]
    Così è quasi impossibile che non ti funziona...

    Saluti.


  • Moderatore

    Ecco. E' il quasi che ti frega.

    Ragiono su un solo campo, nome, ma è uguale per tutte e 4 o n.
    Se avesse 3 record del tipo:
    pippo, x, x, x...
    pluto, x, x, x...
    paperino, x, x, x...

    allo scorrere del ciclo, con l'istruzione
    while () {
    $nome=$row["nome"];
    }
    $nome assumerebbe il valore di
    pippo, poi di pluto e poi di paperino.

    A ciclo terminato $nome="paperino", gli altri sarebbero per così dire sovrascritti.
    In pratica ha fatto un ciclo per avere solo alla fine un valore.

    Secondo punto:
    ha creato una funzione.
    Essa fa delle operazioni ma non ha output. Non fa stampare nulla all'interno della stessa. Non passa valori. E' ovvio che non vede nulla.

    Potrebbe:

    1. mandare a stampa direttamente (es.
     function fcta() {
     $pippo="bla bla";
     echo $pippo;
     }
     fcta();
    

    qua trovi in video bla bla perché è un'operazione interna alla stessa

    1. far ritornare un valore direttamente dalla stessa che la sospende
     function fcta() {
      $pippo="bla bla";
    return $pippo;
      }
    echo fcta();
    

    Ciò che hai scritto se messo dentro la funzione dichiarata non ritorna nulla.
    (per prova:

    function fcta() {
    $pippo="bla bla";
    }
    echo fcta();
    ``` )
    se messa fuori da un solo valore di quelli cercati.
    
    Come risolvere?
    Dipende da cosa deve fare.
    Vuol stampare i risultati?
    Li deve stampare DENTRO la funzione.
    Li deve riusare? Li deve passare con return.
    
    Spero di esser stato abbastanza chiaro. In caso negativo --> http://it.php.net/manual/it/language.functions.php
    
    :ciauz:

  • User Attivo

    Sei stato molto chiaro ma io non sono ancora riuscito, scusami..

    Se ho capito bene

    1. nn mi serve il while perchè devo ottenere soltanto una serie di record relativi ad una sola riga della tabella (quella individuata dall'id passato)

    2. devo usare il return perchè i dati che estraggo andrebbero poi distribuiti nella pagina.. ad esempio la variabile $nome che ottengo dalla query la dovrei stampare in un h1, $testo andrebbe sotto il nome nella parte dei contenuti..

    Ho provato in vari modi ma proprio non mi viene..

    Potreste darmi un ulteriore mano?

    Grazie di tutto


  • User Attivo

    Scusa ma utilizzando questo codice
    [php]
    $leggi_tutorial = mysql_query("SELECT * FROM tutorial WHERE id = '$id' "); or die (mysql_error());
    while ($row = mysql_fetch_array($leggi_tutorial)) {
    $nome = $row["nome"];
    $visite = $row["visite"];
    $descrizione = $row["descr"];
    $testo = $row["testo"];
    }
    echo "$nome e $visite e $descrizione e $testo";
    [/php]
    Non ti printa i dati???

    Saluti.


  • User Attivo

    L'errore rimane ma stampa solo i primi due, mentre descrizione e testo no.. Ma in ogni caso a me servono al di fuori della funzione perchè devo stamparli separatamente nella pagina..

    grazie :ciauz:


  • User Attivo

    Questa è davvero bella.. Se ti rimane l'errore c'è qualcosa che non và.
    Allora posti il codice della tabella?
    Cmq anche se devi chiamarli in un altra pagina basta utilizzare un include("file.php") e hai tutti i dati del db pronti da utilizzare in quella pagina.

    Cmq bisogna risolvere l'errore xkè con quel codice doveva per forza stampare tutti e 4 i risultati.

    Saluti.


  • User Attivo

    @Sovietiko said:

    Questa è davvero bella.. Se ti rimane l'errore c'è qualcosa che non và.
    Allora posti il codice della tabella?
    Cmq anche se devi chiamarli in un altra pagina basta utilizzare un include("file.php") e hai tutti i dati del db pronti da utilizzare in quella pagina.

    Cmq bisogna risolvere l'errore xkè con quel codice doveva per forza stampare tutti e 4 i risultati.

    Saluti.

    Prima di tutto confermo che venivano stampati solo i primi due perchè gli ultimi mi ero dimenticato di riempirli nel database, quindi tutto a posto, scusami:D

    Per quanto riguarda il resto mi sono spiegato male.. la funzione si trova nel file function.php assieme alle altre funzioni che utilizzo, ed è inclusa in leggi_tutorial.php.. solo che se non ho capito male nel caso in cui non venga espresso l'output nella funzione stessa bisogna usare il return..

    Questo perchè io devo posizionare in parti diverse della pagina le singole variabili ottenute e quindi devo stamparle con echo necessariamente fuori dalla singola funzione..

    Cmq il codice della tabella è questo..

    
    -- 
    -- Struttura della tabella `tutorial`
    -- 
    
    CREATE TABLE `tutorial` (
      `id` mediumint(8) NOT NULL default '0',
      `nome` varchar(255) NOT NULL default '',
      `categoria` varchar(255) NOT NULL default '',
      `visite` int(11) NOT NULL default '0',
      `descr` varchar(255) NOT NULL default '',
      `testo` longtext NOT NULL,
      PRIMARY KEY  (`id`)
    ) ENGINE=MyISAM DEFAULT CHARSET=latin1;
    
    
           
    
    

  • User Attivo

    Ciao,
    scusa ma io non capisco la differenza di una funzione invece che di una query basilare.
    Tu devi prendere sti dati e metterli in un altro file?
    Bene hai detto che includi il file functions.php?
    Per stampare i dati (siccome la pagina è in php) basta che fai un echo e tutto si risolve.
    Ti faccio un esempio.
    Nella pagina file.php includi le funzioni. Ad un certo punto ti serve sapere il nome dell utente.
    [php]
    echo " Nome utente: $nome";
    [/php]
    Ti cambia qualcosa così facendo?
    Hai sempre le 4 variabili a disposizione, basta inserirle dove le vuoi ammesso che includi il file che preleva i dati dal db.

    Saluti.


  • User Attivo

    Si ma anche così non funziona..


  • User Attivo

    @Supernova said:

    Si ma anche così non funziona..
    Complimenti! Sei il primo che riesce a farmi fare le prove in locale 😄

    Allora in questo modo funziona, se a te non funziona butta il pc che come server non rende 😛

    TI POSTO IL CODICE COME MI FUNZIONA A ME POI VEDI TU.
    QUESTO IL FILE STR.PHP CHE MI PRENDE I DATI DAL DB.
    [php]
    $dbhost = "localhost";
    $dbuser = "root";
    $dbpass = "";
    $dbname = "gioco";

    $db = mysql_connect($dbhost, $dbuser, $dbpass);
    if ($db == FALSE)
    die ("Errore nella connessione. Verificare i parametri nel file config.php");
    mysql_select_db($dbname, $db)
    or die ("Errore nella selezione del database. Verificare i parametri nel file config.php");
    $leggitutorial = mysql_query("SELECT * FROM tutorial WHERE id = '1' ");
    while ($row = mysql_fetch_array($leggitutorial)) {
    $nome = $row["nome"];
    $visite = $row["visite"];
    $descrizione = $row["descr"];
    $testo = $row["testo"];
    }

    mysql_close();
    [/php]
    HO MESSO ID=1 XKE' NON POSSO CONTROLLARE L'ID DEL TUTORIAL. MA TU SISTEMI CON LA VARIABILE.

    E ORA INCLUDO IL FILE E MI STAMPO I DATI IN QUESTO MODO
    [php]
    include("str.php");
    echo "$nome e $visite e $descrizione e $testo";
    [/php]

    Dammi conferma così esulto 😄

    Saluti.


  • Moderatore

    Dammi conferma così esulto Allora forse non hai compreso il suo problema.

    Nessuno dice che la query sia sbagliata. Ma lui richiama una funzione, non un include. E inserendo quel codice in una funzione non ritorna nulla.

    Domanda: hai letto il mio ultimo messaggio? Suppongo di no.

    Altra cosa. Tu supponi che $id sia univoco. Se lo fosse non serve il while.
    Altrimenti è comunque errato in quanto, come detto, ogni volta che il ciclo scorre sovrascrivi le variabili precedentemente assegnate.
    Se posso permettermi un consiglio prima di scrivere codice, ragiona sul metodo... fai prima e commetterai in seguito molti meno errori.

    @supernova:
    Che necessità hai di usare quella funzione? Quando la chiami?
    Vuoi che ti trovi i valori e li metta da parte?
    In tal caso potresti fargli ritornare un array oppure usare variabili globali o anche una variabile di sessione, dipende da cosa ti serve.
    Vuoi solo stampare i valori e richiarmarli di volta in volta?
    Usa un print_r nella funzione.

    Il punto è che non capisco cosa vuoi fare.


  • User Attivo

    @Supernova said:

    [PHP]
    function leggi_tutorial($id){

    $leggi_tutorial = "SELECT * FROM tutorial WHERE id = '$id' ";

    $dati = mysql_query($leggi_tutorial) or die(mysql_error());
    $row = mysql_fetch_array ($dati);

    $nome = $row["nome"];
    $visite = $row["visite"];
    $descrizione = $row["descr"];
    $testo = $row["testo"];

    }
    [/PHP]

    La variabile $id la ricavo da un link proveniente da un altra pagina con il metodo get:

    [PHP]
    $id = $_GET['id'];
    [/PHP]

    Adesso che ci stò pensando su... Sai che quando richiami la funzione nel file principale devi chiamarla in questo modo
    [php]
    function leggi_tutorial($id);
    [/php]

    Io proverei in questo modo
    [php]
    function leggi_tutorial($leggi){

    $leggi_tutorial = "SELECT * FROM tutorial WHERE id = '$id' ";

    $dati = mysql_query($leggi_tutorial) or die(mysql_error());
    $row = mysql_fetch_array ($dati);

    $nome = $row["nome"];
    $visite = $row["visite"];
    $descrizione = $row["descr"];
    $testo = $row["testo"];

    }
    [/php]
    e poi nel principale richiami la funzione
    [php]
    function leggi_tutorial($leggi);
    [/php]
    Così dovrebbe funzionare.

    Saluti.


  • User Attivo

    @sovietiko

    Scusa ma la variabile $leggi che centra? Da dove salta fuori?

    @massy

    Perdonami ma io mi sono sempre limitato a cose più semplici e con tutti questi comandi mi sto incasinando.. cerco di spiegarti nel modo più chiaro possibile ciò che voglio..

    Nel mio sito sono presenti diversi tutorial e volevo, invece che *avere tante pagine del tipo tutorial1.php, ***tutorial2.php ecc ecc, avere un'unica pagina leggi_tutorial.php che variasse e mostrasse il giusto tutorial a seconda del parametro che gli passo tramite link. Quindi se volessi vedere ad esempio il tutorial n.1 basterebbe cliccare su un link che contiene il parametro leggi_tutorial.php?id=1 e la pagina dovrebbe andare a prendere i dati dal database e mostrarmeli.

    A questo punto la pagina leggi_tutorial.php deve però adattarsi ai dati del tutorial che prende dal database, integrandoli nel layout del sito nei posti giusti. Devo quindi poter esser in grado di stampare $nome in un posto, $testo in un altro, $visite in un altro ancora ecc ecc.. Le variabili quindi non posso stamparle all'interno della funzione stessa, ma devo fare in modo che essa siano comunque raggiungibili da qualsiasi altra parte della pagina leggi_tutorial.php.

    La funzione l'avevo scritta nel file function.php perchè ho raccolto tutte le funzioni che utilizzo in quel file, per comodità, anche nel caso dovessi poi utilizzarla pure in altre pagine, ma per me non c'è nessuna differenza se invece di fare l'operazione che mi serve tramite una funzione la faccio scrivendo query e tutto il resto direttamente sulla pagina leggi_tutorial.php. Se possibile preferirei avere una funzione in modo da poterla eventualmente richiamare anche da altre parti, ma se non si può pazienza..

    Spero di esser stato più chiaro e mi scuso con tutti se non lo sono stato in precedenza..

    Se riusciamo a concludere poi non vi disturbo più per un mese:D

    Grazie e ciao


  • Moderatore

    Quindi $id è unico, da quanto ho capito.
    Ecco una cosa molto grezza:

    function leggi_tutorial($id){
    $leggi_tutorial = "SELECT * FROM tutorial WHERE id = '$id' ";
    $dati = mysql_query($leggi_tutorial) or die(mysql_error());
    $row = mysql_fetch_array ($dati);

    $nome = $row["nome"];
    $visite = $row["visite"];
    $descrizione = $row["descr"];
    $testo = $row["testo"];

    echo "<h1>".$descrizione."</h1>";
    echo "<p>".$testo."</p>";
    echo "<div class="autore">scritto da ".$nome." visto ".$visite." volte</div>";

    }

    poi nel file php la richiami ovviamente con

    function leggi_tutorial(1);

    Ps ci son molti modi per fare la stessa cosa meglio, ad esempio creando un template in cui semplicemente sostituire i valori, tanto per dirne una. 🙂

    Se vuoi approfondire appena avrai più dimestichezza con la logica ne riparliamo

    :ciauz: