Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/64.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 试图将对象传递给类会导致未设置变量_Php_Mysql - Fatal编程技术网

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

Php 试图将对象传递给类会导致未设置变量,php,mysql,Php,Mysql,我试图使用MySQLi类设置一个类来简化MySQLi查询。但是,当我将类设置为接受mysqli实例时,我收到以下错误: 未定义变量:第93行C:\wamp\www\inc\classes\ezsql.class.php中的dbobj 我以前从来没有真正做过依赖注入,加上我的编码技能现在还不具备,所以语法错误可能很多 以下是我创建的类: <?php /*/////////////////////////////////////////////////////////////////////

我试图使用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}" );
        }
    }
}
?>
任何和所有的帮助都将不胜感激,因为我不太清楚哪里出了问题

再一次,请记住我是依赖注入的新手。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()添加到某些位置。查看它们返回的内容。

检查您是否启用了mysqli扩展,或者只测试您是否可以在类外执行实例。 我们还可以看到,当您遇到此错误时,您是如何实例和使用您的类的

编辑


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

使用pdo包装器,例如:

然后在同一目录中,像这样添加settings.ini.php

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

我们可以这样称呼它:

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");
    }
}
我使用log4ppp进行日志记录。您可以使用此代码进行调整。 只需更改驱动程序的settings.ini.php,就可以帮助您对PDO支持的不同数据库使用相同的代码。

修复。 显然,我是个白痴,搞砸了几件事

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


不过,输入清理是我列表中的下一个问题。

如何实例化该类?看在上帝的份上,请摆脱这个类。为什么?我正试图为自己节省一点时间,因为我将在以后的代码中大量调用这些操作…你什么都不节省,代价是引入大量错误和漏洞。嗯。。。请详细解释一下。。?另外,请注意:我不是专业人士,这更像是一个实验。我在问题正文中添加了index.php(我称这个类的唯一地方)。至于MySQLi扩展,是的,据我所知,它是启用的。所有三个都按预期返回-MySQLi类的一个实例。但是,所有数据似乎都为空。不确定这是否正常。这是我得到的一个粘贴箱:
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");
    }
}