2012-06-20 21 views
6

To jest moja pierwsza strona internetowa, która korzysta z technologii po stronie serwera. To także moje pierwsze zagłębienie w PHP pracujące wzdłuż strony MYSQL. Pracuję i uczę się jak idę.PHP - Aby wstawić dane z formularzy checkbox do MySQL

Stworzyłem podstawową stronę zarządzania dla bazy danych produktów dla małej firmy balowej.

Pracuję nad funkcjonalnością formularza, za pomocą którego administrator może przesłać nowe wpisy do bazy danych.

Niektóre z tych pozycji należą:

Sukienka Nazwa [wprowadzania tekstu]

Dostępność kolorów [sprawdź skrzynki]

jakie napotkasz problemy z uzyskaniem danych z wielu czeku pola z formularza HTML do bazy danych.

Wybory w polach wyboru powinna stanowić wartość logiczną (tak/nie - 1/0)

Oto struktura forma:

<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> 

I tu jest PHP, który ja zbudowałem do obsługi formularza przesyłania danych do bazy danych.

<?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(); 
} 
?> 

Jak widać, udało mi się wprowadzić dane do tablicy. A teraz uderzyłem kawałek ceglanego muru, nie mogę znaleźć odpowiedzi, która ma sens wszędzie.

Jak uzyskać wartości boolowskie w odpowiednich kolumnach w tabeli bazy danych?

Doceń swój czas!

+0

Twoje pola wyboru w formularzu HTML mają tę samą wartość - myślę, że chciałeś, aby ich wartości były równe odpowiedni rozmiar? – andrewsi

+0

MySQL [typ boolean] (http://dev.mysql.com/doc/refman/5.5/en/numeric-type-overview.html) wygląda jak zera i jeden. Jeśli wartość jest prawdą, przechowuj 1 w kolumnie. Jeśli wartość jest fałszywa (lub po prostu nie jest prawdą), przechowuj zero. – buley

+0

Właściwie ze względu na sposób, w jaki MySQL obsługuje wartości logiczne, lepiej jest używać TINYINT. Typ boolowski może powodować dziwne błędy: jeśli chcesz tylko flagi w górę lub w dół, użyj liczby całkowitej o długości 1. –

Odpowiedz

8

Pierwszą rzeczą, którą należy wiedzieć, to że pola wyboru HTML zwrócą wynik, jeśli są zaznaczone, i nie zwrócą nic, jeśli nie są zaznaczone.Dlatego ważne w html jest mieć swój przyrost wartości:

<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> 

Schemat pełni znormalizowana baza danych będzie wyglądać mniej więcej tak:

//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 

Twój BRAND, COLOURS i SIZES stoły musiałyby być poprawnie wypełnione dostępnymi opcjami i teoretycznie dynamicznie można załadować stronę z danymi z tych tabel. Identyfikatory każdego z wierszy w tych tabelach powinny kończyć się jako wartości w tablicach pól wyboru.

//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); 
} 

Pamiętaj, aby używać PHP PDO do ochrony przed problemami bezpieczeństwa. Jestem prawie pewna, że ​​niektóre z nich mogą być wyabstrahowane/oczyszczone lepiej, ale to powinno załatwić sprawę. (Chociaż jestem dość pewny, że robię to zimno i bez testowania, są małe błędy).

0

Należy umieścić instrukcję wstawiania w instrukcji "else" po znaku "jeśli", który sprawdza, czy nazwa już istnieje w bazie danych.

Nie jestem pewien, co dokładnie próbujesz zrobić, ponieważ nie ma żadnego oświadczenia, które wykonujesz, aby umieścić wartości "checkbox" w bazie danych. Powtarzasz tablicę sizes jako dane wyjściowe, które administrator widzi po przesłaniu tego formularza, ale nie umieszczasz go w bazie danych.

Co pomoże, jeśli możesz udostępnić strukturę bazy danych (nazwy kolumn). Jeśli nie ma żadnych kolumn o rozmiarach 2-5 & inne kategorie, dodać te & następnie zmienić swoje oświadczenie insert do następujących:

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

nadzieję, że to pomaga. Daj nam znać, czy to działa dla Ciebie.

Powiązane problemy