Newsgroup: it.comp.www.php
Titolo: Strano problema con una query...(penso sia per esperti, ma non è detto...)

Ho una funzione loop_select() che produce una sintassi SQL esatta (la usavo
prima senza funzione e andava una meraviglia).
Mi serve la funzione con un ciclo for perchè i valori di SELECT sono
variabili a seconda del valore assunto dalla variabile $righe_totali.
function loop_select()
{
     global $question_id;
     global $righe_totali;
     echo "SELECT COUNT( users.country ) AS voti_totali, ";
     for ($n = 0; $n < $righe_totali; $n++)
         {
              echo "(SUM(answers.answer='\$resp[" . $n . "]')/COUNT(
users.country )*100) AS perc_" . $n . ", ";
         }
    echo "users.country FROM responses    INNER JOIN users ON
(responses.user_id = users.user_id)    INNER JOIN answers ON
   (responses.answer_id = answers.answer_id)    INNER JOIN questions ON
(answers.question_id = questions.question_id)
   WHERE    (    (questions.question_id = \$question_id)    ) GROUP BY
users.country";
}
$query_risposte = loop_select();
a questo punto chiedo l'output della variabile $query_risposte con echo:
echo "$query_risposte";
e mi stampa il contenuto giusto della query ossia:
SELECT COUNT( users.country ) AS voti_totali,
(SUM(answers.answer='$resp[0]')/COUNT( users.country )*100) AS perc_0,
(SUM(answers.answer='$resp[1]')/COUNT( users.country )*100) AS perc_1,
(SUM(answers.answer='$resp[2]')/COUNT( users.country )*100) AS perc_2,
(SUM(answers.answer='$resp[3]')/COUNT( users.country )*100) AS perc_3,
(SUM(answers.answer='$resp[4]')/COUNT( users.country )*100) AS perc_4,
users.country
FROM responses
INNER JOIN users ON (responses.user_id = users.user_id)
INNER JOIN answers ON (responses.answer_id = answers.answer_id)
INNER JOIN questions ON (answers.question_id = questions.question_id)
WHERE ( (questions.question_id = $question_id) ) GROUP BY users.country
Ripeto: questa è esattamente la query che voglio lanciare. Le variabili
$resp[n] e $question_id sono tutte definite prima della funzione
loop_select()
Se procedo ad estrarre i dati nel solito modo:
$risposte = mysql_query($query_risposte) or die(mysql_error());
$row_risposte = mysql_fetch_assoc($risposte);
alla fine mi da l'errore Warning: mysql_fetch_assoc(): supplied argument is
not a valid MySQL result resource in c:\...
Dov'è l'errore? Se il contenuto di $query_risposte è esattamente la stringa
con la query che voglio utilizzare e la query è corretta perchè non
funziona?

 
Saluti
l0ck

 funziona?
l'errore sembra essere nel fatto che le var '$resp[n]' non sono valutate
Ciao Gianfranzo
-- 
ICQ#: 21258924
Nick Gianfranzo
Home page 
http://www.gianfranzo.it
Gianfranzo è contro la guerra

      global $righe_totali;
Forse qui dovresti inserire anche "global $resp;"
Daniele


Ho provato le soluzioni che mi avete suggerito ma...non va!
Ma vi dirò di più! Il mistero si infittisce :-)
Ho cambiato la funzione in maniera tale che TUTTE le variabili siano
interpretate al suo interno:
function loop_select()
{
 global $question_id;
 global $righe_totali;
 global $resp;
 echo "SELECT COUNT( users.country ) AS voti_totali, ";
 for ($n = 0; $n < $righe_totali; $n++)
 {
  echo "(SUM(answers.answer='{$resp[$n]}')/COUNT( users.country )*100) AS
perc_" . $n . ", ";
 }
 echo "users.country FROM responses    INNER JOIN users ON
(responses.user_id = users.user_id)    INNER JOIN answers ON
   (responses.answer_id = answers.answer_id)    INNER JOIN questions ON
(answers.question_id = questions.question_id)
   WHERE    (    (questions.question_id = $question_id)    ) GROUP BY
users.country";
}
Adesso l'output della funzione è (ad esempio per la domanda con
$question_id=18):
SELECT COUNT( users.country ) AS voti_totali,
(SUM(answers.answer='1')/COUNT( users.country )*100) AS perc_0,
(SUM(answers.answer='2')/COUNT( users.country )*100) AS perc_1,
(SUM(answers.answer='3')/COUNT( users.country )*100) AS perc_2,
(SUM(answers.answer='4')/COUNT( users.country )*100) AS perc_3,
users.country
FROM responses
INNER JOIN users ON (responses.user_id = users.user_id)
INNER JOIN answers ON (responses.answer_id = answers.answer_id)
INNER JOIN questions ON (answers.question_id = questions.question_id)
WHERE ( (questions.question_id = 18) )
GROUP BY users.country
Quindi come vedete non risultano variabili all'interno della query perchè
sono già state assegnate nella funzione. Quello che esce fuori è una stringa
pura.
Faccio due query:
$query1 = loop_select();
$query2 = "
SELECT COUNT( users.country ) AS voti_totali,
(SUM(answers.answer='1')/COUNT( users.country )*100) AS perc_0,
(SUM(answers.answer='2')/COUNT( users.country )*100) AS perc_1,
(SUM(answers.answer='3')/COUNT( users.country )*100) AS perc_2,
(SUM(answers.answer='4')/COUNT( users.country )*100) AS perc_3,
users.country
FROM responses
INNER JOIN users ON (responses.user_id = users.user_id)
INNER JOIN answers ON (responses.answer_id = answers.answer_id)
INNER JOIN questions ON (answers.question_id = questions.question_id)
WHERE ( (questions.question_id = 18) )
GROUP BY users.country
";
Quindi $query2 contiene ESATTAMENTE lo stesso output di loop_select() senza
alcuna variabile.
mysql_query($query1) non funziona. Inutile dire che invece
mysql_query($query2) funziona perfettamente...
Da ciò deduco che non è un problema di variabili. A questo punto i sospetti
cadono su mysql_query... voi cosa ne pensate? Altre idee? Esperienze?

Alla fine ho risolto secondo il suggerimnto di Red Owl :-)
In pratica era necessario comporre la query dentro la funzione come da lui
indicato nel codice che ha riportato...
Resta comunque un mistero per me il perchè l'altro metodo non funzioni, in
fondo l'output era una semplice stringa...
Red Owl tu hai qualche idea?

 cadono su mysql_query... voi cosa ne pensate? Altre idee? Esperienze?
ma la query direttamente sul Db l'hai provata? non č che mi torni 
proprio la sintassi delle join che hai usato....
Ciao Gianfranzo
-- 
ICQ#: 21258924
Nick Gianfranzo
Home page 
http://www.gianfranzo.it
Gianfranzo č contro la guerra


si che mi serve un corso di grafica :-O