2012-11-23 2 views
0

sqlite3에 연결하는 데 PDO를 사용하지만 외래 키가 작동하지 않습니다. 워드 프로세서에 따르면이 "PRAGMA short_column_names = 1"이이를 사용 가능하게 설정해야합니다. 나는 이렇게한다 :PDO의 sqlite3 외래 키

$con = new PDO('sqlite:z:/testing.db'); 
$res = $con->exec('PRAGMA foreign_keys=ON'); 
var_dump($res);die(); 

나는 0을 반환한다. 외래 키가있는 실제 테이블을 만들려고했으나 제대로 작동하지 않았다. sqlite3를 클래스 직접 요청 비록 일 :

$con = new SQLite3('z:/testing.db'); 
$con->exec('PRAGMA foreign_keys = ON;'); 
var_dump($con->query('PRAGMA foreign_keys;')->fetchArray()); 

이 어레이 (2) {[0] => INT (1) "foreign_keys"] => INT (1)}

가 따르면 reutrns SQLite3 :: version(), 나는 sqlite 버전 3.7.7.1있다. 내 PHP 버전은 5.3.18이고 Windows에서 실행됩니다.

PDO를 실행하는 데 도움주세요. 감사!

답변

6

외래 키 제약 조건이 SQLite와 함께 작동하려면 PRAGMA short_column_names=1;이 PDO와 함께 발행되어야한다는 생각을 모르겠습니다. 이어야하지만 PDO와 함께 PRAGMA foreign_keys = ON;을 발행하십시오.

<?php 

// SQL for creating database structure 
$databaseSql = <<<SQL 
    CREATE TABLE `user` (
     `id` INTEGER PRIMARY KEY AUTOINCREMENT, 
     `name` TEXT NOT NULL, 
     UNIQUE(`name`) 
    ); 

    CREATE TABLE `userProfile` (
     `userId` INTEGER NOT NULL CONSTRAINT `userProfile_userId` REFERENCES `user`(`id`) ON UPDATE CASCADE ON DELETE CASCADE, 
     `image` TEXT NOT NULL 
    ); 
SQL; 

// SQL for inserting dummy data 
$dataSql = <<<SQL 
    INSERT INTO `user` VALUES(1, "John"); 
    INSERT INTO `user` VALUES(2, "Mary"); 
    INSERT INTO `user` VALUES(3, "Joe"); 
    INSERT INTO `userProfile` VALUES(1, "/images/john.jpg"); 
    INSERT INTO `userProfile` VALUES(2, "/images/mary.jpg"); 
    INSERT INTO `userProfile` VALUES(3, "/images/joe.jpg"); 
SQL; 

// create a temporary SQLite instance in memory 
$db = new PDO('sqlite::memory:', null, null, array(
    PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION, 
    PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC, 
    PDO::ATTR_EMULATE_PREPARES => false 
)); 

// activate use of foreign key constraints 
$db->exec('PRAGMA foreign_keys = ON;'); 

// create database 
$db->exec($databaseSql); 
// insert dummy data 
$db->exec($dataSql); 

// should dump 3 records 
var_dump($db->query('SELECT * FROM `userProfile`;')->fetchAll()); 

// delete 1 user, cascade deleting 1 userProfile as well 
$db->exec('DELETE FROM `user` WHERE `id` = 1;'); 

// should dump 2 records 
var_dump($db->query('SELECT * FROM `userProfile`;')->fetchAll()); 

그것은 다음과 같은 결과한다 :

이 사용 해보세요

array(3) { 
    [0]=> 
    array(2) { 
    ["userId"]=> 
    string(1) "1" 
    ["image"]=> 
    string(16) "/images/john.jpg" 
    } 
    [1]=> 
    array(2) { 
    ["userId"]=> 
    string(1) "2" 
    ["image"]=> 
    string(16) "/images/mary.jpg" 
    } 
    [2]=> 
    array(2) { 
    ["userId"]=> 
    string(1) "3" 
    ["image"]=> 
    string(15) "/images/joe.jpg" 
    } 
} 
array(2) { 
    [0]=> 
    array(2) { 
    ["userId"]=> 
    string(1) "2" 
    ["image"]=> 
    string(16) "/images/mary.jpg" 
    } 
    [1]=> 
    array(2) { 
    ["userId"]=> 
    string(1) "3" 
    ["image"]=> 
    string(15) "/images/joe.jpg" 
    } 
} 
+0

덕분에 많이 자세한 예를 들어! 당신 말이 맞아요, PRAGMA foreign_keys = ON을 사용했습니다. 질문에 잘못 쓰셨습니다. 귀하의 예제는 잘 작동, 나는 더 깊이 파고, 아마도 내 애플 리케이션과 다른 문제가 있습니다. $ con-> exec ('PRAGMA foreign_keys = ON')는 성공하더라도 PDO에 항상 0을 반환합니다. 이것은 혼란이었습니다. –

+0

@PavelDubinin'PDO :: exec()'가'0'을 반환한다는 것은 [영향받는 행의 수를 반환하기 때문에] (http://php.net/manual/en/pdo.exec.php#refsect1 -pdo.exec-returnvalues). 그리고'PRAGMA foreign_keys = ON'은 어떤 행에도 영향을 미치지 않습니다. 명령문에서 오류가 발생하면'false'가 반환됩니다. –

+0

오른쪽, 어떤 생각을 어떻게 foreign_keys의 실제 가치를 얻을? –