2015-09-16 24 views
9

Yinelenen bir değer eklendiğinde, bir istisna atamayan PDO ile ilgili garip bir sorunum var. Bu durumda bir hata bekliyordum.PHP PDO, yinelenen anahtar ekine istisna atar

ilgili kod: SQL veri ile

try 
{ 
    $db_conn = new PDO("mysql:host=".$config["database"]["hostname"].";charset=utf8", $config["database"]["username"], $config["database"]["password"], []); 
    $db_conn->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); 
    $db_conn->exec(file_get_contents("some_file_with_data.sql"); 
} 
catch(Exception $e) 
{ 
    // PDOException extends RuntimeException extends Exception so exceptions should be catched here 
    // however for the duplicate key entry it will not throw an exception 
} 

dosya şu şekilde, çok sayıda ekleme içerir: Tablodaki a yılında

INSERT INTO `a` (`b`, `c`) VALUES 
    (1, 1), 
    (2, 2), 
    (3, 2); 

INSERT INTO `a` (`b`, `c`) VALUES 
    (1, 1); 

alan b birincil anahtar olmak için ayarlanır. Aynı veriyi tam olarak aynı yapıya phpMyAdmin kullanarak eklediğimde şu hatayı alıyorum: #1062 - Duplicate entry '65533' for key 'PRIMARY'

Bu durumda PDO neden bir hata atmıyor? Hata modunu istisna olarak ayarladığımda bile mi?

Düzenleme

: Bu Bu genellikle PDO ile hata olarak rapor edilmiştir bu özel tablonun

CREATE TABLE IF NOT EXISTS `a` (
    `b` smallint(5) unsigned NOT NULL, 
    `c` smallint(5) unsigned NOT NULL, 
    PRIMARY KEY (`b`) 
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci; 
+0

http://stackoverflow.com/questions/11102644/pdo-exception-questions-how-to-catch-them –

+0

: satır kümeleri (hata raporları yorumlardan alınmıştır) birer-birini işlemek için Bunu bir try/catch bloğunda zaten var, bunu açıklığa kavuşturmak için kodumu güncellememe izin verin. – Matthijs

+0

Tablodaki tam kısıtlama nedir? – deceze

cevap

8

için kullanılan tablo yapısı şöyledir: Sadece bir istisna durumu https://bugs.php.net/bug.php?id=61613

İLK eğer Bildirim geçersiz. İlk açıklamada pürüzsüz çalışıyorsa, herhangi bir hata almazsınız - Ve ilk deyimi geçerlidir:

INSERT INTO `a` (`b`, `c`) VALUES 
    (1, 1), 
    (2, 2), 
    (3, 2); 

geçici bir çözüm olarak - veya Kişisel Sağduyuya bunu yapmanın doğru yolu göre - İhtiyacınız

$pdo->beginTransaction(); 
try { 
    $statement = $pdo->prepare($sql); 
    $statement->execute(); 
    while ($statement->nextRowset()) {/* https://bugs.php.net/bug.php?id=61613 */}; 
    $pdo->commit(); 
} catch (\PDOException $e) { 
    $pdo->rollBack(); 
    throw $e; 
} 
+1

Çok teşekkür ederim! Tamamen kodumun% 100 doğru olduğundan emin değildim, ancak bu hata raporunu hiç bulamadım ("Bir grubun ilk SQL deyimi geçerli değilse," Hiçbir PDO hatası aramadı "yinelenen bir girişte bir istisna almazsınız: P) – Matthijs