2013-01-21 4 views
1

하나의 데이터베이스 열에 여러 확인란 선택을 삽입하는 간단한 솔루션을 찾고 있습니다. 사용자가 상자 1, 4 및 6을 선택하면 데이터베이스에 "1, 4, 6"이 반영됩니다. 쉼표는 좋지만 반드시 필요한 것은 아닙니다. 하나의 확인란을 선택하면 정보가 필요에 따라 삽입됩니다. 여러 항목을 선택하면 마지막 항목 만 DB에 삽입됩니다. 다른 모든 것은 정상적으로 작동하지만 이러한 체크 박스는 효과가 없습니다. 나는이 방법에 상관없이 선택한 항목 대신 임의의 숫자의 열 내부의 "어레이"나를 잎 없지만, 같은 질문을 누군가 다른 의해 제안단일 SQL 데이터베이스 열에 여러 확인란 값 삽입

<?php 
if(isset($_POST['mode'])) { 
    $mode = implode(",", $_POST['mode']); 
} else { 
    $mode = ""; 
} 
?> 

<?php 

을 사용했습니다.

내가 더 설명하기 위해 약간의 그림을 게시하려고 노력했다. 그러나 그것은 나를 허락하지 않을 것이다. 필자는 SQL이나 PHP 전문가가 아니며,이 데이터베이스를 상당히 빨리 구축하는 데 필요한만큼 배우려고 노력합니다. 이 문제에 대한 해결책이 있다면 제게 알려주십시오. 어떤 단계를해야, 보조 노트로

<td><input type="checkbox" name="mode[]" id="mode" value="1" /> 
mode 1<br /> 
<input type="checkbox" name="mode[]" id="mode" value="2" /> 
    mode 2<br /> 
<input type="checkbox" name="mode[]" id="mode" value="3" /> 
    mode 3<br /> 
<input type="checkbox" name="mode[]" id="mode" value="4" /> 
    mode 4 <br /> 
<input type="checkbox" name="mode[]" id="mode" value="5" /> 
    mode 5 <br /> 
<input type="checkbox" name="mode[]" id="mode" value="6" /> 
    mode 6 <br /> 
<input type="checkbox" name="mode[]" id="mode" value="7" /> 
    mode 7<br /> 
<input type="checkbox" name="mode[]" id="mode" value="8" /> 
    mode 8 
    </td> 

: 여기

내가 제출에 액션 스크립트 사용하고있는 코드입니다 :

<?php 
if(isset($_POST['mode'])) { 
$mode = implode(",", $_POST['mode']); 
} else { 
$mode = ""; 
} 
?> 

<?php 

// Connect to server and select database. 
mysql_connect("$host", "$username", "$password")or die("cannot connect"); 
mysql_select_db("$db_name")or die("cannot select DB"); 

// Get values from form 
$gamename=$_POST['gamename']; 
$region=$_POST['region']; 
$mode=$_POST['mode']; 
$notes=$_POST['notes']; 

// Insert data into mysql 
$sql="INSERT INTO $tbl_name(gamename, region, mode, notes)VALUES('$gamename', '$region', '$mode', '$notes')"; 
$result=mysql_query($sql); 

// if successfully insert data into database, displays message "Successful". 
if($result){ 
echo "Successful"; 
echo "<BR>"; 
echo "<a href='insert.php'>Back to main page</a>"; 
} 

else { 
echo "ERROR"; 
} 
?> 

<?php 
// close connection 
mysql_close(); 
?> 

을 그리고 여기 내 확인란에 대한 코드입니다 나는 DB와 웹 사이트가 간단한 악용에 취약하지 않도록 보장합니다. 공개적으로 정보를 데이터베이스에 제출하기 위해이 양식을 일반인이 사용할 계획입니다.

+0

mysql_로 * 기능을 사용하지 마십시오을가되지 않는 것 ([참조 * 빨간색 box *] (http://php.net/manual/en/function.mysql-query.php)) 및 sql-injection에 취약합니다. [* PDO *] (http://php.net/manual/en/book.pdo.php) 또는 [* MySQLi *] (http://php.net/manual/en/book.mysqli.php) – alfasin

+0

초보자를 위해 SQL에 대해 좀 더 자세히 설명해 주시겠습니까? 바로이 취약점이 어디에 있으며 지금 가지고있는 것과 동일한 기능을 유지하면서 취약한 코드를 대체 할 수 있습니까? –

+0

내 의견에 게시 된 링크를 읽는다면 모든 질문에 답할 것입니다. – alfasin

답변

3

올바른 $mode 변수를 무시하면 테이블 데이터에 Array이 표시됩니다.

$mode=$_POST['mode']; 

및 취약에 대해 :

코드에서이 줄을 제거하려면 문자열이 방법으로 탈출해야합니다

$gamename = mysql_escape_string($_POST['gamename']); 
$region = mysql_escape_string($_POST['region']); 
$notes = mysql_escape_string($_POST['notes']); 
+0

그 정보를 가져 주셔서 감사합니다, 나는 그 라인없이 그것을 시도하고 그것이 무엇을 제공하는지 봅니다. –

+0

해당 코드 줄을 제거하면 문제가 해결되었습니다.이제 여러 데이터베이스 선택 확인란이 데이터베이스의 단일 열에 올바르게 표시됩니다. –

+0

친구를 도울 수있어서 기쁩니다. – dimaninc

-1

다음 코드를 사용하여 선택한 상자가 쉼표로 구분 된 문자열로 확인란을 변환 할 수 있습니다.

function checkboxToString($check){ 
    while (list ($key,$val) = @each ($check)) { 
     $string .= $val.","; 
    }  
    return $string; 
} 

예 : 상자 1,3,4를 선택하면 1,3,4가 반환됩니다. 그렇습니다. 끝에 쉼표가 추가됩니다. 간단한 코드 행을 사용하여 마지막 쉼표를 제거 할 수 있습니다 (아마도 최고가 아닐 수도 있습니다). 마지막에 다음을 추가하십시오.

$string = substr($string,0,strlen($string)-1); 

그러면 문자열의 마지막 문자가 제거됩니다.

+0

그 나쁜 방법, 이후에 조인 될 배열()은 더 좋다 – dimaninc

관련 문제