2016-08-02 14 views
2

Ich habe ein Problem beim Erstellen benutzerdefinierter Felder, nachdem der Datenbank bereits Daten hinzugefügt wurden. Ich habe mir das schon eine Weile angesehen und mein Gehirn ist abgeschaltet. Ich versuche es so gut wie möglich zu erklären.Benutzerdefinierte Felder, die nach Eingabe bereits eingegebener Daten erstellt wurden

Ich habe 2 Tabellen, custom_fields und custom_fields_values. Ich sortiere diese Felder auch über eine Tabellenspalte. Wenn ich sie aus der db ziehe, muss ich den Tabellen beitreten, damit die Ergebnisse in der gleichen Reihenfolge wie die Felder angezeigt werden. Wenn ich das nicht tue, werden die Daten durcheinander gebracht.

$customfield = $pdo->prepare("SELECT * FROM custom_fields ORDER BY fieldorder ASC"); 
$customfield->execute(); 
$customfield = $customfield->fetchAll(PDO::FETCH_ASSOC); 

$customfieldvals = $pdo->prepare("SELECT vals.* FROM custom_fields_values vals JOIN custom_fields fields ON fields.id = vals.fieldid WHERE vals.related_system=:relsystem ORDER BY fields.fieldorder ASC"); 
$customfieldvals->bindParam(':relsystem', $get_system['id'], PDO::PARAM_STR); 
$customfieldvals->execute(); 
$customfieldvals = $customfieldvals->fetchAll(PDO::FETCH_ASSOC); 

I haben dann eine foreach Schleife, die die Daten richtig anzeigt. Das Problem tritt auf, wenn ich ein neues benutzerdefiniertes Feld hinzufüge, das keinen Wert enthält, weil es in der Tabelle custom_fields erstellt wurde, aber NICHT in der Tabelle custom_fields_values, so dass es bei ON fields.id = vals.fieldid nicht übereinstimmt. Wenn ich die Felder auswähle, während dies keinen Wert hat, nimmt es den Wert eines anderen Feldes. Im Wesentlichen, weil es auf der id Ebene der Felder und fieldid der Werte nicht übereinstimmt, wird alles durcheinander gebracht.

Wie kann ich es zu wo, wenn es keinen Wert Zeile erstellt hat, wird es nur zeigen NULL egal was statt den Wert eines anderen Feldes zu nehmen?

EDIT

soll ich das über den richtigen Weg oder gibt es einen besseren Weg, das benutzerdefinierte Feld Wert folgen das benutzerdefinierte Feld zu haben, anstatt die JOIN Methode?

Antwort

1

Sie müssen Left Join in Ihre Abfrage verwenden. Linker Join gibt null zurück Wenn der Wert für das benutzerdefinierte Feld in der Tabelle "custom_fields_values" nicht gefunden wird.

Also Abfrage wird so aussehen.

$customfieldvals = $pdo->prepare("SELECT vals.* FROM custom_fields_values vals LEFT JOIN custom_fields fields ON fields.id = vals.fieldid WHERE vals.related_system=:relsystem ORDER BY fields.fieldorder ASC"); 
+0

'LEFT JOIN' hat nicht funktioniert. Es hat das gleiche Ergebnis. – CrunchyToast

+0

Hast du es mit 'Right Join' versucht? –

+1

@CrunchyToast Sie können diese Abfrage auch versuchen. 'SELECT vals. * FROM Felder für benutzerdefinierte Felder LINKE VERBINDUNG custom_fields_values ​​vals EIN fields.id = vals.fieldid WHERE vals.related_system =: relsystem ORDER BY fotos.fieldorder ASC' –

0

ich zunächst nicht darüber nachdenken hat, sondern stattdessen eine separate Abfrage des Anrufers total nur Werte für ich die $customfieldvals Abfrage und verändert die $customfield Abfrage entfernt. Dies sperrt stattdessen den Wert für das Feld, anstatt sie nur zu verknüpfen.

$customfield = $pdo->prepare("SELECT * FROM custom_fields fields LEFT JOIN custom_fields_values vals ON fields.id = vals.fieldid WHERE vals.related_system=:relsystem ORDER BY fieldorder ASC"); 
$customfields->bindParam(':relsystem', $_GET['id'], PDO::PARAM_STR); 
$customfield->execute(); 
$customfield = $customfield->fetchAll(PDO::FETCH_ASSOC); 

und dann meine foreach:

foreach ($customfield as $fields) {... 

Das erlaubte mir

$fields['value']

eher zu nennen als

$customfieldvals[$key]['value']