Also..ich bekomme folgenden Fehler:
Ich kann mir das ganze auch erklären und zuordnen...
Die Methode DB_MySQL_Test->execute($query) sollte nicht aufgerufen werden, sondern die Methode DB_MySQL_Test_Statement->execute()..
Also der Code sieht folgendermaßen aus:
class.authenticate.php
dieser wird von index.php aufgerufen, dieser Code spielt aber keine Rolle, hier die beiden Klassen in einer Datei:
Die anderen eingebundenen Dateien sind halt nur die Exception-Handler...
Der sollte doch eigentlich aufgrund der Funktion DB_MySQL_Test->prepare($query) in DB_MySQL_Test_Statement springen und dann die execute-Methode ausführen... aber, ne...er zeigt mir lieber nen Query-String-Fehler an
Vllt findet ja jemand den Fehler...
Danke im Vorraus, Dennis
P.S.: Falls jemand den ganzen Code haben möchte...schreiben...falls sich jemand über die komischen require_once-Aufrufe wundert... wir verwenden eine zentrale Datei, wo Passwörter, Pfade und Einstellungen gespeichert sind und die auch dort als Konstanten definiert werden...
PHP-Code:
Fatal error: Uncaught exception 'MysqlException' with message 'You have an error in your SQL syntax;
check the manual that corresponds to your MySQL server version for the right syntax to use near
'email' at line 1' in D:\\Programme\\Zend\\Apache2\\htdocs\\lib\\database\\mysql\\test\\class.mysql_test.php:58 Stack trace:#0
D:\\Programme\\Zend\\Apache2\\htdocs\\lib\\authentication\\class.authenticate.php(6):
DB_MySQL_Test->execute('email', 'looser') #1
D:\\Programme\\Zend\\Apache2\\htdocs\\index.php(20): Authentication::check_credentials('email', 'looser') #2 {main} thrown in
D:\\Programme\\Zend\\Apache2\\htdocs\\lib\\database\\mysql\\test\\class.mysql_test.php on line 58
Die Methode DB_MySQL_Test->execute($query) sollte nicht aufgerufen werden, sondern die Methode DB_MySQL_Test_Statement->execute()..
Also der Code sieht folgendermaßen aus:
class.authenticate.php
PHP-Code:
<?php
class Authentication {
static function check_credentials($name, $password) {
$dbh = new DB_MySQL_Test;
$query = "SELECT user_id FROM cm_users WHERE user_mail = :1 AND user_pass = :2";
$cur = $dbh->prepare($query)->execute($name, $password);
$row = $cur->fetch_assoc();
if($row) {
$userid = $row['user_id'];
}
else {
throw new AuthException("User is not authorized!");
}
return $userid;
}
}
?>
PHP-Code:
<?php
class DB_MySQL_Test {
protected $db_user;
protected $db_pass;
protected $db_host;
protected $db_name;
protected $dbh;
public function __construct(){
$this->user = DB_USER;
$this->pass = DB_PASS;
$this->host = DB_HOST;
$this->name = DB_NAME;
}
protected function connect(){
$this->dbh = mysql_connect($this->host, $this->user, $this->pass);
if(!is_resource($this->dbh)){
require_once(FS_LIB_ROOT.DS.'database'.DS.'mysql'.DS.'mysql_exception.php');
throw new MysqlException;
}
if(!mysql_select_db($this->name, $this->dbh)){
require_once(FS_LIB_ROOT.DS.'database'.DS.'mysql'.DS.'mysql_exception.php');
throw new MysqlException;
}
}
public function execute($query){
if(!$this->dbh){
$this->connect();
}
$ret = mysql_query($query, $this->dbh);
if(!$ret){
require_once(FS_LIB_ROOT.DS.'database'.DS.'mysql'.DS.'mysql_exception.php');
throw new MysqlException;
}
elseif(!is_resource($ret)){
return TRUE;
}
else {
$stmt = new DB_MySQL_Test_Statement($this->dbh, $query);
$stmt->result = $ret;
return $stmt;
}
}
public function prepare($query){
if(!$this->dbh){
$this->connect();
}
return new DB_MySQL_Test_Statement($this->dbh, $query);
}
}
class DB_MySQL_Test_Statement {
protected $result;
protected $binds;
public $query;
protected $dbh;
public function __construct($dbh, $query){
$this->query = $query;
$this->dbh = $dbh;
if(!is_resource($dbh)){
require_once(FS_LIB_ROOT.DS.'database'.DS.'mysql'.DS.'mysql_exception.php');
throw new MysqlException("Not a valid database connection");
}
}
public function bind_param($ph, $pv){
$this->binds[$ph] = $pv;
}
public function execute($query){
$binds = func_get_args();
foreach ($binds as $index => $name){
$this->binds[$index + 1] = $name;
}
$cnt = count($binds);
$query = $this->query;
foreach ($this->binds as $ph => $pv){
$query = str_replace(":$ph", "'".mysql_escape_string($pv)."'", $query);
}
$this->result = mysql_query($query, $this->dbh);
if(!$this->result){
require_once(FS_LIB_ROOT.DS.'database'.DS.'mysql'.DS.'mysql_exception.php');
throw new MysqlException;
}
}
public function fetch_row(){
if(!$this->result){
require_once(FS_LIB_ROOT.DS.'database'.DS.'mysql'.DS.'mysql_exception.php');
throw new MysqlException("Query not executed");
}
return mysql_fetch_row($this->result);
}
public function fetch_assoc(){
return mysql_fetch_assoc($this->result);
}
public function fetchall_assoc(){
$retval = array();
while($row = $this->fetch_assoc()){
$retval[] = $row;
}
return $retval;
}
}
?>
Der sollte doch eigentlich aufgrund der Funktion DB_MySQL_Test->prepare($query) in DB_MySQL_Test_Statement springen und dann die execute-Methode ausführen... aber, ne...er zeigt mir lieber nen Query-String-Fehler an
Vllt findet ja jemand den Fehler...
Danke im Vorraus, Dennis
P.S.: Falls jemand den ganzen Code haben möchte...schreiben...falls sich jemand über die komischen require_once-Aufrufe wundert... wir verwenden eine zentrale Datei, wo Passwörter, Pfade und Einstellungen gespeichert sind und die auch dort als Konstanten definiert werden...
EDIT:
Das Forum schluckt ja die Backslashes... ... egal...hab's korrigiert ... oder eben auch nicht
auch die Breite angepasst
Kommentar