2013-05-30 4 views
0

이 웹 사이트는 관할권에 따라 특정 법률/규칙을 표시하기위한 것입니다.mysqli PHP 테이블 이름 하이픈 또는 공백으로

카운티를 발견하고이와 화면에 카운티 이름을 표시하는 간단한 mysqli 쿼리가 :

echo "><a href=\"index.php?sel_subj=" . urlencode($subject["county_name"]) . "\"> 
{$subject["county_name"]}</a></li>"; 

이 그럼 당신은 (링크 내장) 카운티 이름을 클릭을하고 mysqli 쿼리가가 그 카운티 이름을 가진 테이블을 찾아 그 카운티 내의 모든 관할 구역을 찾아야한다고 생각했습니다.

if (isset($_GET['sel_subj'])){ 
    $query2 = "SELECT * FROM $sel_subj"; 
    $result2 = $mysqli2->query($query2) or die($mysqli2->error.__LINE__); 
    while ($subject = mysqli_fetch_array($result2)) { 
     echo "<li"; 
     echo "><a href=\"index.php?sel_page=" . urlencode($subject["muni_name"]); 
     echo "&sel_subj=" . urlencode($sel_subj). "\"> 
     {$subject["muni_name"]}</a></li>"; 
    } 
} 

문제는 일부 카운티 이름은 공백이나 하이픈을 포함한다는 것이다. 따라서 하이픈이나 공백이있는 카운티를 클릭하면 오류가 발생합니다.

하이픈이있는 경우이 오류가 발생합니다 (예 : Miami-Dade). SQL 구문에 오류가 있습니다. 오른쪽 구문을 사용하여 MySQL 서버 버전에 해당하는 매뉴얼을 확인하십시오. '-Dade'를 173에서 사용하십시오.

공백이 있으면이 오류가 발생합니다 (예 : Palm Beach) : 테이블 'florida.palm' 존재하지 않습니다. 73

카운티가 특수 문자가없는 문자열 일 경우, 관할 구역은 아무 문제없이 표시됩니다.

간단한 해결책이 있습니까?

+1

해커에게 ** 크기 **의 구멍을 제공 하시겠습니까? –

+0

어디에서 $ sel_subj 값을 설정합니까 – Anigel

+0

@Anigel 아마도 글로벌 변수가 켜져있을 수 있습니다. 어떤, user2436671, 당신은 돌봐야 만합니다. – MaX

답변

0

데이터베이스 구조가 잘못되었습니다.

반드시 이어야합니다. ONE 테이블은 다른 열 중 필드가되는 테이블입니다.

그래서 코드는 당신이 그런 문자가 포함 된 경우 카운티 이름을 포장해야이

if (isset($_GET['sel_subj'])){ 
    $query = "SELECT * FROM documents WHERE country = ?"; 
    $stmt = $mysqli->prepare($query) or trigger_error($mysqli->error); 
    $stmt->bind_param('s',$_GET['sel_subj']); 
    $stmt->execute(); 
    $res = $stmt->get_result(); 
    while ($subject = mysqli_fetch_array($res)) { 
     echo "<li"; 
     echo "><a href=\"index.php?sel_page=" . urlencode($subject["muni_name"]); 
     echo "&sel_subj=" . urlencode($sel_subj). "\"> 
     {$subject["muni_name"]}</a></li>"; 
    } 
} 
+0

감사합니다. 다른 질문이 있습니다 ... – adamearl

-1

처럼해야합니다. 하지만, 당신은 또한 당신의 입력을 소독해야합니다

$query2 = "SELECT * FROM `".mysqli_real_escape_string ($sel_subj)."`"; 

편집 : 또한

, 당신은 SQL 주입을 방지하기 위해 prepared statements으로 보일 것입니다.

정의 할 수있는 테이블 이름을 군 정보를 포함하는 테이블 이름으로 제한하여 입력 내용을 추가로 위생해야합니다.

+1

please nooooo! mysqli_real_escape_string이 prepared statement가 아니기 때문에 주입에 도움이되지 않는다. –

+0

나는 테이블 이름에 공백이있을 수있는 동적 테이블 이름에 대한 특별한 필요성 때문에이 일을해야한다. 나는 이것이 훌륭한 해결책이라고 말하지는 않지만 그가 필요로하고 묻는 것입니다. – MaX

+0

입력 해 주셔서 감사합니다.많은 사람들이 SQL injection에 대해 이야기하고 준비된 문장에 대해 이야기했지만 필자는 그러한 것들을 염두에두고 구축하는 방법을 확신하지 못했습니다. 이 사이트를 개발하기 위해 도서, 웹 페이지 및 문자열로 함께 코드 스 니펫을 가져 오는 것입니다. 이러한 것들에 대한 훌륭한 자습서 나 설명을 알고 있습니까? – adamearl