尝试将对象传递给类会导致未设置的变量

时间:2014-06-14 20:02:04

标签: php mysql

我正在尝试使用mysqli类建立一个简化MySQLi查询的类。但是,当我将我的类设置为接受mysqli的实例时,我收到此错误:

  

未定义的变量:第93行的C:\ wamp \ www \ inc \ classes \ ezsql.class.php中的dbobj

我之前从未真正完成过依赖注入,而且今天我的编码技巧并不适合我,所以语法错误可能很多。

这是我创建的课程:

<?php

/*/////////////////////////////////////////////////////////////////////////////////////////////

EZSQL

A PHP class that utilizes the PDO MySQLi DB class to make database querying easier and quicker.

/////////////////////////////////////////////////////////////////////////////////////////////*/

class EZSQL {
    public $dbobj;

    public function __construct( mysqli $dbobject ) {
        echo "var_dunp before making this->dbobj\n";
        var_dump( $dbobj );
        if ( is_object( $dbobject ) ) {
            $this->dbobj = $dbobject;
        } else {
            // Just in case...
            die( "EZSQL Error #0: EZSQL must be initialized with a PDO MySQLi DB instance." );
        }
        echo "var_dunp after making this->dbobj\n";
        var_dump( $this->dbobj );
    }

    public function select( $exp, $table, $where ) {
        // Make $where optional
        if ( isset( $where ) ) {
            $queryString = "SELECT {$exp} FROM {$table} WHERE {$where}";
        } else {
            $queryString = "SELECT {$exp} FROM {$table}";
        }

        if ( $returnObj = $this->dbobj->query( $queryString ) ) {
            $return = $returnObj->fetch_assoc();
            return $return;
        } else {
            // Some error handling
            die( "[EZSQL]: SQL SELECT query error #{$this->dbobj->errno}: {$this->dbobj->error}" );
        }
    }

    public function insert( $tab, $cols, $values ) {
        // Create the general query string format
        $queryString = "INSERT INTO {$tab} (";
        $colsCt = count( $cols );
        foreach ( $cols as $key=>$col ) {
            if ( $key != ( $colsCt - 1 ) ) {
                $queryString .= "{$col}, ";
            } else {
                $queryString .= "{$col})";
            }
        }

        // More general formatting
        $queryString .= " VALUES (";
        $valCt = count( $values );
        foreach( $values as $key=>$value ) {
            if ( $key != ( $valCt - 1 ) ) {
                $queryString .= "{$value}, ";
            } else {
                $queryString .= "{$value})";
            }
        }

        if ( $query = $this->dbobj->prepare( $queryString ) ) {
            $query->execute();
        } else {
            die( "[EZSQL]: SQL INSERT query prepare error #{$this->dbobj->errno}: {$this->dbobj->error}" );
        }
    }

    public function createTable( $name, $ino, $colData ) {
        // Create the general query string format
        $queryString = "CREATE TABLE";
        if ( $ino ) {
            $queryString .= " IF NOT EXISTS";
        }
        $queryString .= " {$name}";

        $colCt = count( $colData );

        $queryString .= " (";

        $iter = 1;

        foreach ( $colData as $name=>$type ) {
            $iter++;
            if ( $iter != ( $colCt ) ) {
                $queryString .= " {$name} {$type},";
            } else {
                $queryString .= " {$name} {$type});";
            }
        }

        if ( !$this->dbobj->query( $queryString ) ) {
            die( "[EZSQL]: SQL CREATE TABLE query error #{$this->dbobj->errno}: {$this->dbobj->error}" );
        }
    }
}
?>

第93行包含在createTable函数中,特别是if语句:

if ( !$this->dbobj->query( $queryString ) ) {
     die( "[EZSQL]: SQL CREATE TABLE query error #{$this->dbobj->errno}: {$this->dbobj->error}" );
}

我将非常感谢任何和所有的帮助,因为我无法正确地说出错误。

再次,请记住我是依赖注入的新手。 PHP中的语法错误对我来说并不罕见。

感谢。

编辑1:以下是我在index.php页面中使用的连接:

<?php
require( "inc/classes/ezsql.class.php" );
// require( "inc/config.php" );
// require( "inc/proc/db.php" );

$host = "127.0.0.1";
$user = "root";
$pass = "";
$db = "testdb";
$port = "3306";

$db = new mysqli( $host, $user, $pass, $db, $port );

echo "var_dunp before creating instance of EZSQL\n";
var_dump( $db );

if ( !$db ) {
    die( "error" );
}

$ezsql = new EZSQL( $db );

$cols = array(
    "int" => "int",
    "text" => "varchar(255)"
    );

$ezsql->createTable( "test1", TRUE, $cols );
?>

编辑2:将var_dump()添加到某些位置。请参阅this Pastebin了解他们返回的内容。

3 个答案:

答案 0 :(得分:1)

使用如下的pdo包装器:

http://pastebin.com/AHdJkCBz

然后在同一目录中添加settings.ini.php,如http://pastebin.com/cu1kY8kL

不要将此设置文件提交到存储库。始终复制并粘贴它。

调用它的方法是:

function checkPassword($email, $password)
{
    $db = new db();
    $binding = array('emailId'=>$email, 'hashed_password'=>md5($password));
    return $db->single("SELECT id FROM members WHERE pc_address = :emailId AND hashed_password = :hashed_password", $binding);
}

检查整个班级的详细方法。

我还制作了两个通用函数来添加/更新数据库。

function assetsUtilInsert($table, $params, $debug=false){
    $db = new db();
    if($table && is_array($params)){
        $bindings = $params;
        if(!empty($bindings)) {
            $fields = array_keys($bindings);
            $fieldsvals = array(implode(",",$fields),":" . implode(",:",$fields));
            $sql = "INSERT INTO ".$table." (".$fieldsvals[0].") VALUES (".$fieldsvals[1].")";
        }
        if($debug==true)
            echo $sql;
        $result = $db->query($sql,$bindings);
        return $db->lastInsertId();
    } else {
        assetsUtilInvokeError($this->registry->log, "Could not insert because either table does not exist or parameters is not an array");
    }
}

function assetsUtilUpdate($table, $params, $where, $exit=0){

    $db = new db();
    $sql = '';
    if($table && is_array($params) && is_array($where)){
        $sql = "UPDATE $table SET ";
        foreach($params as $key => $val){
            $sql .= $key ."=:$key, ";
        }
        unset($key); unset($val);
        $sql = substr($sql, 0, (strlen($sql)-2));
        $sql .= " WHERE ";
        foreach($where as $key => $val){
            $sql .= $key ."=:$key AND ";
        }
        unset($key); unset($val);
        $bindings = array_merge($params, $where);
        unset($params); unset($where);
        $sql = substr($sql, 0, (strlen($sql)-4));
        if($exit==1){
            echo $sql; exit;
        }
        return $db->query($sql, $bindings);
    } else {
        assetsUtilInvokeError($this->registry->log, "Could not insert because either table does not exist or params is not an array or where condition is not an array");
    }
}

我使用log4php进行日志记录。您可以使用此代码进行调整。 只需更改驱动程序的settings.ini.php就可以帮助您为PDO支持的不同数据库使用相同的代码。

答案 1 :(得分:0)

固定。 显然,我是个白痴,搞砸了一些东西。

感谢您的建议,但我不是专业的,所以我不关心此时的注射攻击。所有这些都是在本地托管而不是端口转发,因此这些数据都不重要。

但我的列表中接下来是输入清理。

答案 2 :(得分:-1)

检查您是否启用了mysqli扩展程序,或者只测试您是否可以在课堂外部实例化。 当您收到此错误时,我们也可以看到您如何实例化并使用您的类。

修改

传递给构造函数时,使用var_dump()检查mysqli对象。