我正在尝试将我的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函数。有什么理由吗?感谢。
答案 0 :(得分: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
的实例。
答案 1 :(得分:0)
如果整个代码在上面并且你想从mysql make下面做一个继承类改变:
class sql
到
class sql extends mysqli
和 从sql类创建一个新实例
$sql = new sql(//);
$result .../////
好锁