2016-07-25 7 views
1

Ich habe eine Form, die eine Checkbox-Liste dynamisch generiert: name="cursoID[]" Jeder Wert entsprechen cursoID ($curso['cursoID']), die einen Wert von einer mySQL SELECT Abfrage genommen ist, die mir eine Liste von Elementen IDs zeigt.PHP: Wie ein Array-Kontrollkästchen Wert und dann jedes einzelne Ergebnis in eine Datenbankabfrage einfügen?

Der Benutzer kann N Anzahl der Elemente auswählen, und ich muss jedes davon nehmen (dh. $cursoID = $_POST['cursoID'];), um sie in eine INSERT Abfrage zu speichern.

In der Form, ich jedes Element mit einer while-Schleife erzeugen:

<?php 
$conectar = mysqli_connect(HOST, USER, PASS, DATABASE); 
$query = " SELECT cursoID, nombreCurso, cursoFechaInicio, modalidadCurso, estadoCurso 
FROM cursos 
WHERE estadoCurso='abierto'"; 

$buscarCurso = mysqli_query($conectar,$query); 

echo '<div class="checkbox">'; 
while ($curso=mysqli_fetch_assoc($buscarCurso)) { 
echo '<input type="checkbox" name="cursoID[]" value="'.$curso['cursoID'].'">'.$curso['nombreCurso']; 
} 
echo '</div>'; 

?> 

, um meine Datenbank Konsultation dieses Feld einfügen ist eine einfache select:

INSERT INTO cursosUsuarios 
       (userID, cursoID) 
       VALUES 
       ('$userID', '$cursoID') 

habe ich keine Probleme mit $ userID, wie auch ein einzelner Wert.

Wie kann ich $cursoID = $_POST['cursoID'] verwenden, um es zur Datenbank hinzuzufügen? Ich habe einige andere Fragen gelesen (wie this one, oder this other one), aber konnte nicht, um es auf meinen Fall anzuwenden, da ich nicht weiß, wie würde ich es in die Datenbank einfügen.

Antwort

1

Es gibt zwei Möglichkeiten, Ihnen eine variable Menge von Daten in die Datenbank einfügen können:

  • Erstellen Sie Ihre Abfrage dynamisch (wenn Sie viele Spalten haben, und Sie wissen nicht, wie viele Sie aktualisieren)

Wie so:

$fields = array(); 
$values = array(); 

$fields[] = 'field1'; 
$fields[] = 'field2'; 
... 

$values[] = 1; 
$values[] = 2; 
... 

$query = 'INSERT INTO table (' . implode(', ', $fields) . ') VALUES (' . implode(',', $values) . ')'; 

// Execute $query 

oder:

  • Fügen Sie die einzelnen Elemente in separaten Abfragen hinzu, die Sie immer wieder wiederholen (wenn Sie eine variable Anzahl von Zeilen füllen müssen).

Wie so (wenn Ihr Kontrollkästchen benannt sind "cursoID []", wird der entsprechende POST-Variable wird ein Array sein, und Sie können alles verwenden, die mit Arrays arbeiten werden):

$userID_int = (int)$userID; 
foreach ($_POST['cursoID'] as $singleID) { 
    $singleID_int = (int)$singleID; 
    // Execute: INSERT INTO cursosUsuarios (userID, cursoID) VALUES ('$userID_int', '$singleID_int') 
} 

jedoch , sehr vorsichtig sein - im Moment, um Ihr Code zu SQL-Injektionen anfällig ist (zum Beispiel, wenn $ _POST [ ‚cursoID‘], um so etwas wie

'; DROP DATABASE X 

gesetzt Sie können - je nach Konfiguration - jemand erlauben um eine Menge übler Sachen zu machen von der Umgehung Ihrer Logins bis zum Entfernen Ihrer Datenbank. Daher würde ich empfehlen, einen Schritt zurück zu gehen und zu untersuchen, wie Sie Ihre Abfragen parametrisieren können, sodass Sie sich keine Sorgen machen müssen, dass ein feindseliger Besucher Daten in Ihre SQL-Abfrage eingibt. Siehe beispielsweise this answer.

+0

Ihr Code ist auch verwundbar, Sie gingen und machten einen weiteren SQL-Injection-Bug. Warum? Du weißt Casting als "Int" ist lächerlich. Du kannst es besser machen. – tadman

+0

Durch Umwandlung in int ist der Code nicht mehr anfällig für SQL-Injection. Beweisen Sie mich falsch: keiner meiner Code, der Benutzereingaben akzeptiert, ist anfällig. Meine Antwort verweist auf den richtigen Weg, nämlich vorbereitete Aussagen. Das ist es, was ich benutze, aber ich erfinde das Rad nicht neu: Ich habe ihnen gesagt, dass ihr Code verwundbar ist, beantwortete ihre Frage mit Code, der nicht verwundbar ist, und verknüpfte sie mit einer ausführlichen Antwort darüber, wie sie ihren Code tatsächlich sichern kann. Wenn es jedoch um deinen Kommentar geht, ich greife Perlen vor das Schwein, denke ich, denn trotz all dem wirst du verrückt genug, um runterzuziehen. Gut gemacht. – Aaa

+0

Casting zu int ist ein sehr spezieller Fall, der für ein ernstes Problem "repariert" wird. Kannst du für andere Situationen string oder date? Nein. Ich weiß, dass Sie mit der Lösung verbunden sind, aber wenn Sie nicht daran interessiert sind, sie in Ihre Antwort aufzunehmen, wie können Sie erwarten, dass die Person, die die Frage stellt, sich bemüht, es zu versuchen? Es sind buchstäblich zwei Codezeilen, die Sie im Schlaf tun können, wenn Sie mysqli regelmäßig benutzen. Die Parametrisierung von Abfragen dauert weniger als eine Minute. Es sollte eine zweite Natur sein. Es tut mir leid, dass ich deine unausgegorene '(int)' Lösung abgelehnt habe, aber das gibt Leuten ein gefährliches falsches Vertrauen. – tadman

2

Ich dk, wie man mysqli_ * verwendet, also schreibe ich in PDO. Wenn ich richtig verstehen könnte, ist das was du brauchst.

ps: Sicherheit ignoriert.

$cursors = $_POST['cursorID']; 
$user = $_POST['user']; 

foreach ($cursors as $cursor) { 

     $query = $DB->prepare('INSERT INTO table (user, cursor) VALUES (:user, :cursor)'); 

     $query->bindValue(':user', $user, PDO::PARAM_INT); 
     $query->bindValue(':cursor', $cursor, PDO::PARAM_INT); 

     $query->execute(); 
} 
+0

"mysqli" ist sehr ähnlich, es lohnt sich also, dies anzupassen. Der Aufruf bind_params ist anders. – tadman