[PHP] Probleme mit PDO / Abfrage fehlerhaft

Apache, Lighttpd, nginx, Cherokee
dtdesign
Posts: 391
Joined: 2006-09-05 21:12
Location: Berlin

[PHP] Probleme mit PDO / Abfrage fehlerhaft

Post by dtdesign » 2007-07-10 15:31

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

Roger Wilco
Administrator
Administrator
Posts: 5924
Joined: 2004-05-23 12:53

Re: [PHP] Probleme mit PDO / Abfrage fehlerhaft

Post by Roger Wilco » 2007-07-10 16:00

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.

dtdesign
Posts: 391
Joined: 2006-09-05 21:12
Location: Berlin

Re: [PHP] Probleme mit PDO / Abfrage fehlerhaft

Post by dtdesign » 2007-07-10 19:03

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

Roger Wilco
Administrator
Administrator
Posts: 5924
Joined: 2004-05-23 12:53

Re: [PHP] Probleme mit PDO / Abfrage fehlerhaft

Post by Roger Wilco » 2007-07-10 19:32

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.

dtdesign
Posts: 391
Joined: 2006-09-05 21:12
Location: Berlin

Re: [PHP] Probleme mit PDO / Abfrage fehlerhaft

Post by dtdesign » 2007-07-10 20:26

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);
	}

Roger Wilco
Administrator
Administrator
Posts: 5924
Joined: 2004-05-23 12:53

Re: [PHP] Probleme mit PDO / Abfrage fehlerhaft

Post by Roger Wilco » 2007-07-10 20:48

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.