2016-10-11 5 views
-1

Ich habe zwei Tabellen:PHP PDO Mögliche LEFT JOIN Spaltennamen und Spaltenwert erhält

  1. Benutzer

    Standard-Benutzertabelle (ID, Name, E-Mail, Land, Stadt, Passwort, Geschlecht).

  2. Sprachen

    Jede Spalte hat den Namen einer Sprache z.B. "Englisch", "Spanisch", "Russisch". Der Wert jeder Spalte ist ein Int, der das Niveau der Kenntnisse in der entsprechenden Sprache angibt.

Die ID für jede Zeile wird user.id aus der Benutzertabelle genommen, um die Sprachen eines Benutzers zu speichern. Der Standardeintrag ist NULL und wird durch ein int ersetzt, wenn eine Sprache von einem Benutzer gesprochen wird.

Ich möchte alle Benutzer auswählen, die den Eintrag einer Suchanfrage (Land, Stadt, Geschlecht) passen, dann möchte ich die Sprachtabelle anhand der Benutzer-ID aus der Benutzertabelle LEFT JOIN languages ON (user.id=languages.id) überprüfen und nur den Spaltennamen abrufen und Werte der Spalten, die NULL nicht enthalten.

Mein Ansatz so weit:

sql = 'SELECT * FROM ' . self::TABLE . 
     ' WHERE country=? AND city LIKE ? AND gender LIKE ? LEFT JOIN languages ON ('. 
     self::TABLE . 
     '.id=languages.id) SHOW COLUMNS WHERE COLUMN NAME ? ORDER BY name DESC'; 

Der obige Code offensichtlich fehlerhaft ist, meine Frage ist, wie würde ich darüber nach SHOW COLUMNS gehen?

Beispielsätze: Sprachtabelle user_id = 9, Englisch NULL =, spanisch = 3, russisch = 2, Koreanisch = 1

Benutzertabelle id = 9, E-Mail = [email protected], Land = Südkorea, Stadt = Seoul, Geschlecht = 1

Nachdem ich nur die Benutzer ausgewählt habe, die dem Land, der Stadt und dem Geschlecht entsprechen, die von der Suchabfrage zur Verfügung gestellt werden, möchte ich jede Benutzeridentifikation nehmen und die Sprachtabelle für die Spalten überprüfen die nicht null enthalten und diese Spaltennamen zusammen mit ihrem Wert dem Benutzerobjekt für jeden Benutzer einzeln hinzufügen, dann alle Objekte zurückgeben, so kann ich sie zum angemeldeten Gebrauch ausgeben Wer macht die Suche?

Wie ich INSERT und aktualisieren Sie die Sprachen:

public function updateLanguages($languages, $id) { 

    $sql = "SELECT user_id FROM " . self::TABLE . " WHERE user_id=? LIMIT 1"; 
    $stmt = $this->dbh->prepare($sql); 
    $stmt->execute(array($id)); 
    $userId = $stmt->fetchAll(); 

    if (empty($userId)) { 

     $sql = 'INSERT INTO ' . self::TABLE . ' (user_id) VALUES(?)'; 
     $values = array($id); 
     $stmt = $this->dbh->prepare($sql); 
     $stmt->execute($values); 

     $this->resetLanguages($id); 

     for ($i = 0; $i < count($languages)/2; $i++) { 

      $sql = 'UPDATE ' . self::TABLE . ' SET ' . $languages['language' . $i] . '=? WHERE user_id =? LIMIT 1'; 
      $stmt = $this->dbh->prepare($sql); 
      $stmt->execute(array($languages['langlevel' . $i], $id)); 
      $stmt = null; 
     } 
    } else { 

     $this->resetLanguages($id); 

     for ($i = 0; $i < count($languages)/2; $i++) { 

      $sql = 'UPDATE ' . self::TABLE . ' SET ' . $languages['language' . $i] . '=? WHERE user_id =? LIMIT 1'; 
      $stmt = $this->dbh->prepare($sql); 
      $stmt->execute(array($languages['langlevel' . $i], $id)); 
      $stmt = null; 
     } 
    } 
} 

Reset-Funktion:

public function resetLanguages($id) { 
    $languages = new Languages(); 
    $allLangs = $this->getLanguages(); 
    $allLangs = array_slice($allLangs, 1, 137); 

    foreach ($allLangs as $lang) { 

     $sql = 'UPDATE ' . self::TABLE . ' SET ' . $lang['Field'] . '=? WHERE user_id =? LIMIT 1'; 
     $stmt = $this->dbh->prepare($sql); 
     $stmt->execute(array(null, $id)); 
     $stmt = null; 
    } 
} 

Benutzer INSERT:

public function save($data) { 
    $utilityManager = new UtilityManager(); 
    $rand = $utilityManager->randomGen(); 
    $user = new User(); 
    $user->arrayToObject($data); 
    $folderName = $user->getName() . $rand; 
    $profileFolder = 'profilePic'; 
    mkdir('users/' . $folderName, 0755); 
    mkdir("users/$folderName/" . $profileFolder, 0755); 
    $sql = 'INSERT INTO ' . self::TABLE . ' (name, email, country, password, emailConfirm, imageFolder, registered, lastOnline) VALUES(?, ?, ?, ?, ?, ?, NOW(), NOW())'; 
    $values = array($user->getName(), $user->getEmail(), $user->getCountry(), $user->getPassword(), $user->getEmailConfirm(), $folderName); 
    $stmt = $this->dbh->prepare($sql); // prepares the sql statement to be filled 
    $stmt->execute($values); //fills the sql statement with the $values array 

    if ($stmt->rowCount() > 0) { 
     $utilityManager->sendEmail(array('reg', $user->getEmail(), $user->getName(), $user->getEmailConfirm())); 
    } 
} 
+0

Können Sie Beispieldatensätze und erwartete Ergebnisse angeben? –

+0

Sie können den SQL-Spaltennamen nicht abrufen. Aber Sie können Abhilfe schaffen, indem Sie die Spaltennamen auf den gleichen Wert wie den Spaltennamen setzen und stattdessen in der Abfrage –

+0

abrufen. Die Sprachtabelle sollte nur zwei Spalten haben: user_id und language_id. In diesem Fall ist die Abfrage ein Kinderspiel. –

Antwort

-1

Ihre Datenbank-Design ist falsch. Sprachen-Tabelle nur zwei Spalten: user_id und language_id

In diesem Fall können Sie einfach Benutzer-Tabelle

SELECT * FROM users u, languages l 
    WHERE u.id = user_id AND lang_id=? AND country=? AND city LIKE ? AND gender LIKE ? 

Hinweis auf Sprachtabelle verbinden, dass mit der richtigen Struktur, die Sie viele Vorteile erhalten. Zum Beispiel, anstatt nur "Ja" oder "Nein" für die Sprache zu haben, können Sie das "Kompetenz" -Feld hinzufügen, um verschiedene Abstufungen zu markieren.Und dann wähle alle Benutzer aus, deren Kenntnisse in der gewählten Sprache nicht geringer sind als die angegebene.