Portal > Foren > PHP > PHP-Programmierung > PDO:SQLITE - Unerklärliches Verhalten von bindParam
Antwort
 
Themen-Optionen
Alt 01.04.2008, 23:17 Nach oben    #1
Erfahrener Benutzer
 
Registriert seit: 12.06.2006
Beiträge: 196
Standard PDO:SQLITE - Unerklärliches Verhalten von bindParam

Hi,

ich such schon ohne Ende nach irgendeinem blöden Fehler, aber ich finde keinen ... könnt ihr mir helfen?

Vorweg: Ja, gibt einiges, was man im Code anprangern könnte, aber das führt nicht zur Lösung meines Problems .

Problem: Ich füge Daten in die DB (siehe index.php), aber es wird für jedes Feld nur '2' eingetragen.

Benutzer Code:
index.php
PHP-Code:
<?php

require_once('functions.php');


$db = new DB();

$newguest = array(
        
'name'    => 'Mustermann'
        
'surname' => 'Max'
        
'gender'  => 0
        
'locid'   => 1
        
'status'  => 2);

var_dump($newguest);

$newloc = array('name' => 'BG');

#$db->add('newloc', $newloc) or die('e1'); echo 'd1 ';

$db->add('newguest'$newguest) or die('e2'); echo 'd2 ';

$res $db->get('allguests') or die('e3');

var_dump($res); echo 'd3 ';

?>
(functions.php enthält __autoload() und in_array_deep())

DB.php:
PHP-Code:
<?php

class DB {
    
    
// DB's filename
    
private $filename 'glist.db';
    
    
// PDO instance
    
public $inst;
    
    
// possible statements
    #protected $stmts = array('select', 'update', 'insert', 'delete', 'create', 'drop');
    
const STMT0 'select';
    const 
STMT1 'update';
    const 
STMT2 'insert';
    const 
STMT3 'delete';
    const 
STMT4 'create';
    const 
STMT5 'drop';
    
    
// alias definitions
    
const SELECT 0;
    const 
SEL    0;
    const 
UPDATE 1;
    const 
SET    1;
    const 
INSERT 2;
    const 
INS    2;
    const 
DELETE 3;
    const 
DEL    3;
    const 
CREATE 4;
    const 
DROP   5;
    
    
    
// constructor
    
public function __construct($filename NULL) {
        
        if (!empty(
$filename))
            
$this->filename $filename;
        
        
$this->_connect();
        
        
$this->_init();
        
    }
    
    
// connect to db
    
protected function _connect() {
        
        try {
            
$this->inst = new PDO'sqlite:' realpath('.') . '/' $this->filename );
        }
        
        catch (
PDOException $e) {
            throw new 
Exception('Could not establish database connection (' $e->ErrorCode() . ':( ' $e->getMessage());
        }
        
        return 
true;
        
    }
    
    protected function 
_log($where$what$data) {
        
        
file_put_contents('log.txt'$where.'('.$what.':'.$this->_log_data($data).")\n\n"FILE_APPEND);
        
    }
    
    protected function 
_log_data($data$depth=0) {
        
$result gettype($data);
        if(
is_string($data))
            return 
$result.'~{'str_replace(array(chr(13),chr(10)), '\n'$data) .'}'//$new_text = str_replace(chr(13).chr(10), '\n', $original_text);
        
if(!is_array($data))
            return 
$result.'~{'.$data.'}';
        
$result .= '~'.++$depth.'(';
        foreach(
$data as $key => $val) {
            
$result .= '['.$key.'] => '.$this->_log_data($val$depth).', ';
        }
        return 
$result.')'.$depth.";\n";
    }
    
    
// load query string from file
    
protected function _load_query($filename) {
        
        
$fname './sql/' $filename '.sql';
        
$this->_log(__METHOD__'fname'$fname);
        return 
trim(file_get_contents$fname ));
        
    }
    
    
// execute a predefined query
    
protected function _query($name$stmtype 0$args=array()) {
        
        
$filename = ((is_int($stmtype)) ? constant('self::STMT'.$stmtype) : '') . '_' $name;
        
$this->_log(__METHOD__'params'$name.'.'.$stmtype.'>'.$filename);
        
        
$query $this->_load_query($filename);
        
        if (!
$query)
            throw new 
Exception('Could not load query file: '.$filename);
        
        
$stmt $this->execute($query$args);
        
        if(!
$stmt)
            throw new 
Exception('Could not execute statement: '.$query);
        
        if(
$stmtype === self::SELECT) {
            
$result = (sizeof($res $stmt->fetchAll()) > 0) ? $res 0;
            
$this->_log(__METHOD__'result'$result);
            return 
$result;
        }
        
        else {
            
$result $stmt->rowCount();
            
$this->_log(__METHOD__'result'$result);
            return 
$result;
        }
        
    }
    
    
// execute any query
    
public function execute($query$args = array()) {
        
        
$stmt $this->inst->prepare($query);
        
$this->_log(__METHOD__'query'$query.'>'.($stmt instanceof PDOStatement));
        
        
$stmt->setFetchMode(PDO::FETCH_ASSOC);
        
        if (!
$stmt
            throw new 
Exception('Could not prepare statement: ' var_dump($this->inst->errorInfo()));
        
        if (
sizeof($args) > 0) {
            foreach(
$args as $var => $data) {
                
                
// safety? NO!
                
if(is_int($data))
                  
$type PDO::pARAM_INT;
                else
                    
$type PDO::pARAM_STR;
                
                
$var ':'.$var;
                
                
$this->_log(__METHOD__'bindparam''>'.$var.','.$data.',!'.$type);
                if(!
$stmt->bindParam($var$data))
                    throw new 
Exception('Could not bind param: ' "$var, $data, !$type" var_dump($this->inst->errorInfo()));
                
            }
        }
        
        if(!
$stmt->execute())
            throw new 
Exception('Could not execute statement: ' var_dump($this->inst->errorInfo()));
        
        return 
$stmt;
        
    }
    
    protected function 
_init() {
        
        
$res $this->_query('_initcheck');
        
        
$init 0;
        
        if (
$res === 0)
            
$init $init 1;
        
        if ( !
in_array_deep('glist'$res) )
            
$init $init 2;
        
        if ( !
in_array_deep('gloclist'$res) )
            
$init $init 4;
        
        if (
$init) {
            
$this->_log(__METHOD__'missmatch'$init);
            
$this->_query('init'NULL);
            
        }
        
    }
    
    
    
    
// custom funcs
    
public function get($using) {
        
        return 
$this->_query($using);
        
    }
    
    public function 
add($using$data=array()) {
        
        return 
$this->_query($usingself::INSERT$data);
        
    }
    
    
}

?>
Query-Dateien:
sql/insert_newguest.sql:
sql Code:
  1. INSERT INTO `glist` (
  2.   `name`,
  3.   `surname`,
  4.   `gender`,
  5.   `locid`,
  6.   `status`
  7. ) VALUES(
  8.   :name,
  9.   :surname,
  10.   :gender,
  11.   :locid,
  12.   :STATUS
  13. );
Alle Queries werden korrekt geladen.

Meine letzte Log:
Code:
DB::_query(params:string~{newguest.2>insert_newguest})

DB::_load_query(fname:string~{./sql/insert_newguest.sql})

DB::execute(query:string~{INSERT INTO `glist` (\n  `name`,\n  `surname`,\n  `gender`,\n  `locid`,\n  `status`\n) VALUES(\n  :name, \n  :surname, \n  :gender, \n  :locid, \n  :status\n);>1})

DB::execute(bindparam:string~{>:surname,Max,!})

DB::execute(bindparam:string~{>:gender,0,!})

DB::execute(bindparam:string~{>:locid,1,!})

DB::execute(bindparam:string~{>:status,2,!})

DB::_query(result:integer~{1})

DB::_query(params:string~{allguests.0>select_allguests})

DB::_load_query(fname:string~{./sql/select_allguests.sql})

DB::execute(query:string~{SELECT * FROM `glist`;>1})

DB::_query(params:string~{_initcheck.0>select__initcheck})

DB::_load_query(fname:string~{./sql/select__initcheck.sql})

DB::execute(query:string~{SELECT name FROM sqlite_master WHERE type = 'table';>1})

DB::_query(result:array~1([0] => array~2([name] => string~{glist}, )2;
, [1] => array~2([name] => string~{gloclist}, )2;
, )1;
)

DB::_query(params:string~{newguest.2>insert_newguest})

DB::_load_query(fname:string~{./sql/insert_newguest.sql})

DB::execute(query:string~{INSERT INTO `glist` (\n  `name`,\n  `surname`,\n  `gender`,\n  `locid`,\n  `status`\n) VALUES(\n  :name, \n  :surname, \n  :gender, \n  :locid, \n  :status\n);>1})

DB::execute(bindparam:string~{>:name,Mustermann,!2})

DB::execute(bindparam:string~{>:surname,Max,!2})

DB::execute(bindparam:string~{>:gender,0,!1})

DB::execute(bindparam:string~{>:locid,1,!1})

DB::execute(bindparam:string~{>:status,2,!1})

DB::_query(result:integer~{1})

DB::_query(params:string~{allguests.0>select_allguests})

DB::_load_query(fname:string~{./sql/select_allguests.sql})

DB::execute(query:string~{SELECT * FROM `glist`;>1})

DB::_query(result:array~1([0] => array~2([id] => string~{1}, [name] => string~{2}, [surname] => string~{2}, [gender] => string~{2}, [locid] => string~{2}, [status] => string~{2}, [added] => string~{2008-04-01 21:57:57}, )2;
, [1] => array~2([id] => string~{2}, [name] => string~{2}, [surname] => string~{2}, [gender] => string~{2}, [locid] => string~{2}, [status] => string~{2}, [added] => string~{2008-04-01 22:45:05}, )2;
, [2] => array~2([id] => string~{3}, [name] => string~{2}, [surname] => string~{2}, [gender] => string~{2}, [locid] => string~{2}, [status] => string~{2}, [added] => string~{2008-04-01 22:49:27}, )2;
, [3] => array~2([id] => string~{4}, [name] => string~{2}, [surname] => string~{2}, [gender] => string~{2}, [locid] => string~{2}, [status] => string~{2}, [added] => string~{2008-04-01 22:54:39}, )2;
, [4] => array~2([id] => string~{5}, [name] => string~{2}, [surname] => string~{2}, [gender] => string~{2}, [locid] => string~{2}, [status] => string~{2}, [added] => string~{2008-04-01 22:57:44}, )2;
, [5] => array~2([id] => string~{6}, [name] => string~{2}, [surname] => string~{2}, [gender] => string~{2}, [locid] => string~{2}, [status] => string~{2}, [added] => string~{2008-04-01 23:08:20}, )2;
, [6] => array~2([id] => string~{7}, [name] => string~{2}, [surname] => string~{2}, [gender] => string~{2}, [locid] => string~{2}, [status] => string~{2}, [added] => string~{2008-04-01 23:09:34}, )2;
, )1;
)
Das Problem taucht irgendwo in DB::execute() [$data wird erst dort verarbeitet] auf.

Beispielreihe in DB:
Zitat:
[0]=>
array(7) {
["id"]=>
string(1) "1"
["name"]=>
string(1) "2"
["surname"]=>
string(1) "2"
["gender"]=>
string(1) "2"
["locid"]=>
string(1) "2"
["status"]=>
string(1) "2"
["added"]=>
string(19) "2008-04-01 21:57:57"
}
Hab ich irgendwelche Zuweisungsfehler gemacht?


P.S.: Wie war gleich nochmal der Tag für SQL-Syntax-Highlighting?

Geändert von FloB (02.04.2008 um 13:33 Uhr).
FloB ist offline  
Add Post to del.icio.usBookmark Post in TechnoratiDiesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Alt 02.04.2008, 12:48 Nach oben    #2
Jann Hendrik Bekaan
 
Benutzerbild von Jann Hendrik
 
Registriert seit: 02.12.2004
Ort: Wildeshausen
Beiträge: 2.203
Standard

Auf eine Frage kann ich dir antworten

Der sql-highlight-tag lautet:
[highlight=sql]sql-code[/highlight]

Kannst du nicht mal protokollieren, welchen tag du ausführst?
__________________

Umfragen:
bitte beachten: Vorschläge für künftige Umfragen
Woher weißt du vom developers-guide?

Wenn du dich in ein interessantes Thema eingearbeitet hast, dann lass andere daran teilhaben! Schreibe ein Tutorial und beschreibe, wie es geht, was nicht klappt, wo man aufpassen muss usw.
Danke!
Jann Hendrik ist offline  
Add Post to del.icio.usBookmark Post in TechnoratiDiesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Alt 02.04.2008, 13:41 Nach oben    #3
Erfahrener Benutzer
 
Registriert seit: 12.06.2006
Beiträge: 196
Standard

Die Frage kapier ich nicht ganz. Was meinst du mit Tag?

Meinst du damit, welche Tags ersetzt werden? Das steht doch schon in der Log (->bindParam). Oder meinst du, wie der Query nach dem Ersetzen aussieht? Dazu habe ich noch keine Option gefunden.

Ach ja, Testsystem war WinXAMPPlite 1.6.4a. Upgraden will ich gerade nicht, da ich dieses Script eigentlich schon vor ein paar Tagen übergeben sollte, und das upgrade auf 1.6.6a kostet mich Zeit, da ich ein Problem mit den Pfaden hab ...

Ich sehe gerade im SQL-Syntaxhighlighting (btw, danke für den Tipp ), dass STATUS ein Schlüsselwort ist. Aber das wird ja eigentlich ersetzt, oder? Müsste PDO das nicht wie gewollt umsetzen (':' am Anfang = Parameter)? Ich probiers mal mit einer anderen Bezeichnung ...
FloB ist offline  
Add Post to del.icio.usBookmark Post in TechnoratiDiesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Alt 02.04.2008, 14:27 Nach oben    #4
Erfahrener Benutzer
 
Registriert seit: 12.06.2006
Beiträge: 196
Standard

Ändern von :status auf :stat bringt nix ...

Argh is doch alles %!§$*&!§
FloB ist offline  
Add Post to del.icio.usBookmark Post in TechnoratiDiesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Alt 03.04.2008, 13:56 Nach oben    #5
Jann Hendrik Bekaan
 
Benutzerbild von Jann Hendrik
 
Registriert seit: 02.12.2004
Ort: Wildeshausen
Beiträge: 2.203
Standard

Auf deine Fragen kann ich dir nicht wirklich antworten.
Nur soviel:
Ich meinte nicht tag, sondern query.

Du musst doch nachvollziehen können, ob am Ende auch der Query bei der DB angekommt, wie du dir das gedacht hast, oder?
__________________

Umfragen:
bitte beachten: Vorschläge für künftige Umfragen
Woher weißt du vom developers-guide?

Wenn du dich in ein interessantes Thema eingearbeitet hast, dann lass andere daran teilhaben! Schreibe ein Tutorial und beschreibe, wie es geht, was nicht klappt, wo man aufpassen muss usw.
Danke!
Jann Hendrik ist offline  
Add Post to del.icio.usBookmark Post in TechnoratiDiesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Alt 03.04.2008, 20:19 Nach oben    #6
Erfahrener Benutzer
 
Registriert seit: 12.06.2006
Beiträge: 196
Standard

Leider habe ich keine Funktion gefunden, die das überprüfen könnte ...

Ich habs mal temporär mit 'ner eigenen bindParam-Methode gelöst (mit str_replace).
FloB ist offline  
Add Post to del.icio.usBookmark Post in TechnoratiDiesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Antwort

Lesezeichen


Aktive Benutzer in diesem Thema: 1 (Registrierte Benutzer: 0, Gäste: 1)
 
Themen-Optionen

Forumregeln
Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus


Alle Zeitangaben in WEZ +2. Es ist jetzt 04:31 Uhr.


Powered by vBulletin® Version 3.7.3 (Deutsch)
Copyright ©2000 - 2008, Jelsoft Enterprises Ltd.
Search Engine Optimization by vBSEO 3.2.0

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44