2016-04-07 18 views
0

vielleicht ist der Fragetitel nicht sehr beschreibend. Das ist, weil ich wirklich nicht wusste, wie man es schreibt. Aber mein Problem hier ist, dass ich eine Tabelle mit drei Spalten pagemetaid benannt habe, page_property und property_value und das ist, wie es aussieht:Aktualisieren einer MySQL-Spalte mit Schlüsseln aus einer anderen Spalte aus der gleichen Tabelle

----------------------------------- 
id | page_property | property_value| 
------------------------------------ 
1 | telephone  | 445854541  | 
2 | email   | [email protected] | 
3 | icon   | img/1.jpg  | 

So weit so gut. Jetzt habe ich ein HTML-Formular, das eine Post-Anfrage an eine PHP-Seite sendet. Die Array-Schlüssel $_POST sind nach den Feldern aus der Spalte page_property benannt, wie: Telefon und E-Mail und Symbol. Die Array-Werte $_POST werden über die Eingabefelder im Formular festgelegt. Am Ende habe ich ein Array $ _POST mit diesen Werten:

telephone=>8988989 
email=>[email protected] 
icon=> img/2.jpg 

Das Problem beginnt hier, wo ich versuche, die pagemeta Tabelle zu aktualisieren. Ich weiß nicht, wie man die Abfrage UPDATE schreibt, wo die Felder in der Spalte property_value mit ihrem entsprechenden Schlüssel aus dem Array $_POST aktualisiert werden. Dies bedeutet, dass die Felder in property_value in Bezug auf die Feldwerte in der Spalte page_property aktualisiert werden sollten. Entschuldigung für die Frage so unklar und kompliziert. Ich wusste wirklich nicht, wie ich es erklären sollte. Jede Bearbeitung wäre willkommen und jede Antwort wäre eine große Hilfe. Danke Ich habe überall gesucht, aber keine Antwort gefunden.

Antwort

1

Mit dieser Datenbankstruktur, werden Sie 3 Abfragen müssen 3 Werte aktualisieren, die meiner Meinung nach ziemlich schlecht ...

UPDATE pagemeta SET property_value = $_POST['telephone'] WHERE page_property = 'telephone' 
 
UPDATE pagemeta SET property_value = $_POST['email'] WHERE page_property = 'email' 
 
UPDATE pagemeta SET property_value = $_POST['icon'] WHERE page_property = 'icon'

Vielleicht möchten Sie Ihre Datenbank zu überdenken Struktur, ich bin mir nicht sicher, was Sie mit Ihrer Struktur zu gewinnen, anstatt es normal zu tun und eine Spalte namens Telefon, eine andere namens E-Mail und eine letzte namens Symbol

PD: Bitte verwenden Sie vorbereitete Statem ents

+0

Die Idee, eine Spalte für jedes Feld zu schaffen, ist nicht das, was ich will, weil diese Tabelle verwendet für mehrere Seiten und jede Seite hat eigene Eigenschaften und Eigenschaftswerte. Wenn ich es so mache und meine Tabellenstruktur ändere, muss ich für jede Seite eine Tabelle erstellen. – DevMan

+0

Dann wird meine Antwort funktionieren, aber Sie werden in einem Albtraum enden, in dem Sie die Datenbank jedes Mal überprüfen müssen, um herauszufinden, welche Optionen auf eine bestimmte Seite angewendet werden können. Ich denke immer noch, Sie könnten/sollten es tun, wie ich sagte, Sie müssen nur eine Spalte namens page_id zu Ihrer Tabelle hinzufügen, und dann können Sie die Einstellungen auf eine bestimmte Seite verknüpfen. – Borjante

1

Wenn Sie das HTML-Formular erstellen, fügen Sie normalerweise ein ausgeblendetes Feld hinzu, das die ID der Zeile enthält, die Sie bearbeiten.

<form> 
<input type="hidden" name="id" value="1"> <!-- id of record being edited --> 
<input type="tel" name="telephone" value="8988989"> 
<input type="email" name="email" value="[email protected]"> 
<input type="text" name="icon" value="img/2.jpg"> 
</form> 

Ihr $ POST-Array wäre:

id=>1 
telephone=>8988989 
email=>[email protected] 
icon=> img/2.jpg 

In Abwesenheit einer Id, Sie würden davon ausgehen, dass Sie einen neuen Eintrag erstellen möchten d.h eine weitere Zeile in die Tabelle einfügen.

Ihr Tabellenlayout würde sich auch in einen ändern, der alles in einer Zeile enthält.

Wenn Sie eine ID erhalten, würde Ihr UPDATE sein:

UPDATE pagemeta SET 
telephone=$_POST[telephone], 
email=$_POST[email], 
icon=$+POST[icon] 
WHERE id=$_POST[id] 

NB Die obige SQL ist nur zu Veranschaulichungszwecken. In Wirklichkeit müssen Sie validieren Ihre Formulareingabe, um SQL-Injektion Angriffe zu vermeiden

0

Ok. Sie sitzen in Ihrer PHP-IDE und schauen sich einige globale Variablen an und denken: Wie kann ich diese in eine Datenbank zerlegen?'

Jede anständige IDE warnt Sie bereits davor, einen Superglobal zum Abrufen von Daten zu verwenden. Was die IDE Ihnen nicht sagen wird ist, dass das, was Sie tun, ausgenutzt wird, wenn Sie es jemals im Web veröffentlichen.

Es klingt wie Sie gleich zu Beginn Ihrer Reise sind so Ihre Frage zu beantworten, wie Sie es gefragt:

$conn = new mysqli("servername", "username", "password", "dbname"); 
    foreach($_POST as $key => $value) { 
     $sql = "UPDATE pagemeta SET property_value = $value WHERE page_property = $key" 
     $conn->query($sql) 
    } 
$conn->close() 
+0

Ich weiß, wie man mit $ _POST umgeht, und ich weiß, wie man SQL Injection und andere Arten von Exploits vermeidet. Ich wollte nur wissen, ob es eine Möglichkeit gibt, eine Abfrage zu schreiben, um dieses Problem zu lösen. – DevMan

+0

Keine Dramen. Wenn Sie bei diesem Entwurf für Ihre Datenbank bleiben, schreiben Sie eine Aktualisierungsabfrage für jeden Ihrer individuellen property_values. – BlueWater86

+0

Diskussion über Ihre 'schemaless' Design: http://StackOverflow.com/Questions/11779252/entity-Attribute-value-table-design – BlueWater86

Verwandte Themen