• Jeder User im Forum verpflichtet sich zur Akzeptanz und zur Einhaltung dieser Regeln:
    1. Umgangston
      Ein angemessener höflicher Umgangston, ohne Beleidigungen, Beschimpfungen und aggressive Postings ist für jedes Mitglied Pflicht.
    2. Beiträge
      Jedes Mitglied sollte sich bemühen nur sinnvolle Beiträge zum Thema zu posten. Dabei ist unbedingt vorher zu prüfen, ob das Thema vorher schon einmal diskutiert wurde und daher fortgesetzt werden kann
      • Suchfunktion benutzen!
      • offizielle Doku lesen!
    3. Haftung
      Jeder Beitragsersteller übernimmt die alleinige Verantwortung seiner Inhalte.
    4. Werbung
      Wir erlauben keine Beiträge, Signaturen, Private Nachrichten oder eMails an Benutzer, die Werbung enthalten. Ausgenommen
      sind Stellengesuche /-angebote, welche ausschließlich im Forum "Stellengesuche" veröffentlicht werden dürfen.
    5. Verstöße
      Regelwidrige Beiträge sollten dem Team gemeldet werden. Nach deren Überprüfung werden wir schnellstmöglich
      entsprechend handeln.
    6. Authorität
      Den Anweisungen der Team-Mitglieder (Administratoren und Moderatoren) sind in diesem Forum Folge zu leisten.
      Bei Fragen oder Beschwerden bitte an diese wenden.
    Wir möchten Euch darauf aufmerksam machen, dass es bei Verstößen gegen einen oder mehreren der oben genannten
    Punkte dem Team frei steht entsprechend zu handeln. Dies kann z.B. das Löschen eines Beitrags, das Ausschliessen bzw.
    Sperren von Mitgliedern oder aber lediglich eine Verwarnung sein.

    In diesem Zusammenhang sollte erwähnt werden, dass das Forum automatisch die IP-Adresse jedes Beitrag-Erstellers
    speichert. Bei schweren Vergehen, behalten wir es uns vor, die IP-Adresse zur Strafverfolgung weiterzugeben.
  • Willkommen im Zend Framework Forum

    ZF1 Zend Framework 1 + ZF2 Zend Framework 2

    Das Zend Framework Forum ist seit 2006 die erste Anlaufstelle für Zend Framework Entwickler in Deutschland. Mit über 70.000 Beiträgen und einer steigenden Nutzerzahl bietet das Forum hilfreiche Themen und ZF-Tutorials für professionelle Entwickler, fortgeschrittene Programmierer sowie Zend Framework Einsteiger.
    Wenn dies Dein erster Besuch in der Zend Framework Community ist, lies bitte zuerst die Hilfe - FAQ durch. Du musst Dich registrieren, bevor Du Beiträge verfassen kannst. Klicke oben auf 'Registrieren', um die Registrierung zu starten. Du kannst auch jetzt schon Beiträge lesen. Hier im Forum findest Du die Zend Framework Hilfe, die Du suchst!

    Grüße an alle Zend Framework Entwickler. Das Team vom Zend Framework Forum!

    Drupal Agentur

Datenbankproblem auf Produktivserver

LoremIpsum

New member
Hallo,

habe begonnen ein Projekt unter Windows 7 und XAMPP zu entwicklen. Dort läuft auch alles wunderbar. Auch die Übertragung zu Windows 8 (auch XAMPP) hat wunderbar funktioniert. Ohne, dass ich irgendwelche Einstellungen tätigen musste.

Auf dem Produktivserver unter Ubuntu (und wie bei XAMPP auch MySQL) gibt es allerdings Probleme mit der Datenbankverbindung. Habe in der application.ini nichts verändert außer natürlich Passwort und Benutzername etc.

Damit ich mein Datenbank-Objekt nur einmal erstellen muss habe ich folgenden Code in der Bootstrap-Datei:

PHP:
protected function _initDB()
    {
        $dbOptions = $this->getOption('db');
        $db = Zend_Db::factory($dbOptions['adapter'], $dbOptions['params']);
        Zend_Registry::set('db', $db);
        Zend_Db_Table_Abstract::setDefaultAdapter($db);
    }
Auf dem Ububtu-Server läuft alles Fehlerlos, nur wenn die Datenbank ins Spiel kommt, dann geht nichts mehr. Habe mittels PDO auch mal ohne Zend Framework versucht die Datenbank zu kontaktieren. Da läuft alles Problemlos:

PHP:
    $strDbLocation = 'mysql:dbname=xyz;host=localhost';
    $strDbUser = 'myUser';
    $strDbPassword = 'tollesPasswort';

    try {
        $db = new PDO($strDbLocation, $strDbUser, $strDbPassword);
    } catch (PDOException $e) {
        echo 'Datenbank-Fehler: ' . $e->getMessage();
    }
    
    $stmt = $db->prepare('SELECT * FROM user;');
    $stmt->execute();
    
    while($obj = $stmt->fetchObject()) {
        echo $obj->username."<br />";
    }

Hat vielleicht von euch jemand eine Idee was falsch laufen könnte?


Viele Grüße,
LoremIpsum
 

Kaiuwe

Super-Moderator
Willkommen im Forum! :)
Habe in der application.ini nichts verändert außer natürlich Passwort und Benutzername etc.
Da man bei den INI-Dateien mit Abschnitten arbeiten kann, zum Beispiel für Entwicklungs- und Produktivsystem, bräuchte man beim Hochladen gar nichts ändern.

Damit ich mein Datenbank-Objekt nur einmal erstellen muss habe ich folgenden Code in der Bootstrap-Datei:
PHP:
protected function _initDB()
    {
        $dbOptions = $this->getOption('db');
        $db = Zend_Db::factory($dbOptions['adapter'], $dbOptions['params']);
        Zend_Registry::set('db', $db);
        Zend_Db_Table_Abstract::setDefaultAdapter($db);
    }
Ist komplett überflüssig, denn wenn du schon die entsprechenden Einträge in der „application.ini“ hast, dann steht auch der Adapter für Zend_Db_Table bereits zur Verfügung. (Der Adapter in der „Registry“ ist ebenfalls überflüssig.)

Hat vielleicht von euch jemand eine Idee was falsch laufen könnte?
Bestimmt, wenn du uns die Fehlermeldung hier aufzeigst. Oder wie bekommst du mit, dass es an der Datenbankverbindung liegt?
 

LoremIpsum

New member
Es gibt bereits 1.12.1!
Ja, ich bin schon ein paar Monate an dem Projekt.

Das ist die application.ini:

[production]
phpSettings.display_startup_errors = 0
phpSettings.display_errors = 0
includePaths.library = APPLICATION_PATH "/../library"
bootstrap.path = APPLICATION_PATH "/Bootstrap.php"
bootstrap.class = "Bootstrap"
appnamespace = "Application"
resources.frontController.controllerDirectory = APPLICATION_PATH "/controllers"
resources.frontController.params.displayExceptions = 0
resources.layout.layoutPath = APPLICATION_PATH "/layouts/scripts/"

db.adapter = "PDO_MYSQL"
db.isdefaulttableadapter = true
db.params.dbname = "xyz"
db.params.username = "abc"
db.params.password = "11elf"
db.params.host = "localhost"
db.params.charset = "UTF8"

my.version = "1"
my.update = "http://www.example.com/update.php"
my.information = "http://www.example.com/information.php"

my.wysiwyg = "0"
my.tablelines = "12"
my.cache = "60"

[staging : production]

[testing : production]
phpSettings.display_startup_errors = 1
phpSettings.display_errors = 1

[development : production]
phpSettings.display_startup_errors = 1
phpSettings.display_errors = 1
resources.frontController.params.displayExceptions = 1
 

Kaiuwe

Super-Moderator
Code:
db.adapter = "PDO_MYSQL"
db.isdefaulttableadapter = true
db.params.dbname = "xyz"
db.params.username = "abc"
db.params.password = "11elf"
db.params.host = "localhost"
db.params.charset = "UTF8"
Ersetze mal gegen:
Code:
[production]
resources.db.adapter                 = "pdo_mysql"
resources.db.params.host             = "localhost""
resources.db.params.username         = "…"
resources.db.params.password         = "…"
resources.db.params.dbname           = "foo"
resources.db.params.charset          = "utf8"

[development : production]
resources.db.adapter                 = "pdo_mysql
resources.db.params.host             = "localhost""
resources.db.params.username         = "…"
resources.db.params.password         = "…"
resources.db.params.dbname           = "bar"
resources.db.params.charset          = "utf8"
resources.db.params.profiler.class   = "Zend_Db_Profiler_Firebug"
resources.db.params.profiler.enabled = true
Damit kannst du für die entsprechende Umgebung die passenden Verbindungsdaten zur Datenbank angeben und der „Zend_Db_Table“ hat automatisch den Adapter.
Zusätzlich lösche die Methode „_initDB()“ aus deiner „Bootstrap“-Klasse. (Ich hoffe du verwendest nicht den Datenbankadapter, welcher in der „Registry“ hinterlegt ist!)

Damit du deinen Fehler nachverfolgen kannst, setzt im Abschnitt „production“ dann noch:
Code:
; Front controller
resources.frontcontroller.throwExceptions          = 1
resources.frontcontroller.params.displayExceptions = 1
 
Zuletzt bearbeitet:

LoremIpsum

New member
Ein Beispielaufruf der Datenbank sieht in einem Model z.B. so aus:

Im Konstruktor lege ich das aus der Registry ab:

$this->db = Zend_Registry::get('db');
Und das wird dann z.B. so verwendet:

$this->db->delete('User', array('id = ?' => $id));

Was sollte ich da denn ändern? Ich war damals irgendwann froh, dass es funktioniert. Hatte das auch in irgendeinem Tutorial so gefunden...
 

Kaiuwe

Super-Moderator
Bisher nicht, aber das lässt sich ja noch machen?
Klar, kann man machen. Schau dazu einfach in die Doku und mach dich mit dem Entwurfsmuster dahinter vertraut.
Wenn du hier vielleicht eine Model-Klasse (beispielhaft) aufzeigen könntest, dann kann dir vielleicht noch gezielter geholfen werden.
 

LoremIpsum

New member
Also eine gekürzte Model-Klasse sieht z.B. so aus:

PHP:
<?php

class Application_Model_User
{
    
    protected $db;
    
    protected $id;
    protected $username;
    protected $password;
    protected $rights;
    protected $firstname;
    protected $lastname;
    protected $email;

    public function __construct($username = null, $password = null, $rights = null, $firstname = null, $lastname = null, $email = null, $id = null) 
    {
        $this->db = Zend_Registry::get('db');
        $this->username = $username;
        $this->password = $password;
        $this->rights = $rights;
        $this->firstname = $firstname;
        $this->lastname = $lastname;
        $this->email = $email;
        
        $this->id = $id;
    }

    public function createUser() 
    {
        try {
            $this->db->insert('User', array(
                'username' => $this->username,
                'password' => sha1($this->password),
                'rights' => $this->rights,
                'firstname'    => $this->firstname,
                'lastname' => $this->lastname,
                'email' => $this->email
            ));
            return true;
        } catch(Exception $e) {
            return false;
        }
    }

    //Getter, Setter und weitere, ähnliche Methoden...
 

Kaiuwe

Super-Moderator
PHP:
class Application_Model_User
{
    
    protected $db;
    
    protected $id;
    protected $username;
    protected $password;
    protected $rights;
    protected $firstname;
    protected $lastname;
    protected $email;

    public function __construct($username = null, $password = null, $rights = null, $firstname = null, $lastname = null, $email = null, $id = null) 
    {
        $this->db = Zend_Registry::get('db');
        $this->username = $username;
        $this->password = $password;
        $this->rights = $rights;
        $this->firstname = $firstname;
        $this->lastname = $lastname;
        $this->email = $email;
        
        $this->id = $id;
    }
Hier wäre wohl ein „Data Mapper“ besser geeignet. Einen Einstieg findest du auch in ZF-Doku: Create a Model and Database Table - Zend Framework Quick Start - Zend Framework
Überspringe einfach den Teil mit der Einrichtung der SQL-Datenbank und schau dir nur die ganzen Klassen und die Erläuterungen dazu an. Damit löst du den ganzen Datenbankkram aus deinen Models heraus.

Lies es dir mal durch und gib eine Rückmeldung was du davon hältst bzw. ob dies etwas für dich und deine Anwendung wäre.
 

LoremIpsum

New member
Okay, das ist jetzt einer dieser "Hätte ich das nur früher gesehen"-Momente...
Siehst du da vielleicht noch eine andere Möglichkeit?
 

LoremIpsum

New member
Hätte noch eine Fehlermeldung die auch, nach kleiner Änderung in application.ini, unter XAMPP erscheint.

Habe folgendes zur Application.ini hinzugefügt:

resources.frontcontroller.throwExceptions = 1
resources.frontcontroller.params.displayExceptions = 1
Und erhalte dann folgenden Fehler:

Fatal error: Uncaught exception 'Zend_Application_Bootstrap_Exception' with message 'No default controller directory registered with front controller' in C:\xampp\htdocs\public\MyProject2\library\Zend\Application\Bootstrap\Bootstrap.php:91

Woran liegt das? Kann aber eigentlich nicht die Ursache für das DB-Problem sein, da es ohne obige Zeilen ja unter XAMPP funktioniert.
 

Blub?

New member
Zum fatal error: Vorhandene Ressource Plugins - Zend_Application - Zend Framework

Warum es zuvor ging:
The point is, be aware that there is a very important Front Controller setting, called throwExceptions. Its default value is false. If it's false, then if inside the preDispatch an exception is thrown, it's possible that your security is compromised: the exception will be catched by the frontController, and the dispatch will continue, executing potentially dangerous code.

It's therefore more secure to set throwException to true. In your .ini configuration file, you can do it like this:

resources.frontcontroller.throwExceptions = 1
Quelle: How does the ZF Front Controller throwExceptions setting influence its plugins · Tutorialpedia.org
 

LoremIpsum

New member
Habe mal testweise in einem Bereich, in dem man nicht eingeloggt sein muss, eine Datenbankanfrage getestet:

PHP:
try {
            $stmt = $this->db->query(
                'SELECT a.title AS title
                 FROM Navigation a',
                 array()
            );
            while ($row = $stmt->fetch()) {
                echo $row['title'];
            }
        } catch(Exception $e) {
            echo $e;
        }
Unter XAMPP lokal unter Windows funktioniert es wieder und auf dem Server gibt es folgende Fehlermeldung:

exception 'PDOException' with message 'SQLSTATE[42S02]: Base table or view not found: 1146 Table 'admin_myproject.Navigation' doesn't exist' in /var/www/vhosts/example.com/httpdocs/myproject/library/Zend/Db/Statement/Pdo.php:228 Stack trace: #0 /var/www/vhosts/example.com/httpdocs/myproject/library/Zend/Db/Statement/Pdo.php(228): PDOStatement->execute(Array) #1 /var/www/vhosts/example.com/httpdocs/myproject/library/Zend/Db/Statement.php(300): Zend_Db_Statement_Pdo->_execute(Array) #2 /var/www/vhosts/example.com/httpdocs/myproject/library/Zend/Db/Adapter/Abstract.php(479): Zend_Db_Statement->execute(Array) #3 /var/www/vhosts/example.com/httpdocs/myproject/library/Zend/Db/Adapter/Pdo/Abstract.php(238): Zend_Db_Adapter_Abstract->query('SELECT a.title ...', Array) #4 /var/www/vhosts/example.com/httpdocs/myproject/application/controllers/ApiController.php(95): Zend_Db_Adapter_Pdo_Abstract->query('SELECT a.title ...', Array) #5 /var/www/vhosts/example.com/httpdocs/myproject/library/Zend/Controller/Action.php(516): ApiController->restAction() #6 /var/www/vhosts/example.com/httpdocs/myproject/library/Zend/Controller/Dispatcher/Standard.php(295): Zend_Controller_Action->dispatch('restAction') #7 /var/www/vhosts/example.com/httpdocs/myproject/library/Zend/Controller/Front.php(954): Zend_Controller_Dispatcher_Standard->dispatch(Object(Zend_Controller_Request_Http), Object(Zend_Controller_Response_Http)) #8 /var/www/vhosts/example.com/httpdocs/myproject/library/Zend/Application/Bootstrap/Bootstrap.php(97): Zend_Controller_Front->dispatch() #9 /var/www/vhosts/example.com/httpdocs/myproject/library/Zend/Application.php(366): Zend_Application_Bootstrap_Bootstrap->run() #10 /var/www/vhosts/example.com/httpdocs/myproject/public/index.php(26): Zend_Application->run() #11 {main} Next exception 'Zend_Db_Statement_Exception' with message 'SQLSTATE[42S02]: Base table or view not found: 1146 Table 'admin_myproject.Navigation' doesn't exist' in /var/www/vhosts/example.com/httpdocs/myproject/library/Zend/Db/Statement/Pdo.php:234 Stack trace: #0 /var/www/vhosts/example.com/httpdocs/myproject/library/Zend/Db/Statement.php(300): Zend_Db_Statement_Pdo->_execute(Array) #1 /var/www/vhosts/example.com/httpdocs/myproject/library/Zend/Db/Adapter/Abstract.php(479): Zend_Db_Statement->execute(Array) #2 /var/www/vhosts/example.com/httpdocs/myproject/library/Zend/Db/Adapter/Pdo/Abstract.php(238): Zend_Db_Adapter_Abstract->query('SELECT a.title ...', Array) #3 /var/www/vhosts/example.com/httpdocs/myproject/application/controllers/ApiController.php(95): Zend_Db_Adapter_Pdo_Abstract->query('SELECT a.title ...', Array) #4 /var/www/vhosts/example.com/httpdocs/myproject/library/Zend/Controller/Action.php(516): ApiController->restAction() #5 /var/www/vhosts/example.com/httpdocs/myproject/library/Zend/Controller/Dispatcher/Standard.php(295): Zend_Controller_Action->dispatch('restAction') #6 /var/www/vhosts/example.com/httpdocs/myproject/library/Zend/Controller/Front.php(954): Zend_Controller_Dispatcher_Standard->dispatch(Object(Zend_Controller_Request_Http), Object(Zend_Controller_Response_Http)) #7 /var/www/vhosts/example.com/httpdocs/myproject/library/Zend/Application/Bootstrap/Bootstrap.php(97): Zend_Controller_Front->dispatch() #8 /var/www/vhosts/example.com/httpdocs/myproject/library/Zend/Application.php(366): Zend_Application_Bootstrap_Bootstrap->run() #9 /var/www/vhosts/example.com/httpdocs/myproject/public/index.php(26): Zend_Application->run() #10 {main}

Hat damit jemand eine Idee wie man die Anwendung auf dem Server genauso ans Laufen bekommt wie lokal?
 
Oben