2009-07-09 5 views
1

J'ai le code suivant que je veux exécuter, mais le problème est que $ this-> type est défini lorsque la classe est créée en spécifiant une pétition, une proposition ou un amendement. Comme vous pouvez le voir, mon instruction $ sql est une UNION des trois, et je veux spécifier quelle table (pet, prop, ou modifier) ​​chaque ligne de données provient. Comme vous pouvez le voir, $ this-> type ne fera que dire l'un des trois. Pour que ma fonction fonctionne comme je le voulais, je l'ai fait (ce que je trouve est trop long, il doit y avoir un moyen plus court).Condensing this code

public function userProposals() { 
    $username = User::getUsername(); 
    $state = User::userState(); 
    $sql = "SELECT * FROM petition WHERE author = '$username'"; 
    $query = mysql_query($sql); 
    while ($row = mysql_fetch_assoc($query)) { 
     echo " 
     <tr> 
      <td>$row[id]</td> 
      <td><a href='viewproposal.php?type=petition&id=$row[id]'>$row[title]</a></td> 
      <td>Petition</td> 
      <td>$state</td> 
     </tr>"; 
    } 
    $sql = "SELECT * FROM proposition WHERE author = '$username'"; 
    $query = mysql_query($sql); 
    while ($row = mysql_fetch_assoc($query)) { 
     echo " 
     <tr> 
      <td>$row[id]</td> 
      <td><a href='viewproposal.php?type=proposition&id=$row[id]'>$row[title]</a></td> 
      <td>Proposition</td> 
      <td>$state</td> 
     </tr>"; 
    } 
    $sql = "SELECT * FROM amendment WHERE author = '$username'"; 
    $query = mysql_query($sql); 
    while ($row = mysql_fetch_assoc($query)) { 
     echo " 
     <tr> 
      <td>$row[id]</td> 
      <td><a href='viewproposal.php?type=amendment&id=$row[id]'>$row[title]</a></td> 
      <td>Amendment</td> 
      <td>$state</td> 
     </tr>"; 
    } 
} 

Répondre

1

Normalement je faire quelque chose comme ce qui suit:

public function userProposals() { 
    $username = User::getUsername(); 
    $state = User::userState(); 
    $tables = array('petition', 'proposition', 'amendment'); 
    foreach($tables as $table) { 
     $label = ucwords($table); 
     $sql = "SELECT * FROM $table WHERE author = '" . mysql_real_escape_string($username) . "'"; 
     $query = mysql_query($sql); 
     while ($row = mysql_fetch_assoc($query)) { 
      echo " 
       <tr> 
       <td>$row[id]</td> 
       <td><a href='viewproposal.php?type=$table&id=$row[id]'>$row[title]</a></td> 
       <td>$label</td> 
       <td>$state</td> 
       </tr>"; 
     } 
    } 
} 
0

Pourquoi essayez-vous pas le SQL modifié:

SELECT 'petition' as typ,title,id FROM petition 
    WHERE author = '$username' 
UNION SELECT 'proposition' as typ,title,id FROM proposition 
    WHERE author = '$username' 
UNION SELECT 'amendment' as typ,totle,id FROM amendment 
    WHERE author = '$username'" 

puis utilisez la typ de chaque ligne retournée ($row[typ]) au lieu de $this->type?

L'ensemble devrait être:

public function userProposals() { 
    $username = User::getUsername(); 
    $sql = "SELECT 'petition' as typ,id,title FROM petition 
      WHERE author = '$username' 
    UNION SELECT 'proposition' as typ,id,title FROM proposition 
      WHERE author = '$username' 
    UNION SELECT 'amendment' as typ,id,title FROM amendment 
      WHERE author = '$username'" 
    $query = mysql_query($sql); 
    $state = User::userState(); 

    while ($row = mysql_fetch_assoc($query)) { 
    echo "<tr> 
     <td>$row[id]</td> 
     <td><a href='viewproposal.php?type=$row[typ]&id=$row[id]'> 
     $row[title] 
     </a></td> 
     <td>$row[typ]</td> 
     <td>$state</td> 
    </tr>"; 
    } 
} 

basé sur ce qui était dans votre question.

+0

J'ai eu une erreur: Échec de la requête: Vous avez une erreur dans votre syntaxe SQL; consultez le manuel correspondant à votre version du serveur MySQL pour la bonne syntaxe à utiliser près de la pétition * FROM FROM WHERE author = 'test44' UNION SELECT 'proposition' comme typ, * 'à la ligne 1. De $ query = mysql_query ($ sql); – asdfasdfasdfasdf

+0

Excuses, @Farhan, j'ai oublié que vous pourriez utiliser * ou des champs mais pas les deux. Je l'ai réparé pour utiliser les champs spécifiques (que vous pourriez vouloir faire de toute façon pour minimiser le trafic envoyé à travers le fil). – paxdiablo

+0

Etrange, vous devriez au moins être en mesure d'utiliser: SELECT 'pétition' comme type, pétition. * DE pétition ... –

2

alt text

+0

+1 bon point! Vous devez faire attention aux utilisateurs qui entrent de méchants bits de SQL dans leurs noms d'utilisateur (aka, "attaques par injection SQL"). L'appel de trop de php à mysql_real_escape_string() fait en sorte que le SQL malveillant soit placé en toute sécurité dans une constante de chaîne et ne puisse pas nuire à votre application. –

+0

@nothingmuch, bien que ce soit drôle, ce n'est pas du tout utile pour répondre à la question spécifique. Il peut même ne pas être pertinent à distance, puisque vous n'avez * aucune * idée de ce que fait la fonction User :: getUsername(); il peut toujours renvoyer des valeurs aseptisées sans danger pour les requêtes. – paxdiablo

+0

Voir http://stackoverflow.com/questions/1973/what-is-the-best-way-to-avoid-sql-injection-attacks –

Questions connexes