• 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

Abfrage mit zend-db Select führt immer zu gleichem Ergebnis

Katja_bo

New member
Moin liebes Forum,

ich verzweifel hier grade etwas.
Ich steige grade um von ZF1 auf ZF3 und versuche grade meine ersten Schritte.
Im Moment möchte ich mir ein Datenbank gestützte Übersetzungsstrategie aufbauen.
Dazu habe ich mit eine Datenbankanbindung zu MySQl aufgebaut und per 'charkey' und zugehörige 'Language' (zuzeit nur '1' für Deutsch).
Das funktioniert auch ziemlich gut, ich bekomme die Daten zurück die ich erwartet habe. Aber: genau 1x, danach macht meine Datenbankanbindung kein refresh.
Alle Variablen werden sauber übergeben.

Da der Abruf an sich ja funk. stelle ich nur die m.E.n. relevanten Codesnipes hier rein, ich finde es nicht schön 5 Seiten Code zu posten und zu sagen lies mal durch und gib mir eine Lösung. Für Interessierte, die wissen wollen was ich da so zusammenfriggel, habe ich aber das Projekt mal als ZIP angehängt.

Ich glaube auch eher dass der Fehler im Zusammenspiel der einzelnen Komponenten zu finden ist.

Was ich mache ist folgendes:
Ich habe ein ContentDbTable Objekt.
Das stellt ein paar Methoden und den Constructor dem Objekt ContentTable zur Verfügung. Der Constructor sieht so aus:

Code:
public function __construct($adapter)
        $this->adapter= $adapter;
}

Ein ContentTable Objekt erweitert das ContentDbTable Objekt um die fetch Methode:

Code:
class ContentTable extends ContentDbTable{
  public function fetchByCharKey($charkey){
        $this->table(); 
        $this->select->where('fk_language=' . 1 . ' AND '. "charkey='" . $charkey ."'");
        $this->select->order('content ASC');
        $k=null;
        $k= $this->tabelGateway->select();
        $v=$k->current();
        if (!$v){
            $c=$charkey;
        } else {
            $c=$v->getContent();
        }
        return $c;
        
    }
}
Die aufgerufene Methode table() ist bereits ein verzweifelter Versuch den Refresh zu erzwingen - ich kann sie gezielt aufrufen / ja,sie ist überflüssig- und sieht so aus:

Code:
public function table()
    {
        $resultSetPrototype = new ResultSet();
        $resultSetPrototype->setArrayObjectPrototype(new Content());
        $this->tabelGateway= new  TableGateway('content', $this->adapter, null, $resultSetPrototype);
        $this->select=new Select;
}
Es gibt auch noch ein Wert-Model mit „exchangeArray“

Aufgebaut wird das Objekt über ein View-Helper (den ich dann einfach in die Views einstricke):

Code:
use Zend\View\Helper\AbstractHelper;
use Content\Model\ContentTable;

class Content extends AbstractHelper
{
    protected $table;
    protected $serviceLocator;
        public function __construct($container) {        
            $this->table= new ContentTable($container);
    }  
    public  function translate($chakey){
        $r=$this->table->fetchByCharKey($chakey);
        return $r;       
    }    
}
Der Viewhelper hat eine Factory:

Code:
class ContentFactory implements FactoryInterface
{
    public function __invoke(
        ContainerInterface $container,
        $requestedName,
        array $options = null
    ) {
        $content = new Content($container->get(Adapter::class));
           return $content;
    }
}
Und die Factory wird in Module.Config.php aufgerufen:

Code:
'view_helpers'=> [
        'factories'=>[
            View\Helper\Content::class => View\Helper\ContentFactory::class,
            
        ],
        'aliases'=>[
            'translate' => View\Helper\Content::class
        ]
    ],
Tja und im View rufen ich dann nur noch

Code:
$this->translate()->translate($test)
auf.
1x Funktioniert es auch.
Wenn ich dann die $test variable mit einem anderen Wert fülle erhalte ich beim Neuladen der Seite den alten Wert.

Wo kann ich da auf die Suche gehen, ein Anhaltspunkt reicht bestimmt schon. Aber ich weiß im Moment nicht mehr wo ich suchen soll.


Danke im Vorraus, Katja
 

Anhänge

Zuletzt bearbeitet von einem Moderator:

Kaiuwe

Super-Moderator
Hallo Katja,
der Aufbau ist etwas verwirrend und du musst den momentanen Stand der Anwendung mal aufräumen:

* „Content\Model\Content->getContent()“ – verwirrend
* „ContentTable“ vs. „ContentDbTable“ – eine Klasse reicht hier aus
* zend-config in „Content\Module“ unnötig
* „ApplicationStandardController“ unnötig
* „view_helpers“ falsch in „Application/config/module.config.php“ – kann komplett entfernt werden
* usw.

Wenn du etwas aufgeräumt hast, dann übergib nicht den Datenbankadapter an deine „ContentTable“-Klasse sondern das fertige „TableGateway“-Objekt. Dann kannst du folgendes verwenden:

Code:
public function fetchByCharKey(string $charkey) : ?string
{
    $select = $this->tabelGateway->getSql()->select();

    $select->where->equalTo('fk_language', '1');
    $select->where->equalTo('charkey', $charkey);
    $select->order('content ASC');

    /** @var \Zend\Db\ResultSet\ResultSet $resultSet */
    $resultSet = $this->tabelGateway->selectWith($select);

    if ($resultSet->count()) {
        /** @var \Content\Model\Content $content */
        $content = $resultSet->current();

        return $content->getContent();
    }

    return null;
}
Damit wird jedesmal eine neue „Select“-Abfrage erstellt und nicht die Vorgehende ständig nur erweitert.
 
Oben