2016-03-21 2 views
0

Ich versuche zu versuchen/fangen Sie eine PDO :: Abfrage, um sicherzustellen, ob eine Tabelle existiert oder nicht. Aber statt den Fehler zu fangen und zurückkehr wahr oder falsch ist nur eine nicht erfasste Fehler zu werfen:PDO nicht abfangen Fehler, wenn ich eine Tabelle auswähle, die nicht existiert

public function __construct(){ 
    $this->db = parent::connect(); 
} 

public function table_exists($table){ 
     try { 
      $this->query("SELECT 1 FROM `$table` LIMIT 1"); 
      return true; 
     } catch (Exception $e) { 
      return false; 
     } 
    } 

    public function query($sql){ 
     try { 
      $this->result = $this->db->query($sql); 
      return $this; 
     } catch (Exception $e) { 
      return null; 
     } 
    } 

Ich habe auch versucht, diese $this->db->setAttribute(\PDO::ATTR_ERRMODE, \PDO::ERRMODE_EXCEPTION); innerhalb des try ist, aber es hat keinen Unterschied machen. So bekomme ich

Fatal error: Uncaught exception 'PDOException' with message 'SQLSTATE[42S02]: Base table or view not found: 1146 Table 'refritec.user' doesn't exist' in ...\DatabaseDriverMysql.php:34 Stack trace: 0 ...\DatabaseDriverMysql.php(34): PDO->query('SELECT 1 FROM ...') 1 ...\DatabaseDriverMysql.php(25): Core\DatabaseDriver->query('SELECT 1 FROM `...') 2 ...\Pen.php(123): Core\DatabaseDriver->table_exists('user') #3 [internal function]: Core\Pen->update() #4 ...\index.php(97): call_user_func_array(Array, Array) #5 {main} thrown in ...\DatabaseDriverMysql.php on line 34

+0

Ist der obige Code in einer Datei mit Namespaced? – stratedge

+2

Versuchen Sie mit '\ Exception' anstelle von' Exception'. Oder, da Sie PDO verwenden, verwenden Sie '\ PDOException'. –

+0

^^^ das ist, was ich bei – stratedge

Antwort

-1

Ich bin nicht in der Lage Ihre genaue Problem neu zu erstellen, aber haben Sie versucht, den Fang PDOException wie:

try { 
    $this->query("SELECT 1 FROM `$table` LIMIT 1"); 
    return true; 
} catch (PDOException $e) { 
    return false; 
} 

Herausgegeben

Sie auch benutzen müssen $this->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); auf deine Verbindung weil PDO standardmäßig keine Ausnahmen wie gesehen here.

+0

habe ich nicht, mein Freund, aber es funktioniert immer noch nicht. Meine Version von PHP erlaubte mir nicht, Return in 'Die' zu ​​verwenden. ohne die 'return', nur' false', gibt es mir den gleichen Fehler –

+1

'PDOException' erweitert' Exception'. Dies sollte keinen Unterschied machen. Antworten sollten auch die Frage beantworten, nicht raten, was sie sein könnte. Wenn Sie weitere Informationen benötigen oder sich nicht sicher sind, schreiben Sie stattdessen einen Kommentar. –

+0

Ich habe meine Antwort bearbeitet. Probieren Sie das 'setAttribute' aus, dann sollten Sie die Ausnahme abfangen können. – wayneOS

2

Abgesehen von diesem albernen Tippfehler in Kommentaren erklärt, ist Ihr Ansatz im Wesentlichen falsch.

Zuerst überprüfen Sie nicht die bestimmte Ausnahme. Bedeutet, dass es im Fall von irgendeinen Fehler falsch gibt, nicht nur nicht vorhandene Tabelle.

Zweitens ist Ihr Code anfällig für SQL-Injektion.

Drittens schreiben Sie einen Code, der einen absichtlichen Fehler verursacht. Das ist wieder falsch. Solange es gibt Mittel, um die Tabelle Existenz der regelmäßige Weise, können Sie es verwenden, um zu überprüfen:

$stmt = $pdo->prepare("SHOW TABLES LIKE ?"); 
$stmt->execute([$table]); 
return $stmt->fetchColumn(); 

Viertens eine solche Funktion selbst entsteht der Verdacht für die Datenbank-Design. In einer vernünftig entworfenen Anwendung müssen Tabellen nicht dynamisch erstellt werden.

Verwandte Themen