2016-07-23 4 views
0

ich eine SELECT Abfrage, die Informationen von einem Benutzer abruft:

einige persönliche Daten, und die ihm zugewiesene Benutzerrollen innerhalb der Website, die mehr als eine sein kann (im Beispiel gibt es zwei).

Ich möchte diese Benutzerrollen abrufen und sie der globalen Variablen $_SESSION hinzufügen.

Dies ist die Abfrage (in phpMyAdmin getestet und es funktioniert wie beabsichtigt: ruft zwei Reihen von Ergebnissen, da der Benutzer das gleiche ist, aber er hat zwei Rollen role1 und role2):

$conectar = mysqli_connect(localhost, USER, PASS, DATABASE); 
$consulta = "SELECT usuarios.userID, usuarios.userEmail, usuarios.userPass, usuarios.userFechaGeneracion, usuarios.userNombres, rolesUsuarios.nombreRol 
       FROM rolesUsuarios, usuarios 
       WHERE usuarios.userEmail='$email' 
       "; 
$buscarUsuario = mysqli_query($conectar,$consulta); 
     if ($buscarUsuario) { 
      $row = mysqli_fetch_array($buscarUsuario); 
      [here I have some pass check in place] 
      $_SESSION['usuario'] = $email; 
      $_SESSION['nombre'] = $row['userNombres']; 
      $_SESSION['uid'] = $row['userID']; 
      $_SESSION['nombreRol'] = $row['nombreRol']; 
      .... 

Jetzt $_SESSION['nombreRol'] war eine Schnur. Wenn ich es ausgedruckt habe, wird nur ROLE1 angezeigt. So

Ich versuchte es auf ein Array zu konvertieren eine Schleife durch das Hinzufügen dieser:

$_SESSION['nombreRol'] = array(); 
for ($i=0; $i < 3; $i++) { 
    array_push($_SESSION['nombreRol'], $row['nombreRol']); 
} 

Und dann getötet die Sitzung und begann erneut, diesmal versucht, es als ein Array zu drucken mit diesem: print_r(array_values($_SESSION['nombreRol']));

und das Ergebnis zeigt:

Array ([0] => ROLE1 [1] => ROLE1 [2] => ROLE1) 

Wie soll ich alle Rollen in einer Reihe, um es zu benutzen?

Nach Shrikant Mavlankar Kommentar, habe ich das versucht:

   $rolesAsignados = array(); 
       while($row = mysqli_fetch_array($buscarUsuario)){ 
         array_push($rolesAsignados, $row['nombreRol']); 
        } 

       $_SESSION['nombreRol'] = array(); 
       for ($i=0; $i < count($rolesAsignados); $i++) { 
        array_push($_SESSION['nombreRol'], $rolesAsignados[$i]); 
       } 

Und dann versucht, die Sitzung Array zu drucken:

print_r(array_values($_SESSION['nombreRol'])); 

Es zeigt:

Array ([0] => ROLE2)

+0

Weil Sie in Ihrer for-Schleife denselben Wert von $ row ['nombreRol'] in das Session-Array schieben. Ich habe meine Antwort unten hinzugefügt und lassen Sie mich wissen, ob es für Sie funktioniert. –

+0

Ihre Abfrage addiert sich nicht. Sie machen nur eine Auswahl für alle Rollen für den Benutzer. Wenn Sie also 10 Rollen in der Rollentabelle haben, erhalten Sie 10 Datensätze für alle Rollen, kombiniert mit den Benutzerdaten. Das kann nicht korrekt sein, da Sie ein 'JOIN' erstellen müssen, um die richtigen Daten auszuwählen. Wenn ein Benutzer mehrere Rollen haben kann, können Sie auch nicht die Daten des Benutzers UND die Rollen in einer Abfrage auswählen. – DarkBee

+0

auch ich denke, Sie wollen 'fetch_assoc' nicht' fetch_array' – chiliNUT

Antwort

1

Sie haben keine Mitgliedschaft in Ihrem WHERE. Sie fügen den Datensatz eines Benutzers mit jeder Zeile in der Rollentabelle hinzu, sodass Ihre Ergebnismenge groß ist, Sie aber nur die erste Zeile lesen.

$consulta = "SELECT usuarios.userID, usuarios.userEmail, usuarios.userPass, usuarios.userFechaGeneracion, usuarios.userNombres, GROUP_CONCAT(rolesUsuarios.nombreRol SEPARATOR '|') AS roles 
      FROM rolesUsuarios, usuarios 
      WHERE usuarios.userEmail='$email' 
       AND rolesUsarios.userID = usarios.userID 
      GROUP BY usarios.userID 
      "; 

Dann Ihre Aufgabe wie folgt ändern:

$_SESSION['nombreRol'] = explode('|', $row['roles']); 

Auch nie unescaped Variablen in SQL-Anweisungen setzen. Sie sollten mysqli_real_escape_string() oder mysqli::prepare verwenden, um Variablen zu binden. Es gibt heutzutage keine Entschuldigung, SQL-Injection-Fehler zu erzeugen.

+0

Danke! Soll ich die $ _SESSION ['nombreRol'] 'Variable in die Schleife einfügen? Denn wenn ich 'print_r (array_values ​​($ _SESSION ['nombreRol']))) nicht:' zeigt nur 'Array ([0] => ROLE1)'. Vielen Dank! (Ich habe '$ email = strip_tags ($ _ POST ['email']);' für die Variable) – Rosamunda

+0

Es muss nicht in einer Schleife sein, nur neben den anderen Zuordnungen. Hast du das 'AND' aus dem' WHERE' hinzugefügt? – Walf

+0

Danke !! Ich habe Änderungen an Ihrer Antwort hinzugefügt, weil usuarios.userNombres nur das erste Element zurückgegeben hat und ich stattdessen das CONCAT-Ergebnisfeld abrufen musste. – Rosamunda