2017-07-09 1 views
3

Ich habe ein Benutzerformular, das einen einzigen Datensatz "aktuell" setzt. Es kann nicht mehr als ein Datensatz gleichzeitig auf den aktuellen Stand gesetzt werden. Also, ich präsentiere dem Benutzer eine einzelne Dropdown-Liste, sie wählen das Element, das sie aktuell setzen möchten und drücken Sie "UPDATE" am unteren Rand des Formulars.Wie kann ich mit mysqli/php alle Datensätze aktualisieren, nachdem eine Abfrage bereits ausgeführt wurde?

Die PHP/Mysqli muss gehen und setzen Sie alle Datensätze Spalte "aktuelle" auf einen Wert von 0 dann aktualisieren Sie die aus dem Formular auf einen Wert von "1".

Zunächst habe ich einfach die Anzahl der Zeilen gezählt und eine Reihe von Abfragen ausgeführt, um die Spalte auf 0 oder 1 zu aktualisieren, wenn der Schleifenzähler = die ID der Zeile ist. Nun ... das ging schnell los, als ich anfing, an anderen Teilen zu testen, und die Indexzahlen wurden höher als die Gesamtzahl der Zeilen. Ja, dumme Art, es anfänglich zu tun!

Hier ist, was ich mit der PHP/MySQL-Code zu tun versucht:

// $link is the database link defined elsewhere. This does work as I use it all over the place 
 
$setCurrent = X; // This is the number passed from my form 
 

 
$init_query = "SELECT id, current FROM myTable"; 
 

 
if ($stmt = $link->$prepare($init_query) { 
 
    $stmt->execute() or die ($stmt->error); 
 
    $stmt ->bind_result($id, $current) 
 
    while ($stmt->fetch()){ 
 
    if ($id == $setCurrent){ 
 
    
 
    $update_sql = "UPDATE myTable SET current ='1' WHERE id='".$setCurrent."'"; 
 
    $stmt2 = $link->prepare($update_sql); 
 
    $stmt2->execute; 
 
    
 
    } 
 
    
 
    else { 
 
    $update_sql = "UPDATE myTable SET current ='0' WHERE id='".$id."'"; 
 
    $stmt2 = $link->prepare($update_sql); 
 
    $stmt2->execute; 
 
} 
 
$stmt->close();

Dies schlägt fehl, und gibt mir ein Fatal error: Uncaught Fehler: Rufen Sie auf eine Elementfunktion auf boolean ausführen in .....

Ich bin mein Gehirn über dies und kann nicht herausfinden, was zum Teufel ist los. Es ist ein paar Jahre her, dass ich in PHP/MySql gearbeitet habe und dies ist meine erste Erfahrung in OO Mysqli. Bitte seien Sie sanft :)

+0

könnte praktisch sein, die Zeile zu erwähnen, wo Ihr Skript fehlschlägt. Welche Abfrage gibt den Fehler? –

+0

ist es wahrscheinlich die extra $ in Vorbereitung()? –

+0

Ich habe den Code von einem anderen System umgesetzt. Die Syntax funktioniert auf dem Entwicklungssystem. Die extra $ und die Curleys sind nur fette Fingersatz. – user3723090

Antwort

1

Sie fehlen zwei schließende geschweifte Klammern. Eine für die erste if() und die andere für while()

1

warum sie einzeln nacheinander? Sie können es in einer Abfrage tun

$setCurrent = X; 
$query = 'UPDATE myTable 
      SET `current` = (id = :current)'; 
$stmt = $link->prepare($query); 
$stmt->bindValue(':current', $setCurrent); 
$stmt->execute(); 

(und die Tatsache, missbräuchlich, wenn id $ setCurrent entspricht, der Teil zwischen() auf true löst, die 1. ist)

einiges zu erklären:

SELECT 10=10; würde eine Art "WAHR" geben. Aber wie Mysql nicht wahr geben, geben sie 1. das gleiche gilt für:

SELECT 10=20; dies falsch ist, so gibt Ihnen 0.

Nun zurück zu Ihrer Suchanfrage: Sie 0 Wert erhalten möchten für alle aufzeichnen für welche ID nicht gleich einer Nummer ist. Und Sie wollen 1, wenn Sie gleich sind: Sie müssen also den Wert der Spalten-ID mit $ setCurrent vergleichen. Wenn sie übereinstimmen, erhalten Sie 1 und Sie setzen diese 1 in die Spalte "aktuelle" Und wenn sie nicht übereinstimmen, alle anderen Fälle, dann erhalten Sie eine 0 und diese 0 geht in die Spalte Current.

Und ja, dies auch getan werden könnte, wie:

UPDATE mytable 
SET `current` = CASE id 
       WHEN $setCurrent THEN 1 
       ELSE 0 
       END CASE 

oder mit IF, Aber sie andere Syntax ist viel kürzer

bearbeiten backtics benötigt werden, um Spaltennamen, als Strom ist ein reserviertes Wort

+0

Können Sie mehr Kontext für 'bereitstellen (und die Tatsache missbrauchen, dass, wenn id gleich $ setCurrent ist, der Teil zwischen() auf true aufgelöst wird, was 1 ist.) " – user3723090

+0

Meine Tabelle ist so eingerichtet, dass ID, Name, Datum , aktuelles Das Formular stellt ein Dropdown zur Verfügung, so dass der Benutzer "Name" finden und sagen kann, yup das ist, was ich will. Go! Der Formularhandler nehmen die ID mit diesem Namen zugeordnet und übergibt es an die Gesamtfunktion Setzen Sie die Zeile, die mit der aktuellen Spalte dieser ID verknüpft ist, auf den Wert 1 und dann alle anderen Spalten auf "0". – user3723090

+0

@ user3723090 Ich habe oben eine Erläuterung hinzugefügt –

Verwandte Themen