준비된 문을 사용하여 식별자와 키워드 바인딩
문제:
동적 쿼리 만들기 준비된 문을 사용하지만 테이블 이름, 필드 이름 또는 구문 키워드 결과를 바인딩하려고 시도합니다. 빈 배열입니다.
코드:
function search_db($db, $searchTerm, $searchBy, $searchTable){ try{ $stmt = $db->prepare(' SELECT * FROM ? WHERE ? LIKE ? '); $stmt->bindParam(1, $searchTable); $stmt->bindParam(2, $searchBy); $stmt->bindValue(3, '%'. $searchTerm.'%'); $stmt->execute(); } catch(Exception $e) { return array(); } return $stmt->fetchAll(PDO::FETCH_ASSOC); }
예상 결과:
데이터베이스의 결과 배열
실제 결과:
텅 비어 있음 array.
원인:
준비된 문은 데이터 리터럴만 바인딩할 수 있으며 식별자(예: 테이블 또는 필드 이름)나 구문 키워드는 바인딩할 수 없습니다.
해결 방법:
동적 식별자나 키워드를 사용하려면 다음을 따르세요. 단계:
형식 식별자:
허용 목록 동적 값:
수정코드:
$field = "`" . str_replace("`", "``", $field) . "`"; $table = "`" . str_replace("`", "``", $table) . "`"; $sql = "SELECT * FROM $table WHERE $field = ?";
키워드:
If 필요하다면 동적 키워드도 화이트리스트에 추가하고 유효성을 검사하세요. 다음 지침을 따르면 준비된 문에 동적 식별자와 키워드를 안전하게 포함할 수 있습니다.
위 내용은 준비된 문에서 동적 테이블 및 필드 이름을 어떻게 안전하게 사용할 수 있습니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!