Page 1 of 1

[PHP] Probleme mit PDO / Abfrage fehlerhaft

Posted: 2007-07-10 15:31
by dtdesign
Hallo,

ich habe mal wieder ein Problem mit PDO :) Mein Problem stellt sich wie folgt dar: Obwohl der SQL-Query korrekt ist und offensichtlich auch richtig mit $statement->binParam bearbeitet wurde, kommt es zu Problemen.

Ablauf:

1) Datenbank-Verbindung steht (dies wird an PDO übergeben und es kommt zu keinem Fehler):

Code: Select all

[string] => mysql:host=localhost;dbname=dtcms [username] => root [password] => <Passwort>
2) SQL-Query (vor dem Bearbeiten mit $statement->bindParam()):

Code: Select all

SELECT `:placeholder_0`,`:placeholder_1`,`:placeholder_2`,`:placeholder_3` FROM `dtcms_navigation`
3) Abgefragte Felder:

Code: Select all

	    $data   = array(
	        'navigation_parent_id',
	        'navigation_module',
	        'navigation_submodule',
	        'navigation_title'
		);
4) Nach dem ausführen der Abfrage mittels $statement->execute wird folgender Fehler abgefangen:

Code: Select all

[#1054] Unknown column ''navigation_parent_id'' in 'field list'
Zusätzliche Informationen / Tabellenstruktur:

Code: Select all

-- 
-- Datenbank: `dtcms`
-- 

-- --------------------------------------------------------

-- 
-- Tabellenstruktur für Tabelle `dtcms_navigation`
-- 

CREATE TABLE `dtcms_navigation` (
  `navigation_id` smallint(5) unsigned NOT NULL auto_increment,
  `navigation_parent_id` smallint(5) unsigned NOT NULL default '0',
  `navigation_module` varchar(50) NOT NULL,
  `navigation_submodule` varchar(50) NOT NULL,
  `navigation_title` varchar(50) NOT NULL,
  PRIMARY KEY  (`navigation_id`)
) ENGINE=MyISAM  DEFAULT CHARSET=utf8 COMMENT='Navigation des DeltaTeamCMS' AUTO_INCREMENT=10 ;
Hat jemand eine Idee, was ich falsch gemacht habe?

Gruß
dtdesign

Re: [PHP] Probleme mit PDO / Abfrage fehlerhaft

Posted: 2007-07-10 16:00
by Roger Wilco
So wie du das vorhast funktionieren Prepared Statements nicht. Die Platzhalter sind für Literale gedacht, also Eingabewerte, die der Benutzer verändern kann. Du willst damit die zu selektierenden Spalten angeben.

Re: [PHP] Probleme mit PDO / Abfrage fehlerhaft

Posted: 2007-07-10 19:03
by dtdesign
Dank dir Roger Wilco für die schnelle Hilfe.

Wenn ich dich recht verstehe, sollte ich am sinnvollsten mit einer foreach/for-Schleife die Spalten in den Query einbauen? Wie sieht es dann mit dem escapen von Steuerzeichen aus, prepared Statements werden ja escaped aber so weit ich die Dokumentation verstehe nur die entsprechenden Eingaben?

Gruß
dtdesign

Re: [PHP] Probleme mit PDO / Abfrage fehlerhaft

Posted: 2007-07-10 19:32
by Roger Wilco
dtdesign wrote:Wenn ich dich recht verstehe, sollte ich am sinnvollsten mit einer foreach/for-Schleife die Spalten in den Query einbauen?
Das kommt ganz darauf an, was du eigentlich vorhast. Willst du die abgefragten Spalten tatsächlich dynamisch zusammensetzen? Soweit ich das sehe müsstest du doch immer die 4 Spalten abfragen und nur die Bedingung (WHERE [...]) ändern.
dtdesign wrote:Wie sieht es dann mit dem escapen von Steuerzeichen aus, prepared Statements werden ja escaped aber so weit ich die Dokumentation verstehe nur die entsprechenden Eingaben?
Nur die Platzhalter, also :varname oder '?'. Der restliche Query bleibt unberührt.

Re: [PHP] Probleme mit PDO / Abfrage fehlerhaft

Posted: 2007-07-10 20:26
by dtdesign
Nein, dies war nur ein Beispielquery der zu einem Fehler führt. Das escapen ist insofern wichtig, dass jedes beliebige Modul mit dem Datenbank-Treiber tratschen kann und sich nicht um Sachen wie escapen etc. kümmern zu braucht.

$data ist hierbei nur ein Ausschnitt gewesen, der vollständige Teil steht unten. Wie kann ich jedoch auch solche Einträge escapen, weil sobald ich von Hand - etwa mit mysql_real_escape_string - escape, geht mir der Vorteil von PDO verloren. Oder sollte ich an dieser Stelle einfach vertrauen?

Gruß
dtdesign

Code: Select all

	/**
	 *  Erstellen der Menünavigation
	 *
	 *  @return void
	 */
	function template_create_navigation()
	{
	    global $db;
	    global $dtcms;
	    
	    $data   = array(
	        'navigation_parent_id',
	        'navigation_module',
	        'navigation_submodule',
	        'navigation_title'
		);
		
	    $result	= $db->ExecuteQuery(SELECT, $dtcms['config']['prefix'] . '_navigation', $data);
	}

Re: [PHP] Probleme mit PDO / Abfrage fehlerhaft

Posted: 2007-07-10 20:48
by Roger Wilco

Code: Select all

   function template_create_navigation()
   {
       // [...]
       $result   = $db->ExecuteQuery('SELECT navigation_parent_id, navigation_module, navigation_submodule, navigation_title FROM '.$db->quote($dtcms['config']['prefix'].'_navigation'));
   }
http://php.net/manual/de/function.PDO-quote.php

Du solltest vielleicht auch nochmal über die Trennung der verschiedenen Schichten deiner Anwendung nachdenken.