PDO не выбрасывает исключение - PullRequest
0 голосов
/ 22 мая 2018

Я знаю, что этот вопрос был там много раз, но у меня нет ответа.

Мой PDO просто не выдает никакой ошибки ... или что-то перехватывает ошибку передо мной.

Я довольно новичок в php, и мне неприятно не понимать простые вещи.

Вот мой код инициализации

$pdo = new PDO("mysql:host=" . $db['host'] . ";dbname=" . $db['dbname'], $db['user'], $db['pass']);
$pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
$pdo->setAttribute(PDO::ATTR_DEFAULT_FETCH_MODE, PDO::FETCH_ASSOC);
$pdo->setAttribute(PDO::ATTR_EMULATE_PREPARES, false);

и пример, где я, например, вставляюдублирующаяся строка с ограничением уникальности (но та же проблема для неизвестной строки или любого исключения pdo ...)

    $columnString = "....";
    $valueString = "....";
    $sql = "INSERT INTO " . $table . " (" . $columnString . ") VALUES (" . $valueString . ")";
    try {
        $stmt = $this->pdo->prepare($sql);          
        foreach($request_data as $key => $value){
            $stmt->bindValue(':' . $key,$request_data[$key]);
        }
        $stmt->execute();
    } catch (PDOException $e) {
        return null;
    }

Конечно, этот код хорошо работает, когда не возникает проблем с базой данных.

Я использую Slim 3 Framework и php7.Та же проблема с php5.

Это как-то связано с фреймворком?Есть ли другие конфигурации?Почему, черт возьми, исключения не кау?

1 Ответ

0 голосов
/ 23 мая 2018

Во-первых, я не вижу ни одного предложения use в вашем фрагменте кода при создании экземпляра класса PDO или при обнаружении исключения PDOException.Если вы пропустите их, это может привести к ошибке, так как PHP не может найти их местоположение.Необходимо убедиться, что вы добавляете

use PDO;
use PDOException;

в код, который ссылается на эти классы.

Во-вторых, вы подавляете все исключения, связанные с работой PDO, используя этот код.

try {
    //your code
} (PDOException $e) {
    return null;
}

Чтобы определить причину ошибки, связанной с базой данных, необходимо правильно обработать исключение.Вам нужно заменить return null;, чтобы сделать более значимое действие для обработки ошибки.

...