Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/396.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 mysqli类的问题_Php_Mysqli - Fatal编程技术网

PHP mysqli类的问题

PHP mysqli类的问题,php,mysqli,Php,Mysqli,我正在尝试将我的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 __const

我正在尝试将我的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();
我测试的结果如下所示:

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函数。有什么原因吗?谢谢。

您的SQL类有多个问题

从末尾开始:构造函数从不返回任何内容<代码>返回$connection不起任何作用。移除它

然后您正在使用多个未声明的类属性:
$this->use\u pconnect
$this->db\u host
等。您是在代码中省略了它们,还是它们真的不存在?这也将是一个错误

另外,您正在调用一些代码中也不存在的方法,如
$this->sql\u handle\u errors()

您应该能够避免在这一行中使用过程样式:
if(!mysqli\u set\u charset($this->connection,CONFIG\u charset))
应该是
if(!$this->connection->set\u charset(CONFIG\u charset))
,因为这是正确的面向对象样式

最后但并非最不重要的一点是:您对类的使用率不高。基本上,您可以使用它来创建
mysqli
的实例,然后希望始终使用该实例。虽然这本身并不坏,但这样做并没有真正的价值,因为在
mysqli
之上通常需要的所有东西都需要包装这个实例,而不是公开它并直接使用它


最后一个提示:您应该学会调试。使用
var\u dump()
查看变量中的值类型。转储
$sql->connection->prepare()
的返回值,查看它是否是
mysqli\u stmt
的实例。

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

class sql  

及 从SQL类创建新实例

$sql = new sql(//);
$result .../////

你提到的所有关于不在课堂上的东西都在里面,我只是把它拿了出来,这样你们就可以少读了。谢谢你的意见。你建议用哪种方式使这个类工作,这样我至少可以在站点的任何地方使用
$sql
作为全局变量。感谢mate
var_dump
这样告诉我:
boolean false
出了问题,错误没有得到处理。这就是我对您使用原始mysqli实例的意思。您应该在自己的类中编写一个方法
prepare()
,该方法将SQL传递给内部mysqli实例,并检查错误并为您处理。如果没有错误,最好不要返回原始的mysqli_stmt对象,而是返回另一个可以进一步帮助您的包装对象。除此之外:在属性中硬编码配置并没有多大帮助,因为您无法在实例化之前更改它们,而且为时已晚。请告诉我如何正确执行此操作?谢谢一些例子:我刚刚尝试了这个,但仍然得到了同样的错误(这是您的整个类定义吗?您在哪里定义了db_host和其他变量?它们在类中定义为
private
所有连接和工作,因为我的db系统在没有准备语句的情况下工作,现在我正试图将类转换为准备好的语句。请参阅上面编辑的代码mate。我重做了类和d使用这种方法在准备陈述后,您是否检查了错误?