In folgender Klasse bei Methode(listField) werden die Feldlängen von Textfeldern falsch ausgegeben, wenn ich zuvor schon eine Anfrage über irgendeine andere Methode gestartet habe. Die Feldlängen werden anscheinend mit 3 multipliziert. Die Felder mit Integer-Werte bleiben unberührt und werden richtig ausgegeben.
An was könnte das liegen?
Wenn ich allerdings in der Methode listField() die Verbindung beende und neu starte werden die Feldlängen richtig ermittelt.
Tabelle:
id => tinyint(2)
txt => varchar(20)
datei => varchar(50)
platz => tinyint(2)
fsp => varchar(4)
templ => varchar(30)
aktiv => enum('Y','N')
MySql-Klasse
PHP-Code:
class DB_MySQL {
/**
* @var resource $connection Datenbank-Verbindung
*/
private $connection = NULL;
/**
* @var resource $result Ergebniskennung
*/
private $result = NULL;
/**
* @var string $fseite Fehlerseite
*/
protected $fseite = 'fehler.php';
/**
* @var string $sseite CMS-Startseite
*/
protected $sseite = 'start.php';
private $host = 'localhost';
private $db = 'xxxx';
private $user = 'xxxx';
private $pass = 'xxxx';
/**
* startet automatische DB-Verbindung
*
*/
public function __construct() {
$this->connect();
}
/**
* Weiterleitung auf eine andere Seite
*
* @param string $seite Seite auf die weitergeleitet werden soll
* @param integer $param Fehler-Id bei Fehlermeldung oder NULL
*/
public function SendError($seite, $param) {
if(!empty($param)) $_SESSION['fid'] = $param;
header('location:'.$seite);
exit;
}
/**
* verschlüßelt Passwort in Verbindung mit Benutzer-Namen und doppeltem md5
*
*@param string $user Benutzer-Name
*@param string $pas Passwort wie es eingegeben wurde
*@return string verschlüßeltes Passwort
*/
public function UserPass($user, $pas) {
$new_pas = md5(base64_encode(substr($user, 0, 3)).md5($pas));
$new_pw = substr($new_pas, 0, 10).substr($user, 0, 3).substr($new_pas, 10);
return $new_pw;
}
/**
* Funktion zur Prüfung von übergebenen $_GET, $_POST, $_SESSION und $_SERVER - Variablen
* Sonderzeichen werden maskiert um SQL-Injektion zu verhindern
*
* @param mixed $data
* @return mixed modifizierte Werte
*/
public function PruefVar($data)
{
// stripslashes, falls ntig
if(get_magic_quotes_gpc()) $data = stripslashes($data);
// quotieren, falls kein integer
if (!is_numeric($data)) {
$data = strip_tags($data);
$data = mysql_real_escape_string($data);
}
return $data;
}
/**
* übergibt Elemente eines Array an eine Funktion
*
* @param array $data
* @return array modifizierte Werte des Arrays
*/
public function PruefArray($data) {
if(is_array($data)) {
foreach($data as $key => $val)
{
if(is_array($val)) {
foreach($val as $kkey => $kval)
{
$data[$key][$kkey] = $this->PruefVar($kval);
}
}
else $data[$key] = $this->PruefVar($val);
}
}
return $data;
}
/**
* stellt Verbindung zur Datenbank her,
* bei Fehlschlag wird auf eine Infoseite weitergeleitet
*
*/
public function connect() {
$this->connection = @mysql_connect($this->host, $this->user, $this->pass, TRUE);
if(is_resource($this->connection)) {
mysql_select_db($this->db, $this->connection);
}
else {
$this->SendError('wartung.html', 6);
}
}
/**
* beendet Datenbank-Verbindung
*
*/
private function disconnect() {
if (is_resource($this->connection)) {
mysql_close($this->connection);
}
}
/**
* führt eine Anfrage an Datenbank aus
*
* @param string $query Query-String / Abfrage
* @return integer Anzahl betroffener Datensätze oder Insert-Id
*/
public function query($query) {
if (is_resource($this->connection)) {
if (is_resource($this->result)) {
mysql_free_result($this->result);
}
mysql_query("SET names 'UTF8'");
$this->result = mysql_query($query, $this->connection) or die(mysql_error()."<br>$query");
if(mysql_insert_id()) return mysql_insert_id();
else return mysql_affected_rows();
}
}
/**
* liefert gefundene Daten als Objekt zurück
*
* @return object gefundene Datenstze
*/
public function fetchObject() {
if (is_resource($this->result)) {
$row = mysql_fetch_object($this->result);
if (is_object($row)) {
return $row;
}
else {
return FALSE;
}
}
}
/**
* liefert gefundene Daten als Array zurück
*
* @return array gefundene Daten
*/
public function fetchAssoc() {
if (is_resource($this->result)) {
$row = mysql_fetch_assoc($this->result);
if (is_array($row)) {
return $row;
}
else {
return FALSE;
}
}
}
/**
* liefert gefundene Daten als indiziertes Array zurück
*
* @return array gefundene Daten
*/
public function fetchRow() {
if (is_resource($this->result)) {
$row = mysql_fetch_row($this->result);
if (is_array($row)) {
return $row;
}
else {
return FALSE;
}
}
}
/**
* liefert Ergebnismenge bei Verwendung von COUNT()
*
* @return integer Treffer-Zahl
*/
public function sqlCount() {
if(is_resource($this->result)) {
$count = mysql_result($this->result, 0);
if($count > 0) return $count;
else return FALSE;
}
}
/**
* liefert Ergebnismenge bei Verwendung von SQL_CALC_FOUND_ROWS
*/
public function foundRows() {
if(is_resource($this->result)) {
$count = mysql_result(mysql_query("SELECT FOUND_ROWS()", $this->connection), 0);
if($count > 0) return $count;
else return 0;
}
}
/**
* Liefert Informationen über Tabellen-Feldlänge
*
* @param string $tab DB-Tabelle
* @return array Tabellenfeld-Informationen Index = Feldname, Wert = Feldlänge
*/
public function listField($tab) {
$array = array();
/*$this->disconnect();
$this->connect();*/
if (is_resource($this->connection)) {
if (is_resource($this->result)) {
mysql_free_result($this->result);
}
$this->result = mysql_list_fields($this->db, $tab) or die(mysql_error());
for($f = 0; $f < mysql_num_fields($this->result); $f++)
{
$array[mysql_field_name($this->result, $f)] = mysql_field_len($this->result, $f);
}
}
return $array;
}
/**
* automatische Trennung der Datenbank-Verbindung
*
*/
public function __destruct() {
$this->disconnect();
}
}
Rufe ich die Methode listField() als erstes auf. Werden alle Feldlängen richtig ausgegeben.
Wird sie aber nach einer anderen Methode z.Bsp. query() werden sie falsch ausgegeben.
richtig
PHP-Code:
require_once('../cms/php/mysql_db.php');
$db = new DB_MySQL;
$felder = $db->listField('de_nav');
foreach($felder as $key => $val)
{
print $key.' => '.$val."<br>\n";
}
Ausgabe:
id => 2
txt => 20
datei => 50
platz => 2
fsp => 4
templ => 30
aktiv => 1
falsch
PHP-Code:
require_once('../cms/php/mysql_db.php');
$db = new DB_MySQL;
$db->query("select count(*) from de_unav");
$db->sqlCount();
$felder = $db->listField('de_nav');
foreach($felder as $key => $val)
{
print $key.' => '.$val."<br>\n";
}
Ausgabe:
id => 2
txt => 60
datei => 150
platz => 2
fsp => 12
templ => 90
aktiv => 3