PDO

Dieser Bereich dient dazu, neue Features zu diskutieren und für die Entwicklung zu dokumentieren. // This area is dedicated to new features including proposals and documentation.
Benutzeravatar
dr.e.
Administrator
Beiträge: 4527
Registriert: 04.11.2007, 16:13:53

Re: PDO

Beitrag von dr.e. » 16.04.2012, 14:07:18

Sehr schön. Dann hat mein blindes Refactoren in deiner Klasse funktioniert (PHPStorm ist einfach super).
Nur einen kleinen Fehler -> "const SEVERITY_DEBUG = 'DEBUG';" fehlt in der Klasse LogEntry
Damn, du hast Recht. :roll: Das hatte ich lokal bei der Verbesserung des Loggers (siehe Roadmap) schon eingebaut und ein Interface eingezogen nur noch nicht eingecheckt. Hole das die Tage nach, da ich versuchen möchte einen etwas besseren Logger in 1.15 einzubauen, der jedoch voll abwärtskompatibel ist. Leider ist das nicht so ganz einfach wie gedacht. :(
Viele Grüße,
Christian

Megger
Beiträge: 1233
Registriert: 04.11.2008, 10:57:37

Re: PDO

Beitrag von Megger » 16.04.2012, 14:55:36

Ich merke gerade: PDO und GORM mögen sich nicht so richtig!

Wenn ich per CriterionObject ein Object lade, dann erzeugt mir GORM per PDO ein Statement im Logfile:

Code: Alles auswählen

SELECT `ent_crondispatcher`.* FROM `ent_crondispatcher`  WHERE `ent_crondispatcher`.`'PID'` = ''4018''
Dabei gibt es einfach zuviele ' im Statement, richtig wäre

Code: Alles auswählen

SELECT `ent_crondispatcher`.* FROM `ent_crondispatcher`  WHERE `ent_crondispatcher`.`PID` = '4018'
Die Schuld liegt irgendwo in der buildWhere()-Methode von GenericORRelationMapper:

Code: Alles auswählen

protected function buildWhere($objectName, GenericCriterionObject $criterion) {

      $whereList = array();

      // retrieve property indicators
      $properties = $criterion->getPropertyDefinition();

      if (count($properties) > 0) {

         // add additional where statements
         foreach ($properties as $property) {

            $propertyName = $this->dbDriver->escapeValue($property['Name']);

            if (is_object($property['Value']) === TRUE) {
               $whereList[] = '(' . implode('', $this->buildWhere($objectName, $property['Value'])) . ')';
            } else {
               $propertyValue = $this->dbDriver->escapeValue($property['Value']);

               if ((substr_count($propertyValue, '%') > 0 || substr_count($propertyValue, '_') > 0) && $property['ComparisonOperator'] == '=') {
                  $whereList[] = '`' . $this->mappingTable[$objectName]['Table'] . '`.`' . $propertyName . '` LIKE \'' . $propertyValue . '\'';
               } else {
                  $whereList[] = '`' . $this->mappingTable[$objectName]['Table'] . '`.`' . $propertyName . '` ' . $property['ComparisonOperator'] . ' \'' . $propertyValue . '\'';
               }
            }

            $whereList = array(implode(' ' . $property['LogicalOperator'] . ' ', $whereList));
         }
      }

      return $whereList;
   }
 
Das Problem ist das escapeValue! Dadurch werden "gefährliche" Zeichen escaped, aber beim ausführen läuft das ganze über prepare und wird dort meiner Meinung nach nocheinmal escaped, dadurch entstehen dann solche Konstrukte!

Edit:
Wenn man im PDOHandler bei escapeValue den Wert einfach wieder zurückgibt, dann funktioniert es!

Allerdings habe ich noch einen kleinen Fehler entdeckt und zwar fehlt in der executeTextStatement()-Methode das execute (das habe ich wohl mitsamt den Debugausgaben rausgeschmissen :oops: ) Werde ich nachher direkt per Commit anpassen
Tutorial: Browsergame mit dem APF (Die ersten Parts handeln von Installation und Inbetriebnahme des APFs, deswegen sicherlich auch für alle Nicht-Browsergame-Programmierer interessant)

APF-Version
  • Entwicklung: 2.0
  • Produktiv: 1.15

Benutzeravatar
dr.e.
Administrator
Beiträge: 4527
Registriert: 04.11.2007, 16:13:53

Re: PDO

Beitrag von dr.e. » 16.04.2012, 21:20:16

Hallo Tobi,

danke für die Analyse. Sind wir sicher, dass ein escapeValue() bei PDO nicht notwendig ist? Können wir PDO alternativ beibringen, beim prepare nicht nochmal zu escapen?
Werde ich nachher direkt per Commit anpassen
OK, perfekt. Mit dem Logger bin ich noch etwas auf Kriegsfuß, da meine Anpassung nicht abwärtskompatibel ist. Ich muss dazu nochmal in mich gehen. :roll:
Viele Grüße,
Christian

Megger
Beiträge: 1233
Registriert: 04.11.2008, 10:57:37

Re: PDO

Beitrag von Megger » 16.04.2012, 23:39:10

Sind wir sicher, dass ein escapeValue() bei PDO nicht notwendig ist? Können wir PDO alternativ beibringen, beim prepare nicht nochmal zu escapen?
Da recherchiere ich momentan noch! Problem ist einfach, dass alle davon ausgehen, dass man PDO nur mit Prepared Statements verwendet (die übergebenen Parameter werden escaped)
Tutorial: Browsergame mit dem APF (Die ersten Parts handeln von Installation und Inbetriebnahme des APFs, deswegen sicherlich auch für alle Nicht-Browsergame-Programmierer interessant)

APF-Version
  • Entwicklung: 2.0
  • Produktiv: 1.15

Benutzeravatar
dr.e.
Administrator
Beiträge: 4527
Registriert: 04.11.2007, 16:13:53

Re: PDO

Beitrag von dr.e. » 17.04.2012, 12:45:28

OK, dann würde nur noch ein Parameter im GORM helfen, der per DI konfiguriert, ob escaped werden soll oder nicht. Ist zwar nicht schön, würde aber helfen.
Viele Grüße,
Christian

Megger
Beiträge: 1233
Registriert: 04.11.2008, 10:57:37

Re: PDO

Beitrag von Megger » 07.05.2012, 14:47:40

Das Escaping ist echt ein Problem, allerdings sollte man PDO sowieso über PreparedStatements nutzen! Aber um die normale Funktionalität zu gewährleisten, hätte ich eine dirty Lösung:

Code: Alles auswählen

$quoted = $this->dbConn->quote($value);
return substr($quoted, 1, strlen($quoted) - 2);
 
quote() escaped den Wert korrekt, setzt allerdings auch ' um den kompletten Wert, die ' werden dann wieder per substr entfernt!
Ansonsten wüsste ich nicht, wie man es anders lösen könnte, da PDO kein reines Escaping kennt!

Offtopic:
Gut das ich im SVN gesehen habe, dass ich den Logger "einstellen" muss, sodass meine Statements weiterhin geloggt werden, auch wenn ich logStatements auf true gestellt habe ;)
Tutorial: Browsergame mit dem APF (Die ersten Parts handeln von Installation und Inbetriebnahme des APFs, deswegen sicherlich auch für alle Nicht-Browsergame-Programmierer interessant)

APF-Version
  • Entwicklung: 2.0
  • Produktiv: 1.15

Benutzeravatar
dr.e.
Administrator
Beiträge: 4527
Registriert: 04.11.2007, 16:13:53

Re: PDO

Beitrag von dr.e. » 07.05.2012, 17:12:46

Sofern es funktioniert, passt das für mich. Vielleicht sollten wir aber in 1.16 die Signatur des AbstractDatabaseHandler nochmals hinsichtlich PDO reviewen um ggf. eine etwas bessere API-Signatur zu definieren.
Offtopic:
Gut das ich im SVN gesehen habe, dass ich den Logger "einstellen" muss, sodass meine Statements weiterhin geloggt werden, auch wenn ich logStatements auf true gestellt habe ;)
Hab' ich da etwas übersehen? :roll:
Viele Grüße,
Christian

Megger
Beiträge: 1233
Registriert: 04.11.2008, 10:57:37

Re: PDO

Beitrag von Megger » 07.05.2012, 17:26:43

Vielleicht sollten wir aber in 1.16 die Signatur des AbstractDatabaseHandler nochmals hinsichtlich PDO reviewen um ggf. eine etwas bessere API-Signatur zu definieren.
Klingt gut
Hab' ich da etwas übersehen?
Standardmäßig werden vom Logger ja keine DEBUG Ausgaben mehr geloggt, deswegen hat man keine Ausgabe von Statements mehr, obwohl man logStatements auf true gesetzt hat!
Tutorial: Browsergame mit dem APF (Die ersten Parts handeln von Installation und Inbetriebnahme des APFs, deswegen sicherlich auch für alle Nicht-Browsergame-Programmierer interessant)

APF-Version
  • Entwicklung: 2.0
  • Produktiv: 1.15

Benutzeravatar
dr.e.
Administrator
Beiträge: 4527
Registriert: 04.11.2007, 16:13:53

Re: PDO

Beitrag von dr.e. » 07.05.2012, 20:17:17

Stimmt. :roll: Ich werde in den Migrations-Artikel einen Hinweis aufnehmen.

==> http://wiki.adventure-php-framework.org ... ion_Logger
Viele Grüße,
Christian

Megger
Beiträge: 1233
Registriert: 04.11.2008, 10:57:37

Re: PDO

Beitrag von Megger » 18.05.2012, 13:35:10

Habe noch zwei kleine Fehler im PDOHandler behoben, nun funktioniert meine Erweiterung mit der aktuellen SVN Version!
Tutorial: Browsergame mit dem APF (Die ersten Parts handeln von Installation und Inbetriebnahme des APFs, deswegen sicherlich auch für alle Nicht-Browsergame-Programmierer interessant)

APF-Version
  • Entwicklung: 2.0
  • Produktiv: 1.15

Benutzeravatar
dr.e.
Administrator
Beiträge: 4527
Registriert: 04.11.2007, 16:13:53

Re: PDO

Beitrag von dr.e. » 18.05.2012, 16:47:20

Danke dir! Geht direkt noch in 1.15 ein.
Viele Grüße,
Christian

Gesperrt

Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 1 Gast