2012-01-05 5 views
-1

토지에서 가장 좋은 프로그래머가 아니란 점은 누군가가 오류를 발견했거나 잘못된 방향으로 가고 있다고 말하면서이 질문을 할 것이라고 생각했습니다.서버 오류 MySQL 오류 - 1064

검색 기능을 만들어 내 MYSQL 데이터베이스를 검색 한 다음 결과를 반환하려는 Flash Builder 웹 사이트가 있습니다.

사용자가 관련 변수에 데이터를 입력하지 않은 경우를 대비하여 not null 부분을 포함했습니다.

하지만이 오류가 발생합니다. 이유 : 서버 오류 MySQL 오류 - 1064 : SQL 구문에 오류가 있습니다. 라인 1 # 여기에서 0

에 가까운 '여성 LIKE 우물과 섹스'를 사용할 수있는 권리 구문에 대한 MySQL 서버 버전에 해당하는 설명서를 확인하면 코드를입니다

public function searchClients($fname, $lname, $country, $town, $sex) { 

$SQLStatment = "SELECT id, fname, lname, sex, country, town, dateofbirth, monthofbirth, yearofbirth FROM $this->tablename"; 
$WhereClause = ""; 
$where =" Where "; 

if($fname != "NULL") { 
      $WhereClause.= 'Fname LIKE '.$fname; 
}   

if($lname != "NULL") { 
if($WhereClause != "") 
{ 
      $WhereClause.= ' AND lname LIKE ' .$lname; 
} 
else 
{ 
     $WhereClause = 'lname LIKE ' .$lname; 
} 
} 

if($country != "NULL") {  
if($WhereClause != "") 
{ 
      $WhereClause.= ' AND country LIKE ' .$country; 
} 
else 
{ 
     $WhereClause = 'country LIKE ' .$country; 
} 
} 

if($town != "NULL") { 
if($WhereClause != "") 
{ 
      $WhereClause.= ' AND town LIKE ' .$town; 
} 
else 
{ 
     $WhereClause = 'town LIKE ' .$town; 
} 
}  

if($sex != "NULL") { 
if($WhereClause != "") 
{ 
      $WhereClause.= ' AND sex LIKE ' .$sex; 
} 
else 
{ 
     $WhereClause = 'sex LIKE ' .$sex; 
} 
}  
$SQLStatment.= $where; 
$SQLStatment.= $WhereClause; 

    $stmt = mysqli_prepare($this->connection, $SQLStatment); 
    $this->throwExceptionOnError(); 

    mysqli_stmt_execute($stmt); 
    $this->throwExceptionOnError(); 

    $rows = array(); 

    mysqli_stmt_bind_result($stmt, $row->ID, $row->fname, $row->lname, $row->sex, $row->country, $row->town, $row->dateofbirth, $row->monthofbirth, $row->yearofbirth); 

    while (mysqli_stmt_fetch($stmt)) { 
     $row->fname = ucfirst(substr($row->fname,0,1)); 
     $row->lname = ucfirst($row->lname); 
     $row->town = ucfirst($row->town); 
     $row->lname = (($row->fname) . " " . ($row->lname)); 
     $row->yearofbirth = GetAge($row->dateofbirth. '-' .$row->monthofbirth. '-' .$row->yearofbirth); 
     $row->Pic_loc = ""; 
     $row->Pic_loc= "IMAGES/".($row->ID)."/image01.jpg"; 
     $rows[] = $row; 
     $row = new stdClass(); 
     mysqli_stmt_bind_result($stmt, $row->ID, $row->fname, $row->lname, $row->sex, $row->country, $row->town, $row->dateofbirth, $row->monthofbirth, $row->yearofbirth); 
    } 

    mysqli_stmt_free_result($stmt); 
    mysqli_close($this->connection); 

    return $rows; 
} 

그것은 나에게 좋은 보이지만, 작동하지 않는다, 어떤 제안? 그 신음이

if($town != "NULL") { 
if($WhereClause != "") 
{ 
      $WhereClause.= ' AND town LIKE ' .$town; 
} 
else 
{ 
     $WhereClause = 'town LIKE ' .$town; 
} 
}  

if($sex != "NULL") { 
if($WhereClause != "") 
{ 
      $WhereClause.= ' AND sex LIKE ' .$sex; 
} 
else 
{ 
     $WhereClause = 'sex LIKE ' .$sex; 
} 
}  

을 것을 은 정말 이상한은 절을 경우 다른 세에 대해 신음하지 않는 것을 발견 코드에서 포인트 가까이를 고정 할 수 있지만, 지난 2에 대한 않습니다. 같은

답변

3

를 Where 절을 보일 것입니다 : 당신은 준비된 문을 사용할 수 있습니다

$WhereClause .= ' AND sex LIKE "' . mysql_escape_string($sex).'"'; 

/PDO 코드를 단순화하고 귀하의 문자열을 인용한다

+0

와우는 정확하고 빠르며 정확한 오류는 없었습니다. :) 감사의 말투는 단지 내 테스트가 내가 찾던 결과를 만들어주기를 바랍니다. 다시 한 번 감사합니다. – WhiteFinger

1

SQL 인젝션에서 응용 프로그램을 보호하기 위해 모두. 당신이 좋아

+0

나는 Teez에 동의합니다. 첫 번째 답변을 준 사람이지만 하루가 끝날 때 오류가 해결되지만 다른 오류는 코드가 내 IF를 무시하는 것으로 나타나며 변수가 null 인 경우 계속할 수 없다고 말합니다. 내가 nulls을 제거하고 있다고 생각했던 것이 그 곳? – WhiteFinger

1

첫째로 당신의 가치 주위 퍼센트 기호를 사용할 필요가 없을시 BTW

if($town != "NULL") { 
    if($WhereClause != "") 
    { 
       $WhereClause.= ' AND town LIKE "' .mysql_escape_string($town).'"'; 
    } 
    else 
    { 
      $WhereClause = 'town LIKE "' .mysql_escape_string($town).'"'; 
    } 
    }  

    if($sex != "NULL") { 
    if($WhereClause != "") 
    { 
       $WhereClause.= ' AND sex LIKE "' .$sex.'"'; 
    } 
    else 
    { 
      $WhereClause = ' sex LIKE "' .$sex.'"'; 
    } 
    } 

디버깅 팁 때 즉시 문을 구축하고 있으며, : WHERE 절에 변화 아래 수행 당신이 즉시 알아낼 수없는 SQL 에러를 얻으십시오. 할 일은 빌드 된 문장을 출력하는 것입니다. 부분적으로,이처럼 보이는 것 : 당신이 당신의 값 주위에 따옴표가되는 것을 볼 수 있습니다, 그에서

SELECT … lname LIKE wells AND sex LIKE female … 

없는-이 있어야한다 : 그래서

SELECT … lname LIKE 'wells' AND sex LIKE 'female' … -- quoting non-numeric is NOT optional in SQL 

이 실행 얻을, 당신은 작은 따옴표로 추가 할 수 있습니다. 그러나 여전히 두 가지 문제와 잠재력이 있습니다.

  1. 이것은 여전히 ​​작동하지 않습니다. 하위 문자열 일치를 수행하려는 = 대신 LIKE을 사용한다고 가정합니다. 따라서 값 주위에 백분율 기호 (lname LIKE '%wells%')를 추가해야합니다.
  2. 이미 준비된 문을 사용하고 있습니다. 자리 표시 자 (예 : lname LIKE ?)를 사용하여 쿼리를 작성한 다음 그 방법으로 작성하면됩니다. 이렇게하면 이스케이프가 처리되어 SQL 삽입을 방지합니다.

잠재적 인 세 번째 문제점은 LIKE를 사용하여 부분 문자열 일치의 성능이 끔찍하다는 것입니다.일치 유형은 이 아니며 색인을 사용할 수 있습니다. 당신은 전체 테이블 스캔을하고 있습니다. 본격적인 검색 솔루션 (Sphinx, fulltext 등)을 사용하면이 문제를 해결할 수 있지만 더 많은 작업을 추가 할 수 있습니다.

+0

응답 derobert 주셔서 감사합니다, 나는 이미 '% wells %'부분을 사용했지만 해결하려고하는 오류로 인해이를 제거했습니다. 이 함수는 모든 부분이 null이 아니고 하나의 변수가 다음과 같으면 정신적으로 움직일 때 작동합니다 :(따라서 드로잉 보드로 되돌아갑니다 – WhiteFinger