2012-11-23 57 views
0

我使用PDO连接到sqlite3,但由于某些原因,我无法使外键正常工作。根据文档,这个“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()); 

这reutrns阵列(2){[0] => INT(1)[ “foreign_keys”] => INT(1)}

根据SQLite3 :: version(),我有sqlite版本3.7.7.1。我的PHP版本是5.3.18,在Windows上运行。

请帮助我使用PDO运行它。谢谢!

回答

6

我不知道PRAGMA short_column_names=1;应与PDO一起发布,以便外键约束与SQLite一起使用。您然而问题PRAGMA foreign_keys = ON;与PDO以及。

试试这个:

<?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')即使在成功时也会始终返回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的实际价值? –