2016-04-03 9 views
3

Ich habe seit einigen Tagen damit zu kämpfen. Ich habe gesucht, wie man Tabellen aktualisiert und es geschafft hat, so weit zu gehen, um Zeilen, aber nur den letzten in der Tabelle zu aktualisieren. Jetzt versuche ich eine Schleife zu bekommen, die alle Eingaben durchläuft und die Datenbank mit den eingegebenen Werten aktualisiert. Ich denke, den Code, der korrigiert werden muss, ist in der Nähe des Ende des Codes befindetWie man die Datenbank mit der gesamten HTML-Tabelle (PHP, MySQL) aktualisiert

Was ich tun möchte:

  • Get/Display-Datenbank in HTML-Tabelle
  • ändern Werte bestimmter Spalten
  • die Datenbanktabelle aktualisiert ein Absenden-Button verwenden, die in der Datenbank jede Zeile aktualisiert ist

hier ein Bild von dem, was wie in Web-Ansicht die Tabelle aussieht:

Table as it would look in web view

<?php 
//Connect to database 
include '../db/connect.php'; 
?> 
    <form action='test7.php' method="post"> 
     <table border='1'> 
     <?php 
      $result = $MySQLi_CON->query("SELECT * FROM users"); 
       echo "<tr>"; 
       echo "<td colspan='3'>CLASS 1</td>"; 
       echo "</tr>"; 
       //All table rows in database presented in html table 
       while($row = $result->fetch_array()){ 
        echo "<tr>"; 
        echo "<td><input type='hidden' name='user_id[]' value='".$row['user_id']."' /></td>"; 
        echo "<td>username :<input type='text' name='username[]' value='".$row['username']."' /></td>"; 
        echo "<td>email :<input type='text' name='email[]' value='".$row['email']."' /></td>"; 
        echo "<td>rank :<input type='number' name='rank[]' value='".$row['rank']."' /></td>"; 
        echo "</tr>"; 
       } 
      echo "<input type='submit' name='update' value='UPDATE' />"; 
     ?> 
     <table> 
    </form> 
<?php 
    if(isset($_POST['update'])){ 
     $total = count($_POST['rank']); 
     $user_id_arr = $_POST['user_id']; 
     $rank_arr = $_POST['rank']; 
     for($i = 0; $i < $total; $i++){ 
     $user_id = $user_id_arr[$i]; 
     $rank = $rank_arr[$i]; 
     $query = "UPDATE users SET `rank`= '".$rank."' WHERE `user_id`= '".$user_id."'"; 
     $MySQLi_CON->query($query); 
     header('Location: test7.php'); 
     } 
    } 
?> 

Wenn ich die UPDATE-Taste drücken, erhalten i PHP Notice: Array to string conversion in....

Es bezieht sich auf 30 Linie, die diese Linie ist:

$query = "UPDATE user SET rank=$_POST[rank][$row] WHERE user_id=$value ";

EDIT: der obige Code in den Arbeitscode bearbeitet werden. Danke @Frayne Konok für deine Hilfe.

+1

So .. var_dump ($ _ POST [Rang] [$ Zeile]) und var_dump ($ Wert) – Mattia

+0

Ihre Update-Abfrage möglicherweise falsch, versuchen Sie mit Quote. –

+0

Sie machen hier einen Fehler, Sie verwenden dieselbe Ressource für die foreach-Schleife, so dass Sie ein unbekanntes Problem haben. –

Antwort

0

You did a great mistake here, Why you use the $result in foreach loop?? FRom where the $result comes?? The $result is the resource of the sql query.

Versuchen Sie folgendes:

if(isset($_POST['update'])){ 
    $total = count($_POST['rank']); 
    $user_id_arr = $_POST['user_id']; 
    $rank_arr = $_POST['rank']; 
    for($i = 0; $i < $total; $i++){ 
     $user_id = $user_id_arr[$i]; 
     $rank = $rank_arr[$i]; 
     $query = "UPDATE users SET `rank`= '".$rank."' WHERE `user_id`= '".$user_id."'"; 
     $MySQLi_CON->query($query); 
    } 
} 

mit diesem Versuchen und lassen Sie mich wissen, wenn es irgendein Problem.

+0

Ich habe es versucht, und es gibt keine Fehler. Wenn ich jedoch die Schaltfläche" Aktualisieren "drücken, wird keines der Felder in der Datenbank aktualisiert. Wenn ich drücke die taste, alle werte kehren einfach zu dem zurück, was sie waren, bevor ich sie geändert habe – Onret

+0

wenn du ein 'sqlfiddle' machen kannst, dann kann ich versuchen oder das wirkliche problem herausfinden. –

+0

Ich habe noch nie 'sqlfiddle' benutzt, aber ich versuche es jetzt. Ich werde einen weiteren Kommentar schreiben, wenn ich es schaffen kann. – Onret

2

Sie sind sehr nah dran.

Das Problem ist, dass in diesem Code $_POST[rank][$row] - Rang ist eine undefinierte Konstante. Du brauchst es, um eine Zeichenfolge zu sein, so wie $_POST['rank'][$row]. Außerdem ziehen die $POST Variable aus der Abfrage direkt Schublade gesteckt zu ermöglichen - Sie sollten immer sehr unangenehm sein, wenn Sie eine Abfrage zu sehen, die $_POST Daten direkt hat:

if(isset($_POST['update'])){ 
    foreach ($result as $row => $value) { 
     // typecast to a number with decimals below. If you only need integers, than use (int) 
     $rank = (float)$_POST['rank'][$row]; 
     $query = "UPDATE user SET rank={$rank} WHERE user_id={$value}"; 
     $MySQLi_CON->query($query); 
    } 
} 

Allerdings wäre es besser, verwenden Mysqli vorbereiteten Anweisungen Anstatt die Variablen direkt einzufügen, ist der obige Code anfällig für SQL-Injection-Angriffe.

Der Code sollte wie etwas aussehen modifiziert werden, um SQL-Injection-Angriffe zu verhindern:

if(isset($_POST['update'])) { 
    $stmt = $MySQLi_CON->prepare("UPDATE user SET rank= ? WHERE user_id= ?"); 
    foreach ($result as $row => $value){  
     $stmt->bind_param('di', $_POST['rank'][$row], $value); 
     $stmt->execute(); 
    } 
    $stmt->close(); 
} 
+0

Ich habe getan, was Sie gesagt haben und den letzten Teil des Codes zu: 'if (isset ($ _ POST ['update'])) { $ stmt = $ MySQLi_CON-> vorbereiten (" $ query = "UPDATE Benutzer SET-Rang =? WHERE user_id =?"); foreach ($ Ergebnis als $ Zeile => $ Wert) { $ stmt-> bind_param ('di', $ _POST ['Rang'] [$ Zeile], $ Wert); $ stmt-> execute();} $ stmt-> close(); } ' Es gibt nun diesen Fehler: ' Anruf auf eine Elementfunktion bind_param() auf boolean' – Onret

+0

@cale_b, haben Sie bemerkt der Benutzer verwenden das gleiche? '$ result 'für die Schleife, die eine Ressource der Abfrage ist. –

Verwandte Themen