복붙노트

준비된 문장에서 테이블 이름을 매개 변수화 할 수 있습니까?

PHP

준비된 문장에서 테이블 이름을 매개 변수화 할 수 있습니까?

나는 mysqli_stmt_bind_param 함수를 여러 번 사용했다. 그러나 SQL 삽입을 방지하기 위해 노력하고있는 변수를 분리하면 오류가 발생합니다.

다음은 몇 가지 코드 샘플입니다.

function insertRow( $db, $mysqli, $new_table, $Partner, $Merchant, $ips, $score, $category, $overall, $protocol )
{
    $statement = $mysqli->prepare("INSERT INTO " .$new_table . " VALUES (?,?,?,?,?,?,?);");
    mysqli_stmt_bind_param( $statment, 'sssisss', $Partner, $Merchant, $ips, $score, $category, $overall, $protocol );
    $statement->execute();
}

어떻게 든 $ new_table을 대체 할 수 있습니까? 다른 물음표 문과의 연결, 다른 바인드 매개 변수 문 만들기 또는 SQL 삽입을 방지하기 위해 기존 매개 변수 문에 추가?

이것 또는 이것의 어떤 모양 같이 :

function insertRow( $db, $mysqli, $new_table, $Partner, $Merchant, $ips, $score, $category, $overall, $protocol )
{    
    $statement = $mysqli->prepare("INSERT INTO (?) VALUES (?,?,?,?,?,?,?);");
    mysqli_stmt_bind_param( $statment, 'ssssisss', $new_table, $Partner, $Merchant, $ips, $score, $category, $overall, $protocol );
    $statement->execute();
}

해결법

  1. ==============================

    1.

    귀하의 질문에 대한 짧은 대답은 "아니오"입니다.

    가장 중요한 의미에서, 데이터베이스 레벨에서 준비된 명령문은 매개 변수가 SQL 문의 "값"비트에 바인드되는 것을 허용합니다.

    이것을 생각하는 한 가지 방법은 "문장의 의미를 변경하지 않고 문장을 실행시에 대체 할 수있는 것"입니다. 테이블 이름은 SQL 문 자체의 유효성 (즉, 유효한 컬럼 이름)을 판별하고 실행시이를 변경하면 SQL 문이 유효한지 여부가 잠재적으로 변경되므로 런타임 값 중 하나가 아닙니다.

    약간 더 높은 레벨에서 PDO와 같이 준비된 명령문 매개 변수 대체를 에뮬레이션하는 데이터베이스 인터페이스에서도 PDO와 같이 준비된 명령문을 실제로 보내지는 않습니다. 이는 위치 표시기를 어느 위치로든 사용할 수있게합니다 해당 시스템의 데이터베이스)에서 테이블 자리 표시 자의 값은 문자열이 될 것이고 데이터베이스에 전송 된 SQL 내에 포함되어 있으므로 SELECT * FROM? mytable과 param이 실제로 SELECT * FROM 'mytable'을 잘못된 SQL 인 데이터베이스로 전송하게됩니다.

    최선의 방법은

    SELECT * FROM {$mytable}
    

    하지만 $ mytable이 사용자 입력에서 오는 경우 먼저 확인하는 테이블의 화이트리스트가 있어야합니다.

  2. ==============================

    2.

    결국 나는 완벽한 대답을 얻는다. prepare 문에서 테이블 이름을 동적으로 작성하는 방법. 모든 속임수는 '{}'로 발생합니다. 이 '{}'내부 변수를 사용해야합니다. 그것은 내 코드에서 일하고있다.

    $tablename = "run_time_variable";     
    $stmt = $conn->prepare("INSERT INTO `{$tablename}` (name, address, phone ) VALUES (?,?,?)");
    $stmt->bind_param("sss", $name, $address, $phone );
    $stmt->execute();
    
  3. from https://stackoverflow.com/questions/11312737/can-i-parameterize-the-table-name-in-a-prepared-statement by cc-by-sa and MIT lisence