2012-06-20 11 views
6

Dies ist meine erste Website, die serverseitige Technologie verwendet. Und es ist auch mein erstes Eintauchen in PHP Arbeiten entlang Seite MYSQL. Ich habe gearbeitet und gelernt, wie ich gehe.PHP - Einfügen von Daten aus Checkbox-Formularen in MYSQL

Ich habe eine grundlegende Verwaltungsseite für eine Datenbank von Produkteinträgen für eine kleine Abendkleid Geschäft erstellt.

Ich habe an der Funktionalität eines Formulars gearbeitet, das der Administrator verwenden kann, um neue Einträge in die Datenbank hochzuladen.

Einige dieser Einträge sind:

Kleid Bezeichnung [Texteingabe]

Farbe Verfügbarkeit [Kontrollkästchen]

Ich habe von mehreren Check in Schwierigkeiten Daten laufen Felder aus einem HTML-Formular in die Datenbank.

Die Entscheidungen in dem Kontrollkästchen sollten einen Booleschen Wert darstellen (ja/nein - 1/0)

Hier ist die Form Struktur:

<form action="inventory_list.php" enctype="multipart/form-data" name="myForm" id="myform" method="post"> 
    <table width="90%" border="0" cellspacing="0" cellpadding="6"> 
    <tr> 
    <td width="20%" align="right">Dress Name</td> 

    <td width="80%"><label> 
    <input name="Dress_name" type="text" id="Dress_name" size="64" /> 
    </label> 
    </td> 
    </tr> 

    <tr> 
    <td align="right">Collections</td> 
    <td> 
    <label> 
     <select name="collections" id="collections"> 
      <option value="other">Other</option> 
      <option value="hermione">Hermione</option> 
      <option value="jora">Jora</option> 
      <option value="manon">Manon</option> 
     </select> 
    </label></td> 
    </tr> 
    <tr> 
    <td align="right">Available Sizes</td> 
    <td> 
     <input type="checkbox" name="sizes[]" value="1" /> Sizes 2-6<br /> 
     <input type="checkbox" name="sizes[]" value="1" /> Sizes 6-10 <br /> 
     <input type="checkbox" name="sizes[]" value="1" /> Sizes 10-14<br /> 
     <input type="checkbox" name="sizes[]" value="1" /> Sizes 14-18 <br /> 
     <input type="checkbox" name="sizes[]" value="1" /> Sizes 18-22<br /> 
     <input type="checkbox" name="sizes[]" value="1" /> Sizes 22-26 <br /> 

    </td> 
    </tr> 
    <tr> 
    <td align="right">Dress Colours</td> 
    <td> 
     <input type="checkbox" name="colours[]" value="1" /> Pinks/Reds <br /> 
     <input type="checkbox" name="colours[]" value="1" /> Blues/Greens <br /> 
     <input type="checkbox" name="colours[]" value="1" /> Violet/Purple<br /> 
     <input type="checkbox" name="colours[]" value="1" /> Yellow/Orange/Brown/Gold <br /> 
     <input type="checkbox" name="colours[]" value="1" /> Black/White<br /> 

    </td> 
    </tr> 
    <tr> 
    <td align="right">Product Image</td> 
    <td><label> 
     <input type="file" name="fileField" id="fileField" /> 
    </label></td> 
    </tr>  
    <tr> 
    <td>&nbsp;</td> 
    <td><label> 
     <input type="submit" name="button" id="button" value="Add This Item Now" /> 
    </label></td> 
    </tr> 
</table> 
</form> 

Und hier ist die PHP, das ich gebaut habe Umgang mit dem Formular, das Daten an die Datenbank übermittelt.

<?php 
if (isset($_POST['Dress_name'])) { 

$dress_name = mysql_real_escape_string($_POST['Dress_name']); 
$collections = mysql_real_escape_string($_POST['collections']); 
$sizesArray = $_POST['sizes']; 
$coloursArray = $_POST['colours']; 

foreach ($sizesArray as $key => $value) 
{ 
    echo "Key = $key || Value = $value<br />"; 
} 

foreach ($coloursArray as $ckey => $cvalue) 
{ 
    echo "Key = $ckey || Value = $cvalue<br />"; 
} 

//See if that product name is an identical match to another product in the system 
$sql = mysql_query("SELECT ID FROM names WHERE Dress='$dress_name' LIMIT 1"); 
$productMatch = mysql_num_rows($sql); // count the output amount 
if ($productMatch > 0) { 
    echo 'Sorry you tried to place a duplicate "Product Name" into the system, <a href="inventory_list.php">click here</a>'; 
    exit(); 
} 


//Add this product into the database now 
$sql = mysql_query("INSERT INTO names (Dress) 
    VALUES('$dress_name')") or die (mysql_error()); 
$pid = mysql_insert_id(); 



//Place image in the folder 
$newname = "$pid.jpg"; 
move_uploaded_file($_FILES['fileField']['tmp_name'], "../inventory_images/$newname"); 
header("location: inventory_list.php"); 
exit(); 
} 
?> 

Wie Sie sehen können, habe ich soweit, die Daten in ein Array zu setzen. Und jetzt habe ich eine kleine Mauer getroffen, ich kann keine Antwort finden, die irgendwo Sinn macht.

Wie bekomme ich die booleschen Werte in korrekte Spalten in der Datenbanktabelle?

Schätzen Sie Ihre Zeit!

+0

Ihre Checkboxen auf dem HTML-Formular haben alle den gleichen Wert - ich denke, dass Sie ihre Werte gleich zu haben geeignete Größe? – andrewsi

+0

MySQL [boolean type] (http://dev.mysql.com/doc/refman/5.5/en/numeric-type-overview.html) sieht aus wie Nullen und eins. Wenn der Wert wahr ist, speichern Sie eine 1 in der Spalte. Wenn der Wert falsch ist (oder einfacher nicht wahr ist), speichern Sie eine Null. – buley

+0

Aufgrund der Art und Weise, wie MySQL Booleans behandelt, ist es viel besser, TINYINT zu verwenden. Der boolesche Typ kann seltsame Fehler verursachen: Wenn Sie nur ein Auf- oder Ab-Flag haben möchten, verwenden Sie eine Ganzzahl mit der Länge 1. –

Antwort

8

Das erste, was zu wissen ist, dass HTML-Kontrollkästchen ein Ergebnis zurückgeben, wenn es aktiviert ist, und nichts zurückgibt, wenn nicht aktiviert.Daher ist es wichtig, in Ihrem HTML Ihre Werte Zuwachs haben:

<td align="right">Available Sizes</td> 
<td> 
    <input type="checkbox" name="sizes[]" value="1" /> Sizes 2-6<br /> 
    <input type="checkbox" name="sizes[]" value="2" /> Sizes 6-10 <br /> 
    <input type="checkbox" name="sizes[]" value="3" /> Sizes 10-14<br /> 
    <input type="checkbox" name="sizes[]" value="4" /> Sizes 14-18 <br /> 
    <input type="checkbox" name="sizes[]" value="5" /> Sizes 18-22<br /> 
    <input type="checkbox" name="sizes[]" value="6" /> Sizes 22-26 <br /> 
</td> 

Eine vollständig normalisierte Datenbank-Schema wie folgt aussehen würde:

//Note that 'names' and 'collections are overloaded 
    //words and should be avoided 
table BRANDS 
    id INT AUTOINCREMENT 
    collectionname VARCHAR 

table SIZES 
    id INT AUTOINCREMENT 
    sizecategory VARCHAR //ie 'Sizes 18-22' 

table COLOURS 
    id INT AUTOINCREMENT 
    colourname VARCHAR 

table INVENTORY 
    id INT AUTOINCREMENT 
    brandid INT FOREIGN KEY (BRAND) 
    imageurl VARCHAR 

table INVENTORY_SIZES 
    inventoryid INT FOREIGN KEY 
    sizeid FOREIGN KEY 

table INVENTORY_COLOURS 
    inventoryid INT FOREIGN KEY 
    colourid FOREIGN KEY 

Ihre BRAND, COLOURS und SIZES Tabellen müssten sein Sie können Ihre Seite theoretisch mit Daten aus diesen Tabellen laden. Die IDs jeder Zeile in diesen Tabellen sollten als Werte in den Checkbox-Arrays enden.

//get your inputs 
$query_values = array(); 
$query_values[':brandid'] = $dress_name = $_POST['Dress_name'];//note that you should change the value in your options here to the unique ids in your database. 
$query_values[':sizeid'] = getSize($_POST[]); 
$query_values[':colourid'] = getColour($_POST[]); 
$query_values[':quantity'] = $_POST['quantity']; 
$query_values[':imageurl'] = $_POST['imageurl']; 


//Prepare and execute your sql 
    //Note that PDO will handle escaping problematic inputs. 
$sql = "INSERT INTO INVENTORY ('brandid', 'imageurl') VALUES (:brandid, :sizeid, :colourid, :quantity, :imageurl)"; 
executeInsert($sql, $query_values); 
$inventoryid = mysql_insert_id(); 

saveSizes($_POST['sizes'], $inventoryid); 
saveColours($_POST['colours'], $inventoryid); 

function saveSizes($size_array, $inventoryid) { 
    $sql = "INSERT INTO INVENTORY_SIZES ('inventoryid', 'sizeid') VALUES (:inventoryid, :sizeid)"; 
    foreach ($size_array as $sizeid) { 
    $query_values = array(); 
    $query_values[':inventoryid'] = $inventoryid; 
    $query_values[':sizeid'] = $sizeid; 
    executeInsert($sql, $query_values); 
    } 
} 

function saveColours($colour_array) { 
    $sql = "INSERT INTO INVENTORY_COLOURS ('inventoryid', 'colourid') VALUES (:inventoryid, :colourid)"; 
    foreach ($size_array as $sizeid) { 
    $query_values = array(); 
    $query_values[':inventoryid'] = $inventoryid; 
    $query_values[':colourid'] = $colourid; 
    executeInsert($sql, $query_values); 
    } 
} 

function executeInsert($sql, $query_values) { 
    $query = $conn->prepare($sql); 
    $query->execute($query_values); 
} 

Seien Sie sicher, PHP PDO zum Schutz vor Sicherheitsfragen zu verwenden. Ich bin mir ziemlich sicher, dass einige davon besser abstrahiert/gereinigt werden könnten, aber das sollte den Job machen. (Obwohl ich auch ziemlich sicher bin, dass es kleine Fehler gibt, weil ich diese Kälte und ohne zu testen.)

0

Sie müssen die INSERT-Anweisung in eine 'else' -Anweisung nach dem 'if' einfügen, die prüft, ob der Name bereits in der Datenbank existiert.

Ich bin mir nicht sicher, was genau Sie versuchen zu tun, da es keine Anweisung gibt, die Sie ausführen, um die "Checkbox" -Werte in der Datenbank zu setzen. Sie geben das Array sizes als Ausgabe zurück, die der Administrator sehen soll, nachdem er dieses Formular gesendet hat, aber Sie fügen es nicht in die Datenbank ein.

Was hilft, wenn Sie die Datenbankstruktur (die Spaltennamen) teilen können. Wenn Sie Spalten nicht für Größen 2-5 & andere Kategorien, fügen Sie diejenigen & dann Insert-Anweisung wie folgt ändern:

INSERT INTO names (Dress,Size2to5,Size5to10,Size10to15,Size15to20) VALUES('$dress_name','$size[0]','$size[1]','size[2]','size[3]')

Hoffnung, das hilft. Lassen Sie uns wissen, ob dies für Sie funktioniert.