2013-10-13 1 views
1

특정 오류 작동하지 :여러 인서트는 PHP의 PDO와 SQLite는 DB를 사용하여, SQLite는 3

Fatal error: Uncaught exception 'PDOException' with message 'SQLSTATE[HY000]: General error: 1 near ",": syntax error' in D:\Projects\2013\Stat collection plugin\stats\htdocs\index.php:8 Stack trace: #0 D:\Projects\2013\Stat collection plugin\stats\htdocs\index.php(8): PDO->exec('CREATE TABLE IF...') #1 {main} thrown in D:\Projects\2013\Stat collection plugin\stats\htdocs\index.php on line 8

코드를 :

$dbSchema = file_get_contents('../schema.sql'); 

$PDO = new PDO('sqlite:../stats.db'); 
$PDO->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); 
$PDO->exec($dbSchema); 

가 여기 내 스키마입니다. 내가 처음에 CREATE TABLE 문을 가지고있을 때 오류가있는 것 같지만 다음 문장에서 같은 오류가 발생했다면 알려 주시면 고맙겠습니다. 미리 감사드립니다!

CREATE TABLE IF NOT EXISTS game (
    id    INTEGER PRIMARY KEY AUTOINCREMENT, 
    serverName  STRING NOT NULL, 
    map    STRING NOT NULL, 
    winner   INTEGER NOT NULL, 
    gameMode  STRING NOT NULL, 
    controlPoints INTEGER, 
    setupGate  BOOLEAN, 
    capsRed   INTEGER, 
    capsBlue  INTEGER, 
    winsRed   INTEGER, 
    winsBlue  INTEGER, 
    CONSTRAINT game_winner_teamTypes_id FOREIGN KEY (winner) REFERENCES teamTypes(id) 
); 

CREATE TABLE IF NOT EXISTS player (
    id    INTEGER PRIMARY KEY AUTOINCREMENT, 
    gameId   INTEGER NOT NULL, 
    name   STRING NOT NULL, 
    team   INTEGER NOT NULL, 
    class   INTEGER NOT NULL, 
    queueJump  BOOLEAN NOT NULL, 
    CONSTRAINT player_gameId_game_id FOREIGN KEY (gameId) REFERENCES game(id), 
    CONSTRAINT player_team_teamTypes_id FOREIGN KEY (team) REFERENCES teamTypes(id), 
    CONSTRAINT player_class_classTypes_id FOREIGN KEY (class) REFERENCES classTypes(id) 
); 

CREATE TABLE IF NOT EXISTS stat (
    playerId  INTEGER NOT NULL, 
    type   INTEGER NOT NULL, 
    value   INTEGER NOT NULL, 
    CONSTRAINT stat_playerId_player_id FOREIGN KEY (playerId) REFERENCES player(id), 
    CONSTRAINT stat_type_statTypes_id FOREIGN KEY (type) REFERENCES statTypes(id) 
); 

CREATE TABLE IF NOT EXISTS teamTypes (
    id    INTEGER PRIMARY KEY AUTOINCREMENT, 
    name   STRING NOT NULL 
); 

INSERT OR IGNORE INTO teamTypes(id, name) VALUES (0, 'Red'), (1, 'Blue'), (2, 'Spectator'); 

CREATE TABLE IF NOT EXISTS classTypes (
    id    INTEGER PRIMARY KEY AUTOINCREMENT, 
    name   STRING NOT NULL 
); 

INSERT OR IGNORE INTO classTypes(id, name) VALUES (0, 'Runner'), (1, 'Rocketman'), (2, 'Rifleman'), (3, 'Detonator'), (4, 'Healer'), (5, 'Constructor'), (6, 'Overweight'), (7, 'Infiltrator'), (8, 'Firebug'), (9, 'Querly'); 

CREATE TABLE IF NOT EXISTS statTypes (
    id    INTEGER PRIMARY KEY AUTOINCREMENT, 
    name   STRING NOT NULL 
); 

INSERT OR IGNORE INTO statTypes(id, name) VALUES (0, 'Kills'), (1, 'Deaths'), (2, 'Caps'), (3, 'Assists'), (4, 'Destruction'), (5, 'Stabs'), (6, 'Healing'), (7, 'Defenses'), (8, 'Invulns'), (9, 'Bonus'), (10, 'Dominations'), (11, 'Revenge'), (12, 'Points'); 
+0

나를 위해 완벽하게 작동합니다. http://sqlfiddle.com/#!5/fe303 – fancyPants

+0

흠 ... 아마 PHP와 PDO를 사용하여 저와 관련이 있습니까? '치명적 오류 : D : \ Projects \ 2013 \ Stat 콜렉션 플러그인 \ 통계 \ htdocs \ index.php에'SQLSTATE [HY000] : 일반 오류 : 1 근처에 ":"구문 오류 "메시지가있는 'PDOException'오류가 발생했습니다. : 8 스택 추적 : # 0 D : \ Projects \ 2013 \ Stat 컬렉션 플러그인 \ stats \ htdocs \ index.php (8) : PDO-> exec ('CREATE TABLE IF ...') # 1 {main} throw D : \ Projects \ 2013 \ Stat 컬렉션 플러그인 \ stats \ htdocs \ index.php on line 8' – Andrea

+0

이것을 반영하기 위해 편집 된 질문입니다. – Andrea

답변

3

여러 VALU 그룹 (VALUES (1,2,3), (4,5,6))이있는 것이 문제였습니다. 여러 행을 가능하게

이 기능은 하나 개의 문장 (INSERT INTO foobar VALUES (1,2), (3,4);) 대신 INSERT INTO foobar VALUES (1,2); INSERT INTO foobar VALUES (3,4); 삽입 할 SQLite는 3.7.11에서 추가되었다 :

2012-03-20 (3.7.11)

Enhance the INSERT syntax to allow multiple rows to be inserted via the VALUES clause. 

http://www.sqlite.org/changes.html#version_3_7_11

하지만, 내 SQLite는 버전이 이전 버전입니다. 내 phpinfo() 출력에 따르면 :

pdo_sqlite 

PDO Driver for SQLite 3.x => enabled 
SQLite Library => 3.7.7.1 

따라서 나는 그것을 사용할 수 없습니다. 문제가 해결 된

CREATE TABLE IF NOT EXISTS teamTypes (
    id    INTEGER PRIMARY KEY AUTOINCREMENT, 
    name   STRING NOT NULL 
); 

INSERT OR IGNORE INTO teamTypes(id, name) VALUES (0, 'Red'); 
INSERT OR IGNORE INTO teamTypes(id, name) VALUES (1, 'Blue'); 
INSERT OR IGNORE INTO teamTypes(id, name) VALUES (2, 'Spectator'); 

CREATE TABLE IF NOT EXISTS classTypes (
    id    INTEGER PRIMARY KEY AUTOINCREMENT, 
    name   STRING NOT NULL 
); 

INSERT OR IGNORE INTO classTypes(id, name) VALUES (0, 'Runner'); 
INSERT OR IGNORE INTO classTypes(id, name) VALUES (1, 'Rocketman'); 
INSERT OR IGNORE INTO classTypes(id, name) VALUES (2, 'Rifleman'); 
INSERT OR IGNORE INTO classTypes(id, name) VALUES (3, 'Detonator'); 
INSERT OR IGNORE INTO classTypes(id, name) VALUES (4, 'Healer'); 
INSERT OR IGNORE INTO classTypes(id, name) VALUES (5, 'Constructor'); 
INSERT OR IGNORE INTO classTypes(id, name) VALUES (6, 'Overweight'); 
INSERT OR IGNORE INTO classTypes(id, name) VALUES (7, 'Infiltrator'); 
INSERT OR IGNORE INTO classTypes(id, name) VALUES (8, 'Firebug'); 
INSERT OR IGNORE INTO classTypes(id, name) VALUES (9, 'Querly'); 

CREATE TABLE IF NOT EXISTS statTypes (
    id    INTEGER PRIMARY KEY AUTOINCREMENT, 
    name   STRING NOT NULL 
); 

INSERT OR IGNORE INTO statTypes(id, name) VALUES (0, 'Kills'); 
INSERT OR IGNORE INTO statTypes(id, name) VALUES (1, 'Deaths'); 
INSERT OR IGNORE INTO statTypes(id, name) VALUES (2, 'Caps'); 
INSERT OR IGNORE INTO statTypes(id, name) VALUES (3, 'Assists'); 
INSERT OR IGNORE INTO statTypes(id, name) VALUES (4, 'Destruction'); 
INSERT OR IGNORE INTO statTypes(id, name) VALUES (5, 'Stabs'); 
INSERT OR IGNORE INTO statTypes(id, name) VALUES (6, 'Healing'); 
INSERT OR IGNORE INTO statTypes(id, name) VALUES (7, 'Defenses'); 
INSERT OR IGNORE INTO statTypes(id, name) VALUES (8, 'Invulns'); 
INSERT OR IGNORE INTO statTypes(id, name) VALUES (9, 'Bonus'); 
INSERT OR IGNORE INTO statTypes(id, name) VALUES (10, 'Dominations'); 
INSERT OR IGNORE INTO statTypes(id, name) VALUES (11, 'Revenge'); 
INSERT OR IGNORE INTO statTypes(id, name) VALUES (12, 'Points'); 

나는이 마지막 부분을 변경

, 이것에

CREATE TABLE IF NOT EXISTS teamTypes (
    id    INTEGER PRIMARY KEY AUTOINCREMENT, 
    name   STRING NOT NULL 
); 

INSERT OR IGNORE INTO teamTypes(id, name) VALUES (0, 'Red'), (1, 'Blue'), (2, 'Spectator'); 

CREATE TABLE IF NOT EXISTS classTypes (
    id    INTEGER PRIMARY KEY AUTOINCREMENT, 
    name   STRING NOT NULL 
); 

INSERT OR IGNORE INTO classTypes(id, name) VALUES (0, 'Runner'), (1, 'Rocketman'), (2, 'Rifleman'), (3, 'Detonator'), (4, 'Healer'), (5, 'Constructor'), (6, 'Overweight'), (7, 'Infiltrator'), (8, 'Firebug'), (9, 'Querly'); 

CREATE TABLE IF NOT EXISTS statTypes (
    id    INTEGER PRIMARY KEY AUTOINCREMENT, 
    name   STRING NOT NULL 
); 

INSERT OR IGNORE INTO statTypes(id, name) VALUES (0, 'Kills'), (1, 'Deaths'), (2, 'Caps'), (3, 'Assists'), (4, 'Destruction'), (5, 'Stabs'), (6, 'Healing'), (7, 'Defenses'), (8, 'Invulns'), (9, 'Bonus'), (10, 'Dominations'), (11, 'Revenge'), (12, 'Points'); 

.

+0

방금 ​​위의 내용을 편집했습니다. 나는 옛날 버전을 가졌다. – Andrea

+2

아주 좋은 작품. 명성. 네가 날 때리는 문제를 확인하고 있었어. 그리고 당신에게 감사드립니다. 그것은 .sql 파일을 직접 읽는 것을 지원합니다. –