php/mysql caso WHERE

Salve, mi date informazioni perché su locale questo codice funziona e su remoto no:

Ho due menu a tendina uno "Seleziona Categorie" e l'altro "Seleziona Utenti",

in poche parole devo fare un filtro che se clicco su categorie "Generale", mi visualizza tutti gli articoli della categoria "Generale" e se clicco su Utenti "Luigi" mi visualizza tutti gli articoli di luigi.

Mi spiegati perché:?

Ho scoperto che è sbagliata la query.  Perché in locale funziona e su remoto no.

ecco il codice:

<?php

    $id = $_GET["id"];
    if(empty($id))
    {
                $pag = new Paginazione("SELECT * FROM articoli ", 20, "pagina");
    
    }    
    else
    {
                $pag = new Paginazione("SELECT * FROM articoli WHERE _catid='".$id."' or _userid='".$id."'", 1, "pagina");

    }

?>

grazie mille.

inviato 5 anni fa
luigi
X 0 X

Può dipendere dalla configurazione: per esempio in remoto potresti avere magic_quotes_gpc a on (spero proprio di no, ma è possibile).

Fai un var_dump($id) e vedi cosa contiene.

Dovresti comunque filtrare il contenuto delle variabili che ti arrivano in get (e in generale qualsiasi contenuto ti arrivi da un utente), per questioni di sicurezza.

risposto 5 anni fa
Massimiliano Arione
X 0 X

ciao, ho fatto le prove e stamani sembra di funzionare solo che quando clicco sulla categoria "Generale",

mi visualizza anche i record che sono nella categoria "programmazione" ovvero:

1)Generale

2)Programmazione

<?php

   $id = $_GET["id"];
   if(empty($id))
   {
            $pag = new Paginazione("SELECT * FROM articoli ", 20, "pagina");
   
   }   
   else
   {
            $pag = new Paginazione("SELECT * FROM articoli WHERE _userid=".$id." or _catid=".$id."", 1, "pagina");

   }

?><?php echo var_dump($id); ?>

Quindi è scritta male la query ?

Mi dici come faccio ?

grazie mille.

risposto 5 anni fa
luigi
X 0 X

Come ho detto prima, verifica cosa esce dal var_dump. Vedi se è effettivamente quello che ti aspetti.

Se lo è, non posso aiutarti ulteriormente, perché non conosco la classe Paginazione che stai usando

risposto 5 anni fa
Massimiliano Arione
X 0 X

ciao, ho controllato come mi hai detto  e i valori son giusti.

Ora ti incollo la paginazione che lo trovata in un blog che dovrebbe chiamarsi sv.design. ora non mi ricordo bene il nome.

(se vedi this-Query perché uso un'altra classe che semplicemente richiama mysql_query.

ecco il codice :

<?php
   class Paginazione
   {
      private $xpage = 0;
      private $tot = 0;
      private $varq = "";
      private $totpag = 0;
      private $cpage = 0;
      private $query = "";
      private $record = array();
   
      public function Paginazione($query, $xpage, $varq)
      {
         // le rendo globali
         $this->xpage = $xpage;
         $this->varq = $varq;
         $this->query = trim($query);
         
         // pagina corrente sia get che post
         $this->cpage = (isset($_REQUEST[$varq])) ? (int)$_REQUEST[$varq] : 1;
         
         // inizio record
         $inizio = $xpage * ($this->cpage - 1);
         
         // eseguo la query per contare i record
         $ct = mysql_query($this->query) or die(mysql_error());
         
         // record totali
         $this->tot = mysql_num_rows($ct);
         
         // se ci sono record
         if($this->tot > 0)
         {
            // pagine totali
            $this->totpag = ceil($this->tot / $xpage);
            
            // scrivo ed eseguo la query mirata
            $target = " LIMIT " . $inizio . ", " . $xpage;
            $ex = mysql_query($this->query . $target) or die(mysql_error());
            
            while($ft = mysql_fetch_array($ex, MYSQL_ASSOC))
            {
               $record[] = $ft;
            }
            
            $this->record = $record;
         }
         else
         {
            $this->record = array();
         }
      }
      
      public function Show()
      {
         if(count($this->record) > 0)
         {
            return $this->record;
         }
         else
         {
            return false;
         }
         
      }
      
      public function Link($nlink = 4)
      {
         $before = array();
         $after = array();
         
         if($this->cpage < $nlink)
         {
            $nlink *= 2;
            $nlink -= ($this->cpage - 1);
         }
         elseif($this->cpage > ($this->totpag - $nlink))
         {
            $nlink *= 2;
            $nlink -= ($this->totpag - $this->cpage);
         }
         
         
         
         for($i = $nlink; $i>=1; $i--)
         {
            if(($this->cpage - $i) >= 1)
            {
               $before[] = $this->cpage - $i;
            }
         }
         
         for($i = 1; $i<=$nlink; $i++)
         {
            if(($this->cpage + $i) <= $this->totpag)
            {
               $after[] = $this->cpage + $i;
            }
            
            if($this->cpage == $nlink)
               $nlink += 1;
         }
         
         $link["first"] = 1;
         $link["before"] = $before;
         $link["current"] = $this->cpage;
         $link["after"] = $after;
         $link["last"] = $this->totpag;
         
         if($this->cpage <= $this->totpag && $this->totpag > 1)
         {
            return $link;
         }
         else
         {
            return false;
         }
      }
   }
?>

Mi poi dare una mano?

grazie mille.

ora vedo se ritrovo quella classe.

grazie , buona giornata.

risposto 5 anni fa
luigi
X 0 X

La classe (per quanto brutta) sembra a posto.

Forse è un problema di logica nella tua query? Vedo che nella query fai un OR su utente/categoria e poi ti aspetti una determinata categoria, sei sicuro che sia giusto?

risposto 5 anni fa
Massimiliano Arione
X 0 X

La classe (per quanto brutta) sembra a posto.

Forse è un problema di logica nella tua query? Vedo che nella query fai un OR su utente/categoria e poi ti aspetti una determinata categoria, sei sicuro che sia giusto?

e per quello che ho chiesto che fosse sbagliata la query . Come faccio ad fare che io posso selezionare la categoria o l'utente?

come è la sintassi giusta?

grazie e buona giornata.

risposto 5 anni fa
luigi
X 0 X

Immagino che tu debba fare query diverse (non conosco la struttura del tuo db).

Una query sulla colonna _catid se vuoi filtrare per categoria, una query sulla colonna _userid se vuoi filtrare per utente.

risposto 5 anni fa
Massimiliano Arione
X 0 X

ciao, ho fatto come mi hai detto di dividere le query , solo che non capisco ancora la faccenda dei if else etc..

per adesso funziona il menu a tendina delle categorie  funziona benissimo.

ho un problema di quello degli utenti. mi da che non ci sono record , invece i dati ci sono e  sono regolari.

ti posto il codice:

<?php

   $id_cat = $_GET["id"];   
   $id_user = $_GET["user"];
   if(empty($id_cat) && empty($id_user))
   {
            $pag = new Paginazione("SELECT * FROM articoli ", 20, "pagina");
   
   }elseif($id_cat == $_GET["id"])
   {
            $pag = new Paginazione("SELECT * FROM articoli WHERE  _catid='".$id_cat."'", 10, "pagina");

   }
   elseif($id_user == $_GET["user"])
   {
            $pag = new Paginazione("SELECT * FROM articoli WHERE  _userid='".$id_user."'", 10, "pagina");
            echo $pag;
   }else
   
   {
   }
   
?>

Mi protesti migliorare il codice, grazie mille ,

vi ringrazio molto.

a stasera.

buona giornata.

risposto 5 anni fa
luigi
X 0 X

niente?

saluti,

luigi.

risposto 5 anni fa
luigi
X 0 X
Effettua l'accesso o registrati per rispondere a questa domanda