2009-07-09 9 views
1

Ich habe den folgenden Code, den ich ausführen möchte, aber das Problem ist $ this-> Typ wird festgelegt, wenn die Klasse erstellt wird, indem Sie entweder Petition, Vorschlag oder Änderung angeben. Wie Sie sehen können, ist meine $ sql-Anweisung eine UNION von allen dreien, und ich möchte angeben, aus welcher Tabelle (Pet, Requisite oder Änderung) jede Datenzeile stammt.Condensing diesen Code

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

    while ($row = mysql_fetch_assoc($query)) { // $this->type needs to specify pet,prop,amend 
     echo " 
     <tr> 
      <td>$row[id]</td> 
      <td><a href='viewproposal.php?type=$this->type&id=$row[id]'>$row[title]</a></td> 
      <td>$this->type</td> 
      <td>$state</td> 
     </tr>"; 
    } 
} 

Wie Sie sehen können, wird $ this-> type nur eines der drei sagen. Um meine Funktion funktionieren zu lassen, wie ich wollte, tat ich dies (was ich fühle, ist zu lang & dort muss ein kürzerer Weg sein).

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>"; 
    } 
} 

Antwort

1

Ich würde normalerweise etwa wie folgt tun:

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

Warum versuchen Sie nicht, die geänderte SQL:

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'" 

und dann die typ aus jeder Zeile zurück ($row[typ]) statt $this->type verwenden?

Das sollte ganze Sache sein:

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>"; 
    } 
} 

auf das, was in Ihrer Frage war.

+0

Ich habe einen Fehler: Abfrage fehlgeschlagen: Sie haben einen Fehler in Ihrer SQL-Syntax; Überprüfen Sie das Handbuch, das Ihrer MySQL-Server-Version entspricht, für die richtige Syntax in der Nähe von '* FROM petition WHERE author =' test44 'UNION SELECT' Vorschlag 'als typ, *' in Zeile 1. Von $ query = mysql_query ($ sql); – asdfasdfasdfasdf

+0

Entschuldigung, @Farhan, ich habe vergessen, dass Sie entweder * oder Felder verwenden können, aber nicht beides. Ich habe es behoben, um die spezifischen Felder zu verwenden (die Sie sowieso vornehmen möchten, um den über die Leitung gesendeten Datenverkehr zu minimieren). – paxdiablo

+0

Seltsam, sollten Sie zumindest in der Lage sein zu verwenden: SELECT 'petition' AS typ, petition. * FROM petition ... –

2

alt text

+0

+1 guten Punkt! Sie müssen darauf achten, dass Benutzer in ihren Benutzernamen unangenehme SQL-Teile eingeben ("SQL Injection Attacks"). @tooo viel php Aufruf an mysql_real_escape_string() stellt sicher, dass das schädliche SQL ist sicher in eine String-Konstante gesetzt und kann Ihre Anwendung nicht schaden. –

+0

@nothingmuch, während das lustig ist, ist es überhaupt nicht hilfreich, die spezifische Frage zu beantworten. Es ist möglicherweise nicht einmal entfernt relevant, da Sie * keine * Idee haben, was die User :: getUsername() Funktion tut; Es kann immer sanierte Werte für die Verwendung in Abfragen zurückgeben. – paxdiablo

+0

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