Contao-Camp 2024
Ergebnis 1 bis 10 von 10

Thema: Fehler abfangen in Datenbank-Abfrage

  1. #1
    Contao-Urgestein Avatar von Samson1964
    Registriert seit
    05.11.2012.
    Ort
    Berlin
    Beiträge
    2.792

    Frage Fehler abfangen in Datenbank-Abfrage

    Folgender PHP-Code funktioniert nicht wie gewünscht:
    PHP-Code:
    $objDSOL $objDSOLDB->prepare("SELECT * FROM content")
                         ->
    execute();
    if(
    $objDSOL)
    {
        echo 
    '<b>'.$objDSOL->numRows ' Nachrichten';
    }
    else
    {
        echo 
    "Tabelle nicht vorhanden";

    Die echos werden leider nicht ausgegeben, weil die Datenbankklasse vorher die Verarbeitung abbricht:
    request.CRITICAL: Uncaught PHP Exception Doctrine\DBAL\Exception\TableNotFoundException: "An exception occurred while executing 'SELECT * FROM content': SQLSTATE[42S02]: Base table or view not found: 1146 Table 'db.content' doesn't exist"
    Fehler 1146 ist also "Tabelle existiert nicht". In diesem Fall will ich die Tabelle automatisch anlegen. Soweit komme ich aber nicht. Gibt es hier eine Lösung?

    Ich habe auch schon mit try und catch versucht. In dem Fall arbeitet das Skript weiter und ich bekomme ein großes Exception-Objekt. An der Stelle müßte ich den Fehlercode (1146) ermitteln (welche Funktion?), dann die Tabelle anlegen und dann weitermachen mit dem Code (also zurück zur Zeile nach der Abfrage). Aber auch hier komme ich nicht weiter.
    Viele Grüße
    Frank

    Seit Mai 2013 Fan von Contao
    Webmaster vom Deutschen Schachbund und Berliner Schachverband
    Mein Blog: Schachbulle
    Meine Erweiterungen bei GitHub
    Meine Videos auf YouTube: Playlist zur Contao-Programmierung/Einrichtung

  2. #2
    Contao-Urgestein Avatar von fiedsch
    Registriert seit
    09.07.2009.
    Ort
    München
    Beiträge
    2.935

    Standard

    PHP-Code:
    try {
      
    // ...
    } catch (TableNotFoundException $e) {
      
    // Tabelle existiert nicht, dann hier anlegen!

    Edit:

    In dem Fall arbeitet das Skript weiter
    Du könntest im catch das Skript auch beenden (oder anders weiter machen lassen), falls das nötig ist.
    Contao-Community-Treff Bayern: http://www.contao-bayern.de

  3. #3
    Alter Contao-Hase
    Registriert seit
    18.07.2012.
    Ort
    Löbau
    Beiträge
    1.137

    Standard

    Wenn es Contao ist müsste es auch "tl_content" heißen und nicht "content"

    Es sei denn es ist jetzt nur ein Beispiel für ne Abfrage


    Ach vergiss das obere, hab den zweiten Teil nicht gelesen

    dann die Tabelle anlegen und dann weitermachen mit dem Code (also zurück zur Zeile nach der Abfrage). Aber auch hier komme ich nicht weiter.
    prüfe doch erst ob die tabelle existiert oder nicht, dann je nach ergebnis anlegen und dann den coode und abfragen
    Geändert von WebRoxx (06.01.2022 um 11:21 Uhr)
    Liebe Grüße
    WebRoxx


  4. #4
    Community-Moderator
    Wandelndes Contao-Lexikon
    Avatar von Spooky
    Registriert seit
    12.04.2012.
    Ort
    Scotland
    Beiträge
    33.897
    Partner-ID
    10107

    Standard

    Zitat Zitat von fiedsch Beitrag anzeigen
    PHP-Code:
    try {
      
    // ...
    } catch (TableNotFoundException $e) {
      
    // Tabelle existiert nicht, dann hier anlegen!

    Edit:


    Du könntest im catch das Skript auch beenden (oder anders weiter machen lassen), falls das nötig ist.
    use statement nicht vergessen
    Geändert von Spooky (06.01.2022 um 12:11 Uhr)
    » sponsor me via GitHub or PayPal or Revolut

  5. #5
    Contao-Urgestein Avatar von Samson1964
    Registriert seit
    05.11.2012.
    Ort
    Berlin
    Beiträge
    2.792

    Standard

    PHP-Code:
    catch(TableNotFoundException $ex)
    {
        
    print_r($ex);

    wird nicht ausgeführt
    PHP-Code:
    catch(Exception $ex)
    {
        
    print_r($ex);

    wird ausgeführt:
    Code:
    Doctrine\DBAL\Exception\TableNotFoundException Object ( [driverExce ....
    Viele Grüße
    Frank

    Seit Mai 2013 Fan von Contao
    Webmaster vom Deutschen Schachbund und Berliner Schachverband
    Mein Blog: Schachbulle
    Meine Erweiterungen bei GitHub
    Meine Videos auf YouTube: Playlist zur Contao-Programmierung/Einrichtung

  6. #6
    Community-Moderator
    Wandelndes Contao-Lexikon
    Avatar von Spooky
    Registriert seit
    12.04.2012.
    Ort
    Scotland
    Beiträge
    33.897
    Partner-ID
    10107

    Standard

    Poste den gesamten Code.
    » sponsor me via GitHub or PayPal or Revolut

  7. #7
    Contao-Urgestein Avatar von Samson1964
    Registriert seit
    05.11.2012.
    Ort
    Berlin
    Beiträge
    2.792

    Standard

    PHP-Code:
    <?php

    // Contao einbinden
    define('TL_MODE''FE');
    define('TL_SCRIPT''bundles/contaodsolnews/Synchronisation.php');
    require(
    $_SERVER['DOCUMENT_ROOT'].'/../system/initialize.php');

    /**
     * Run in a custom namespace, so the class can be replaced
     */
    use Contao\Controller;

    /**
     * Klasse Synchronisation
     * ==================================================================================
     * Synchronisiert die Nachrichten der DSOL-Website mit dem lokalen Nachrichten-Archiv
     */
    class Synchronisation
    {
        public function 
    __construct()
        {
        }

        public function 
    run()
        {

            try
            {
                
    // Tabelle content der DSOL-Datenbank auslesen
                
    $objDSOLDB = \Database::getInstance(array
                (
                    
    'dbHost'     => $GLOBALS['TL_CONFIG']['dsolnews_host'],
                    
    'dbUser'     => $GLOBALS['TL_CONFIG']['dsolnews_user'],
                    
    'dbPass'     => $GLOBALS['TL_CONFIG']['dsolnews_pass'],
                    
    'dbDatabase' => $GLOBALS['TL_CONFIG']['dsolnews_db']
                ));

                
    // Nachrichten der DSOL-Website auslesen
                
    $objDSOL $objDSOLDB->prepare("SELECT * FROM dsb_content")
                                     ->
    execute();

                
    // Nachrichten aus dem lokalen Archiv auslesen
                
    $objNews = \Database::getInstance()->prepare("SELECT * FROM tl_news WHERE pid=?")
                                                   ->
    execute($GLOBALS['TL_CONFIG']['dsolnews_archiv']);
                echo 
    '<b>'.$objNews->numRows ' Nachrichten</b> im lokalen Archiv<br><br>';

                
    $param = \Input::get('info');

                
    // Neue Nachrichten vom lokalen Archiv zur DSOL-Website hinzufügen (kein Update!)
                
    if(in_array('copy-new-to-extern'$param))
                {
                    echo 
    'Suche nach neuen Nachrichten in lokalem Archiv...<br>';
                    
    $exportiert 0;
                    if(
    $objNews->numRows)
                    {
                        while(
    $objNews->next())
                        {
                            
    // Nachricht im entfernten Archiv vorhanden?
                            
    $objRecord $objDSOLDB->prepare("SELECT * FROM content WHERE Content_Saison=? AND Content_Nr=? AND Content_Bereich=?")
                                                   ->
    limit(1)
                                                   ->
    execute($objNews->dsol_saison$objNews->dsol_nummer'index');
                            if(
    $objRecord->numRows == 0)
                            {
                                
    // Nachricht nicht vorhanden, Export starten
                                
    $exportiert++;
                                
    $set = array
                                (
                                    
    'Content_Saison'  => $objNews->dsol_saison,
                                    
    'Content_Bereich' => 'index',
                                    
    'Content_Nr'      => $objNews->dsol_nummer,
                                    
    'Content_Text'    => $objNews->teaser,
                                    
    'Content_Status'  => $objNews->published 'aktiv' 'inaktiv',
                                );
                                
    $objInsert $objDSOLDB->prepare("INSERT INTO content %s")
                                                       ->
    set($set)
                                                       ->
    execute();
                            }
                        }
                    }
                    echo 
    '... <b>'.$exportiert.'</b> neue Nachrichten nach DSOL-Website exportiert<br>';
                }

                
    // Geänderte Nachrichten vom lokalen Archiv auf der DSOL-Website aktualisieren (Update!)
                
    if(in_array('update-to-extern'$param))
                {
                    echo 
    'Suche nach geänderten Nachrichten in lokalem Archiv...<br>';
                    
    $exportiert 0;
                    if(
    $objNews->numRows)
                    {
                        while(
    $objNews->next())
                        {
                            
    // Nachricht im entfernten Archiv vorhanden?
                            
    $objRecord $objDSOLDB->prepare("SELECT * FROM content WHERE Content_Saison=? AND Content_Nr=? AND Content_Bereich=?")
                                                   ->
    limit(1)
                                                   ->
    execute($objNews->dsol_saison$objNews->dsol_nummer'index');
                            if(
    $objRecord->numRows == 1)
                            {
                                
    // Nachricht vorhanden, Update starten
                                
    $ungleich $objRecord->Content_Text != $objNews->teaser true false;
                                
    $publiziert $objRecord->Content_Status == 'aktiv' '1' '';
                                if(
    $ungleich || $publiziert != $objNews->published)
                                {
                                    
    $exportiert++;
                                    
    $set = array
                                    (
                                        
    'Content_Text'    => $objNews->teaser,
                                        
    'Content_Status'  => $objNews->published 'aktiv' 'inaktiv',
                                    );
                                    
    $objInsert $objDSOLDB->prepare("UPDATE content %s WHERE Content_Saison=? AND Content_Bereich=? AND Content_Bereich=?")
                                                           ->
    set($set)
                                                           ->
    execute($objNews->dsol_saison$objNews->dsol_nummer'index');
                                }
                            }
                        }
                    }
                    echo 
    '... <b>'.$exportiert.'</b> vorhandene Nachrichten auf DSOL-Website aktualisiert<br>';
                }

                
    // Neue Nachrichten von DSOL-Website zum lokalen Archiv hinzufügen (kein Update!)
                
    if(in_array('copy-new-to-intern'$param))
                {
                    echo 
    'Suche nach neuen Nachrichten auf DSOL-Website...<br>';
                    
    $importiert 0;
                    if(
    $objDSOL->numRows)
                    {
                        while(
    $objDSOL->next())
                        {
                            
    // Nachricht im lokalen Archiv vorhanden?
                            
    $objRecord = \Database::getInstance()->prepare("SELECT * FROM tl_news WHERE pid=? AND dsol_saison=? AND dsol_nummer=?")
                                                                 ->
    limit(1)
                                                                 ->
    execute($GLOBALS['TL_CONFIG']['dsolnews_archiv'], $objDSOL->Content_Saison$objDSOL->Content_Nr);
                            if(
    $objRecord->numRows == 0)
                            {
                                
    // Nachricht nicht vorhanden, Import starten
                                
    $importiert++;
                                
    $set = array
                                (
                                    
    'pid'         => $GLOBALS['TL_CONFIG']['dsolnews_archiv'],
                                    
    'tstamp'      => mktime(00011$objDSOL->Content_Saison),
                                    
    'headline'    => 'Nachricht Saison '.$objDSOL->Content_Saison.' Nr. '.$objDSOL->Content_Nr,
                                    
    'date'        => mktime(00011$objDSOL->Content_Saison),
                                    
    'time'        => mktime(00011$objDSOL->Content_Saison),
                                    
    'teaser'      => $objDSOL->Content_Text,
                                    
    'source'      => 'default',
                                    
    'published'   => $objDSOL->Content_Status == 'aktiv' '1' '',
                                    
    'dsol_saison' => $objDSOL->Content_Saison,
                                    
    'dsol_nummer' => $objDSOL->Content_Nr,
                                );
                                
    $objInsert = \Database::getInstance()->prepare("INSERT INTO tl_news %s")
                                                                     ->
    set($set)
                                                                     ->
    execute();
                            }
                        }
                    }
                    echo 
    '... <b>'.$importiert.'</b> Nachrichten importiert<br>';
                }

                
    // Geänderte Nachrichten von DSOL-Website zum lokalen Archiv übertragen (Update!)
                
    if(in_array('update-to-intern'$param))
                {
                    echo 
    'Suche nach geänderten Nachrichten auf DSOL-Website...<br>';
                    
    $importiert 0;
                    if(
    $objDSOL->numRows)
                    {
                        while(
    $objDSOL->next())
                        {
                            
    // Nachricht im lokalen Archiv vorhanden?
                            
    $objRecord = \Database::getInstance()->prepare("SELECT * FROM tl_news WHERE pid=? AND dsol_saison=? AND dsol_nummer=?")
                                                                 ->
    limit(1)
                                                                 ->
    execute($GLOBALS['TL_CONFIG']['dsolnews_archiv'], $objDSOL->Content_Saison$objDSOL->Content_Nr);
                            if(
    $objRecord->numRows == 1)
                            {
                                
    // Nachricht vorhanden
                                
    $ungleich $objDSOL->Content_Text != $objRecord->teaser true false;
                                
    $publiziert $objDSOL->Content_Status == 'aktiv' '1' '';
                                if(
    $ungleich || $publiziert != $objRecord->published)
                                {
                                    
    $importiert++;
                                    
    $set = array
                                    (
                                        
    'teaser'      => $objDSOL->Content_Text,
                                        
    'published'   => $objDSOL->Content_Status == 'aktiv' '1' '',
                                    );
                                    
    $objInsert = \Database::getInstance()->prepare("UPDATE INTO tl_news %s WHERE id=?")
                                                                         ->
    set($set)
                                                                         ->
    execute($objRecord->id);
                                }
                            }
                        }
                    }
                    echo 
    '... <b>'.$importiert.'</b> vorhandene Nachrichten aktualisiert<br>';
                }

                echo 
    '<br>Fertig';
            }


            catch(\
    TableNotFoundException $ex)
            {
                
    print_r($ex);
                
    // Tabelle dsb_content existiert nicht, jetzt anlegen
                
    echo "Tabelle dsb_content nicht gefunden<br>";
                
    //$spl = "
                //CREATE TABLE `dsb_content` (
                //  `id` int(10) unsigned NOT NULL AUTO_INCREMENT,
                //  `tstamp` int(10) unsigned NOT NULL DEFAULT 0,
                //  `headline` varchar(255) COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT '',
                //  `date` int(10) unsigned NOT NULL DEFAULT 0,
                //  `time` int(11) NOT NULL DEFAULT 0,
                //  `subheadline` varchar(255) COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT '',
                //  `teaser` text COLLATE utf8mb4_unicode_ci DEFAULT NULL,
                //  `author` varchar(255) COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT '',
                //  `addImage` char(1) COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT '',
                //  `singleSRC` binary(16) DEFAULT NULL,
                //  `alt` varchar(255) COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT '',
                //  `imageTitle` varchar(255) COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT '',
                //  `size` varchar(64) COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT '',
                //  `fullsize` char(1) COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT '',
                //  `caption` varchar(255) COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT '',
                //  `floating` varchar(12) COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT 'above',
                //  `published` char(1) COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT '',
                //  PRIMARY KEY (`id`),
                //) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci ROW_FORMAT=DYNAMIC;";
                //$objDSOL = $objDSOLDB->prepare($sql)
                //                     ->execute();
                
    echo "Tabelle wurde angelegt";
                return;
            }

            catch(\
    Exception $ex)
            {
                
    print_r($ex);
            }

        }

    }

    /**
     * Instantiate controller
     */
    $objClick = new Synchronisation();
    $objClick->run();
    dsb_content heißt die Tabelle die nicht vorhanden ist und angelegt werden muß, nach dem Auftreten des Fehlers.
    Viele Grüße
    Frank

    Seit Mai 2013 Fan von Contao
    Webmaster vom Deutschen Schachbund und Berliner Schachverband
    Mein Blog: Schachbulle
    Meine Erweiterungen bei GitHub
    Meine Videos auf YouTube: Playlist zur Contao-Programmierung/Einrichtung

  8. #8
    Community-Moderator
    Wandelndes Contao-Lexikon
    Avatar von Spooky
    Registriert seit
    12.04.2012.
    Ort
    Scotland
    Beiträge
    33.897
    Partner-ID
    10107

    Standard

    Du hast \TableNotFoundException benutzt. Der FQCN der Exception ist aber \Doctrine\DBAL\Exception\TableNotFoundException. Siehe die Original-Fehlermeldung, die du gepostet hast:

    Zitat Zitat von Samson1964 Beitrag anzeigen
    Die echos werden leider nicht ausgegeben, weil die Datenbankklasse vorher die Verarbeitung abbricht:
    request.CRITICAL: Uncaught PHP Exception Doctrine\DBAL\Exception\TableNotFoundException: "An exception occurred while executing 'SELECT * FROM content': SQLSTATE[42S02]: Base table or view not found: 1146 Table 'db.content' doesn't exist"
    Fehler 1146 ist also "Tabelle existiert nicht". In diesem Fall will ich die Tabelle automatisch anlegen. Soweit komme ich aber nicht. Gibt es hier eine Lösung?
    Du musst also
    PHP-Code:
    catch(\Doctrine\DBAL\Exception\TableNotFoundException $ex
    schreiben - oder
    PHP-Code:
    catch(TableNotFoundException $ex
    mit
    PHP-Code:
    use Doctrine\DBAL\Exception\TableNotFoundException
    am Anfang.
    » sponsor me via GitHub or PayPal or Revolut

  9. #9
    Contao-Urgestein Avatar von Samson1964
    Registriert seit
    05.11.2012.
    Ort
    Berlin
    Beiträge
    2.792

    Standard

    Dann lieber
    PHP-Code:
    catch(\Doctrine\DBAL\Exception\TableNotFoundException $ex
    Jetzt wird der Code dort auch ausgeführt. Danke!
    Viele Grüße
    Frank

    Seit Mai 2013 Fan von Contao
    Webmaster vom Deutschen Schachbund und Berliner Schachverband
    Mein Blog: Schachbulle
    Meine Erweiterungen bei GitHub
    Meine Videos auf YouTube: Playlist zur Contao-Programmierung/Einrichtung

  10. #10
    Contao-Urgestein Avatar von zonky
    Registriert seit
    19.03.2010.
    Ort
    Berlin, Rdf
    Beiträge
    9.682
    User beschenken
    Wunschliste

    Standard

    @Samson hast Du denn eine vernünftige IDE wie z.B. PHPStorm? wenn nicht, die 50 bzw. 80€/a sind gut investiert da dir viele Sachen schon vorgeschlagen werden...

Aktive Benutzer

Aktive Benutzer

Aktive Benutzer in diesem Thema: 1 (Registrierte Benutzer: 0, Gäste: 1)

Lesezeichen

Lesezeichen

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •