kostenloser Webspace werbefrei: lima-city


OOP prepared statements "prepare"-Fehler

lima-cityForumProgrammiersprachenPHP, MySQL & .htaccess

  1. Autor dieses Themas

    xxxparenjxxx

    xxxparenjxxx hat kostenlosen Webspace.

    Hallo,
    ich versuche momentan ein Loginscript im OOP Stil zu schreiben.
    Natürlich will ich hierfür auch die prepared statements, die mysqli bietet, nutzen.
    Ich bekomme zwar eine Datenbankverbindung hergestellt. Jedoch werden Fehler ausgespuckt wenn ich folgenden code schreibe:

    Anmerkung:
    Für '-host-', '-usr-', ' -pwd-', '-db-' sind die richtigen Verbindungsdaten angegeben.


    Model.php (wird direkt in der index.php included)
    class Model {
    
        function __construct() {
            $this->db = new Database('-host-', '-usr-', ' -pwd-', '-db-');
            
        }
    }


    Database.php
    class Database extends mysqli {
        public function __construct($host, $user, $password, $database) {
            parent::__construct();
        }
        public function prepare($query) {
            parent::prepare($query);     // line 8
        }
    }


    login_model.php
    class Login_Model extends Model{
        public function __construct() {
            parent::__construct();
        }
        
        public function run(){
            
            $login      = $_POST['login'];
            $password   = $_POST['password'];
            
            $stmt = $this->db->prepare("SELECT `username`, `password` FROM `member` 
                               WHERE `username` = ? AND `password` = ?");
            
            $stmt->db->bind_param("ss", $login, $password);   // line 16
            $stmt->db->execute();
        } 
    }


    Nun bekomme ich folgende Fehlermeldungen wenn ich das Formular auf der Webseite abschicke:

    Warning: mysqli::prepare(): invalid object or resource Database in /pfad.../Database.php on line 8

    Fatal error: Call to undefined method Database::bind_param() in /pfad.../login_model.php on line 16


    Nun bei bind_param müsste die Fehlermeldung daran liegen dass die mysqli Classe diese Methode garnicht enthält.
    bind_param liegt lt. dem Dokument in NetBeans in der mysqli_stmt Classe.

    Warum funktioniert aber mein prepare nicht?
    Wenn mein englisch nicht komplett versagt, will die Fehlermeldung mir sagen dass mysqli::prepare() über ein ungültiges Objekt verfügt. Nur, was soll ich da anderes eingeben?

    Hoffe auf eure Hilfe.
    mfg, Michl
  2. Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!

    lima-city: Gratis werbefreier Webspace für deine eigene Homepage

  3. klar. wie man prepared statement macht steht hier, z.b. im beispiel 1.
    die betroffene stelle ist
    $stmt =  $mysqli->stmt_init();
    if ($stmt->prepare("SELECT District FROM City WHERE Name=?")) {
      ...
    }
    bei dir ist die wariable $stmt kein object.
  4. Autor dieses Themas

    xxxparenjxxx

    xxxparenjxxx hat kostenlosen Webspace.

    Hi,
    danke für die Antwort habe mir das vorher auch schon angeschaut, aber da ist zwar ein Beispiel zu einer selbst erstellten db-Classe die aber nicht von mysqli erbt.
    Habe jetzt meinen code ein wenig verändert und $stmt ist nun ein objekt (Oder habe ich falsches Verständnis davon was ein Objekt sein soll?)
    Fehler ist trotzdem vorhanden:

    Warning: mysqli::stmt_init(): invalid object or resource Database in /pfad.../Database.php on line 8

    Database.php
    class Database extends mysqli {
        public function __construct($host, $user, $password, $database) {
            parent::__construct();
        }
        public function stmt_init() {
            parent::stmt_init(); // line 8
        }
    }


    Model.php
    Ist genauso geblieben wie vorher.

    login_model.php
    class Login_Model extends Model{
        public function __construct() {
            parent::__construct();
        }
        
        public function run(){
            
            $login      = $_POST['login'];
            $password   = $_POST['password'];
            
            $query = ("SELECT `username`, `password` FROM `member` 
                               WHERE `username` = ? AND `password` = ?");
            
            $stmt = $this->db->stmt_init();
            
            if($stmt->prepare($query)){
                
                $stmt->bind_param("ss", $login, $password);
                $stmt->execute();
                
            }
            
            
            
        } 
    }


    Der Fehler scheint irgendwie an dem parent::stmt_init(); zu liegen.
    Ich finde aber nirgendwo eine info was genau das parent::stmt_init() macht.

    mfg, Michl
  5. also ok! ich wollte schon eher sagen, mir kommen deine 3 progteile eh schleierhaft vor. daher schlage ich dir das mal vor (natürlich nicht ausgearbeitet und nur bis zum ursprünglichen problem verfolgbar):
    index.php
    <?php
    /**
     *  10.0.0.4/_forum/xxxparenjxxx/index.php
     *  czibere.lima-city.de/_forum/xxxparenjxxx/index.php
     */
    
    // zeigt eventuell daten als entwicklungshilfe an [(bool)1]
    // oder eben nicht [(bool)0]
    $dev = (bool)1;
    
    // error_reporting ein/aus-schalten [(bool)1 / (bool)0]
    error_reporting(((bool)1) ? (E_ALL | E_STRICT): 0);
    
    // init app
    require_once './CLogin.php';
    $d     = null;            // @d - databasename (must du anpassen)
    $login = new CLogin($d);  // instantiate class
    
    // ...
    
    // nur funktionstest (siehe __toString()::__toString())
    $login->_q('SHOW DATABASES');
    
    // testergebnis zeigen wenn ($dev === true)
    $content = ($dev) ? $login: 'Done.';
    exit(<<< EOT
    <!DOCTYPE html>
      <head>
        <meta charset="utf-8"/>
        <title>mysqli :: \$stmt->prepare</title>
      </head>
      <body>
    $content
      </body>
    </html>
    EOT
    );

    CLogin.php
    <?php
    require_once './CDatabase.php';
    
    class CLogin extends CDatabase {
      public $user = null;
    
      // @d - databases
      public function __construct($d = null) {
        // parent ist CDatabase
        parent::__construct($d);
    
        // du musst es wissen, wie es hier weitergeht
        // ...
      }
    
      // ...
    
      // nur für devel und debug, siehe index.php zeile 24
      public function __toString() {
        return '<pre><strong>' . __CLASS__ . ':</strong><br />' .
          '$this->user:' . $this->user . '<br />' .
          print_r($this, true) . '<hr />' .
          // print_r($GLOBALS, true) . '<hr />' .
          '<strong>Includes:</strong>' . print_r(get_included_files(), true) . '</pre>';
      }
    }

    CDatabase.php
    <?php
    
    // !!!! db_data.php editieren !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
    require_once './db_data.php'; // nach bedarf pfad ändern
    
    class CDatabase extends mysqli {
    
      // @d - databasename
      public function __construct($d = null) {
        global $h, $u, $p;
        // parent ist mysqli !
        parent::__construct($h, $u, $p, $d);
        // wenn nix geht (sollte anders gestaltet werden! [kein exit] ;)
        if(mysqli_connect_errno()) {
          exit('<h5>' . mysqli_connect_error());
        }
      }
    
      // die query function: @q - query
      public function _q($q) {
        $stmt = $this->stmt_init();
        if ($stmt->prepare($q)) {
          // ... hier geht es weiter mit
          // $stmt->bind_param(... ????);
          // $stmt->execute();
          // $stmt->bind_result(????);
          // $stmt->fetch();
          // ausgabe ...
          $stmt->close();
        }
      }
    }

    der rest gehört - zum teil - in die CLogin klasse.
    diese combo kommt mit $stmt->prepare('query') klar. (die query im kode ist natürlich eine alibi handlung, irgendwie muss ja die funktionfähigkeit demonstriert werden ;)

    Beitrag zuletzt geändert: 9.6.2013 15:29:55 von czibere
  6. Autor dieses Themas

    xxxparenjxxx

    xxxparenjxxx hat kostenlosen Webspace.

    Danke für deinen Lösungsvorschlag, habe ihn leder nicht verstanden...
    Das Problem jetzt aber trotzdem gelöst.
    Es lag an der Datenbankverbindung.
    Habe noch ein mysqli_connect_errno() eingefügt, Fehler in Logindaten eingebaut und es wurde trotz Fehlerhafter Datenbankverbindung kein Fehler angezeigt.
    Datenbankverbindung korrekt hergestellt und schon funktioniert alles.
    Trotzdem vielen Dank für die Mühe :)
    mfg, Michl
  7. Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!

    lima-city: Gratis werbefreier Webspace für deine eigene Homepage

Dir gefällt dieses Thema?

Über lima-city

Login zum Webhosting ohne Werbung!