2013-08-28 2 views
2

사용자가 경제 데이터 요구 사항을 선택할 수 있도록 드롭 다운 상자를 설정했습니다. 나는 mysqli를 사용하여 SQL 주입을 막으려 고하고 있지만, 운이 없다. 여기 내 코드 :SQL 주입을 막으려 고 시도

$gYear = $_POST["year"]; 
$gYear2 = $_POST["year2"]; 
$gMonth = $_POST["month"]; 
$gSelect = $_POST["location"]; 

switch($_POST['location']){ 
case "loc1": 
$column = "Fayette"; 
break; 

case "loc2": 
$column = "Henry"; 
break; 

case "loc3": 
$column = "Randolph"; 
break; 
case "loc4": 
$column = "Rush"; 
break; 

case "loc5": 
$column = "Union"; 
break; 

case "loc6": 
$column = "Wayne"; 
break; 

case "loc7": 
$column = "INCounties"; 
break; 

case "loc8": 
$column = "Indiana"; 
break; 

case "loc9": 
$column = "Butler"; 
break; 

case "loc10": 
$column = "Darke"; 
break; 

case "loc11": 
$column = "Mercer"; 
break; 

case "loc12": 
$column = "Preble"; 
break; 

case "loc13": 
$column = "OHCounties"; 
break; 

case "loc14": 
$column = "Ohio"; 
break; 

case "loc15": 
$column = "US"; 
break; 
} 

$query = $conn->prepare("SELECT $column, Year, Month, FROM unemployed WHERE year BETWEEN ? AND ? and month= ?"); 

$query->bind_param('s', $gyear, $gYear2, $gMonth); 

$query->execute(); 
$result = $query->get_result(); 

echo"<table>"; 
echo "<tr><th>Year</th><th>Month</th><th>$column</th></tr>"; 

while ($row = $result->fetch_assoc()){ 

echo "<tr><td>"; 
echo $row->$column; 
echo "</td><td>"; 
echo $row->Year; 
echo "</td><td>"; 
echo $row->Month; 
echo "</td></tr>"; 

} 

$query->close(); 



echo "</table"; 

} 

이것은 나를 위해 작동하지 않습니다. 나는 이것에 잠시 붙어있다. 내 코드의 어떤 부분에 문제가 있는지 알고 있습니까? 나는 PHP 5.3.26을 사용하고있다. 어떤 도움이라도 대단히 감사하겠습니다.

+2

'bind_param ('SSS', $의 gYear의, $ gYear2, $ gMonth의가)'당신은 ..', 또한'배열 ('LOC1'=> '페이 에트'를 사용할 수 있습니다,이'ss'을 놓친 (array_key_exists ($ _ POST [ 'location'], $ array)) $ column = $ array [$ _ POST [ 'location']]' –

+0

남자, 나는이 많은 일을 한번도 피곤했다. 집게 손가락이 하루 종일 괴롭힘 –

+0

배열을 만들어야 만합니까? array_key_exists에 익숙하지 않습니다. – user2562125

답변

-1

이 시도 :

$query = $conn->prepare("SELECT `".$column."`, `Year`, `Month` FROM `unemployed` WHERE `Year` BETWEEN ? AND ? AND `Month`= ?"); 

전과 열 및 테이블 이름 뒤에 역 인용 부호를 추가해야합니다. 게다가 cAsE가 데이터베이스에 나타나는 방식과 일치하는지 기억하십시오. 그리고 거기에 대괄호가 없을 수도 있다고 생각하기 때문에 BETWEEN 구문을 더 많거나 적은 옵션으로 변경할 것입니다.

WHERE `YEAR` > ? AND `YEAR` <= ? AND `Month` = ? 
+0

SQL 주입을 방지하기 위해 이전 스타일의 mysqli_real_escape_string()을 사용할 수 있습니다. 일부 경우에는 코드가 손상되어 작동을 멈추게 할 수도 있습니다. , 그러나 그것은 여전히 ​​기본 주사에 대해 잘 보호합니다. – Piero

+0

왜 downvoted를 설명 할 수 있습니까? – Piero