Ich habe zwei Tabellen:PHP PDO Mögliche LEFT JOIN Spaltennamen und Spaltenwert erhält
Benutzer
Standard-Benutzertabelle (ID, Name, E-Mail, Land, Stadt, Passwort, Geschlecht).
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()));
}
}
Können Sie Beispieldatensätze und erwartete Ergebnisse angeben? –
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 –
abrufen. Die Sprachtabelle sollte nur zwei Spalten haben: user_id und language_id. In diesem Fall ist die Abfrage ein Kinderspiel. –