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
'it-source' 카테고리의 다른 글
빈 문자열의 "분할"이 비어 있지 않은 어레이를 반환하는 이유는 무엇입니까? (0) | 2023.02.02 |
---|---|
larabel 지원되는 암호화기를 찾을 수 없습니다.암호 및/또는 키 길이가 잘못되었습니다. (0) | 2023.02.02 |
일본어 텍스트를 두 번 클릭하면 Chrome에서 강조 표시할 항목을 어떻게 결정합니까? (0) | 2023.02.02 |
인터페이스 상수의 용도는 무엇입니까? (0) | 2023.01.23 |
카본 날짜 인스턴스 형식 지정 (0) | 2023.01.23 |