2017-04-18 4 views
1

Ich habe ein Problem beim Versuch, Informationen aus einem Formular, das dynamisch in PHP generiert wird einzufügen. Das Formular besteht aus einer variablen Anzahl von Eingaben, die alle aus vier Eingabeelementen bestehen. Im folgenden sehen Sie, wie meine Form generiert:PHP Array aus mehreren Kontrollkästchen und Texteingabe in mySQL einfügen

<?php $result = mysql_query("SELECT id,name,description FROM todo_q WHERE todo_id = $todo_id AND active = 'y'"); 
       while($todo_q=mysql_fetch_array($result)){ 

               echo '<label>'; 
               echo $todo_q['name']; 
               echo '</label><br>'; 

               echo '<input type="checkbox" name="value[]" value="y" />'; 
               //echo '<input type="hidden" name="value[]" value="n" />'; 

               echo '<label>'; 
               echo $todo_q['description']; 
               echo '</label><br>'; 
               echo '<input type="text" id="comment" name="comment[]">'; 

               echo '<input type="hidden" name="user_id[]" value="'; 
               echo $user_id; 
               echo '" />'; 
               echo '<input type="hidden" name="todo_id[]" value="'; 
               echo $todo_q['id']; 
               echo '" />'; 
               echo '<HR>'; 

               }?> 

Und das ist, wie ich versuche, die Informationen in mySQL einzufügen:

$query = "INSERT INTO todo_a (value, comment, user_id, todo_id) VALUES "; 
$query_parts = array(); 
for($x=0; $x<count($_POST["value"]); $x++){ 
    $query_parts[] = "('" . $_POST['value'][$x] . "','" . $_POST['comment'][$x] . "'," . $_POST['user_id'][$x] . "," . $_POST['todo_id'][$x] . ")"; 


    } 
    $q_parts = $query_parts; 

     foreach ($q_parts as $q_p){ 

      $insert = ($query .= implode(',', $query_parts)); 
      $result = mysql_query($insert); 
     } 

Das Problem, das ich habe, ist, dass, wenn Check alle Kontrollkästchen und Kommentare alles eingeführt wird in der rechten Reihe in der DB, aber wenn ich ein Kontrollkästchen check, dann wird es vermasselt ...

Ich möchte es die eine neue Zeile einfügen, wenn es das Kontrollkästchen aktiviert ist und/oder ein Kommentar eingegeben wird . Kann mir jemand in die richtige Richtung zeigen?

Ich habe versucht, eine versteckte Eingabe zu setzen, um den Wert der nicht markierten Kontrollkästchen zu bekommen, aber ich scheint nicht zu arbeiten .. Das, warum ich die ausgeblendete Checkbox auskommentiert habe.

PS. Ich weiß, ich sollte mysqli verwenden, aber dies ist eine ältere Website, die ich noch nicht ..

+2

** Obligatorische Warnung: Bitte verwenden Sie diesen Code bitte nicht in der Produktion. **. Bereinigen Sie Ihre Abfragen, um einige XSS zu verhindern. Haben Sie dieses Problem ebenfalls überprüft? http://stackoverflow.com/questions/5640298/php-insert-data-from-checkbox-array-into-mysql?rq=1 – Pogrindis

+2

FYI, [Sie sollten nicht mysql_ * 'Funktionen in neuen Code verwenden] (http://stackoverflow.com/questions/12859942/). Sie werden nicht mehr gepflegt [und sind offiziell veraltet] (https://wiki.php.net/rfc/mysql_deprecation). Siehe die [rote Box] (http://php.net/manual/en/function.mysql-connect.php)? Erfahren Sie mehr über [* prepared statements *] (https://en.wikipedia.org/wiki/Prepared_statement) und verwenden Sie [PDO] (http://php.net/pdo) oder [MySQLi] (http: // php.net/mysqli) - [dieser Artikel] (http://php.net/manual/en/mysqlinfo.api.choosing.php) wird Ihnen helfen zu entscheiden, welches für Sie am besten ist. –

+1

Ihr Skript ist in Gefahr von [SQL Injection Attack] (http://stackoverflow.com/questions/60174/how-can-i-prevent-sql-injection-in-php) Schauen Sie sich an, was mit [Little Bobby Tables] (http://bobby-tables.com/) Sogar [wenn Sie Eingaben entgehen, ist es nicht sicher!] (Http://stackoverflow.com/questions/5741187/sql-injection-that-gets-around -mysql-real-escape-string) Verwenden Sie [vorbereitete parametrisierte Anweisungen] (http://php.net/manual/en/mysqli.quickstart.prepared-statements.php). –

Antwort

1

Sie müssen Index hinzufügen in Eingabe Checkbox aktualisiert haben und kommentieren Namen wie:

$cbIndex = 0; 
while($todo_q=mysql_fetch_array($result)){ 
    echo '<label>'; 
    echo $todo_q['name']; 
    echo '</label><br>'; 
    // Generate checkbox with index of current result 
    echo '<input type="checkbox" name="value[' . $cbIndex . ']" value="y" />'; 
    // Generate comment with index of current result 
    echo '<input type="text" id="comment" name="comment[' . $cbIndex . ']">'; 
    echo '<input type="hidden" name="user_id[' . $cbIndex . ']" value="'; 
    echo $user_id; 
    echo '" />'; 
    echo '<input type="hidden" name="todo_id[' . $cbIndex . ']" value="'; 
    echo $todo_q['id']; 
    echo '" />'; 
    echo '<HR>'; 
    // Inc of index 
    $cbIndex++; 
} 

Wenn Sie bitte Ihre Form, nur geprüft Checkbox wird in $ _POST [ "Wert"] werden angezeigt:

foreach ($_POST["value"] as $cbIndex => $cbValue) { 
    $query_parts[] = "('" . $_POST['value'][$cbIndex] . "','" . $_POST['comment'][$cbIndex] . "'," . $_POST['user_id'][$cbIndex] . "," . $_POST['todo_id'][$cbIndex] . ")"; 
    // or 
    $query_parts[] = "('" . $cbValue . "','" . $_POST['comment'][$cbIndex] . "'," . $_POST['user_id'][$cbIndex] . "," . $_POST['todo_id'][$cbIndex] . ")"; 
} 
... 

Btw, brauchen Sie nicht zu speichern Wert von Kontrollkästchen, das 'y' die ganze Zeit sein wird.

INFO, die für einen Test-App wird gut, aber wie durch @Pogrindis und @John Conde, es ist nicht sicher Code kommentiert. MySQLi/PDO + Prepare-Anweisung vermeidet SQL-Injection.

+1

Danke @camille für Ihren Vorschlag. Es scheint zu funktionieren. Und ich werde das nicht so verwenden, wie es in einer "Live" -App ist. Für jetzt ist es nur ein Test. – user2533103

+0

Perfekt! Schön dass dir das hilft :-D – Camille

Verwandte Themen