it-source

PHP '테이블 만들기' 테이블 이름에 따옴표가 포함되어 있습니다.

criticalcode 2023. 2. 2. 21:08
반응형

PHP '테이블 만들기' 테이블 이름에 따옴표가 포함되어 있습니다.

테이블을 생성하면 데이터베이스의 테이블 이름에 백 체크 표시가 추가되는 이상한 문제가 있습니다.

public function create_table($name)
{
    $sql = "
        CREATE TABLE IF NOT EXISTS `?` (
          id int(11) NOT NULL AUTO_INCREMENT,
          url varchar(255) NOT NULL,
          resolved tinyint(1) NOT NULL,
          PRIMARY KEY (id)
        )";

    $query = $this->_pdo->prepare($sql);


    $query->bindValue(1, $name);

    if($query->execute())
    {
        print("Created");
    }
    else
    {
        var_dump($query->errorInfo());
    }   
}

내가 그렇게 하고 있는 이유는$name일반적인 파일이나 디렉토리명을 검색하기 위해서, Web 크롤러에 의해서 동적으로 행해집니다.또, 수집 가능한 패스의 양이 많기 때문에, 각 사이트의 테이블과 그 호스트명으로부터 생성된 이름을 결정했습니다(예:https://whe.re/)).

하지만 이것은 이 일로 이어졌다.

여기에 이미지 설명 입력

그래서 없이 시도했는데 오류가 발생하더라고요.

SQL 구문에 오류가 있습니다. "random_site" 근처에서 사용할 올바른 구문은 MariaDB 서버 버전에 해당하는 매뉴얼을 참조하십시오.

내가 무엇을 보고 있지 않거나 생각하고 있지 않은가?PHP를 사용한지 꽤 오래되었고, 모든 검색에서 왜 테이블 이름을 백 체크 표시로 둘러싸야 하는지 알 수 없기 때문에 나는 고민하고 있다.

감사해요.

정보: 마리아DB
PHP: 7.4.6

이는 가 문자열 값을 바인딩하고 있기 때문에 작은 따옴표로 둘러싸여 있기 때문입니다.단, 쿼리에서 테이블 이름을 매개 변수로 전달할 수는 없습니다.바인딩 메커니즘은 리터럴 값을 전달하도록 되어 있지만 테이블 이름은 전달되지 않습니다.

이 특정 상황에서는 문자열 연결 외에 다른 선택사항이 없습니다.

$sql = "
    CREATE TABLE IF NOT EXISTS `$name` (
      id int(11) NOT NULL AUTO_INCREMENT,
      url varchar(255) NOT NULL,
      resolved tinyint(1) NOT NULL,
      PRIMARY KEY (id)
    )";

$query = $this->_pdo->prepare($sql);
if ($query->execute()) { 
    ... 
} else {
    ... 
}

이는 변수를 쿼리에 전달하기 전에 응용 프로그램 측에서 철저히 검증해야 함을 의미하며, 이는 쉬운 작업이 아닙니다.

이 때문에, 왜 사이트 마다 다른 테이블을 가지고 있는지에 대한 의문이 생깁니다.기본적인 정규화 규칙을 위반하여 유지보수의 악몽이 될 수 있는 이 설계는 권장하지 않습니다.대신 사이트를 나열하는 참조 테이블과 사이트 테이블을 참조하는 외부 키 열이 포함된 모든 경로에 대한 단일 테이블을 사용해야 합니다.적절한 스키마 및 인덱싱을 사용하면 수백만 개의 행이 없는 한 성능 문제가 발생하지 않습니다(이 경우 논리 파티션 등 다른 옵션을 사용할 수 있습니다).

언급URL : https://stackoverflow.com/questions/62361984/php-create-table-is-including-quote-marks-in-the-table-name

반응형