-2

我正在尝试将我的 sql 类转换为更合适的类。类构造函数如下所示:

class sql{

private $db_name = CONFIG_DB_NAME;
private $db_user = CONFIG_DB_USER;
private $db_pass = CONFIG_DB_PASS;      
private $db_host = CONFIG_DB_HOST;
private $use_pconnect = CONFIG_DB_USEP;


function __construct(){

    if($this->use_pconnect){

        $connection = new mysqli('p:'.$this->db_host, $this->db_user, $this->db_pass, $this->db_name);
    }else{

        $connection = new mysqli($this->db_host, $this->db_user, $this->db_pass, $this->db_name);
    }   

    if($connection->connect_errno){

        $this->sql_handle_errors($connection->connect_error, __FILE__, __LINE__);
        exit();
    }

    $this->connection = $connection;

    // Set DB charset
    if(!mysqli_set_charset($this->connection, CONFIG_CHARSET)){

        $this->sql_handle_errors(mysqli_error($this->connection), __FILE__, __LINE__);
    }

    if(file_exists(PATH_LOGS.'sql.txt')){

        $this->test_query = true;
    }
}
}

$sql = new sql;

我正在测试的结果如下所示:

$result = $sql->connection->prepare("SELECT * FROM admin WHERE id = :id LIMIT 1");
$result->bind_param(':id', '1');
$result->execute();
$result->store_result();
$result->fetch();

它说的 bind_param 函数找不到。有什么理由吗?谢谢。

4

2 回答 2

1

您的 SQL 类有多个问题。

从最后开始:构造函数永远不会返回任何东西!return $connection;没有任何目的。去掉它。

然后您正在使用多个未声明的类属性:$this->use_pconnect$this->db_host。您是否在代码中省略了它们,或者它们真的不存在?那也将是一个错误。

此外,您正在调用代码中也不存在的几种方法,例如$this->sql_handle_errors().

您应该能够避免在这一行中使用程序风格:if(!mysqli_set_charset($this->connection, CONFIG_CHARSET))应该是if(!$this->connection->set_charset(CONFIG_CHARSET)),因为那是正确的面向对象风格。

最后但并非最不重要的一点是:您对班级的使用不是很好。基本上,您使用它来创建 的实例mysqli,然后希望始终使用该实例。虽然这本身还不错,但这样做并没有真正的价值,因为您通常想要的所有东西都mysqli需要包装这个实例,而不是暴露它并直接使用它。

最后一个提示:你应该学会调试。用于var_dump()查看变量内部的值类型。转储返回值$sql->connection->prepare()以查看它是否是实例mysqli_stmt

于 2013-10-15T23:32:02.580 回答
0

如果整个代码都在上面,并且您想从 MySQL 创建一个继承类,请进行以下更改:

class sql  

class sql extends mysqli

并从 SQL 类创建一个新实例

$sql = new sql(//);
$result .../////
于 2013-10-15T23:42:04.113 回答