在PHP中执行预准备语句时遇到问题。我的主要目标是创建两个类,第一个用于连接(Conexion)到服务器和数据库,第二个用于做准备语句(RealizarConsultas)。
我已经决定用于执行语句的类应该继承自" Conexion"。通过这样做,我每次使用函数" RealizarConsultas :: MostrarConsulta()"时都假装连接数据库。这个函数应该与数据库连接,然后它应该执行准备好的语句,最后它应该关闭连接。
用于连接的类。
<?php
class Conexion extends PDO{
protected $conexionDb;
public function Conexion(){
try{
$conexionDb=new PDO ('mysql:host=localhost;dbname=euroburo','root','');
$conexionDb->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
$conexionDb->exec("SET CHARACTER SET utf8");
}catch(Exception $e){
echo "Error: ".$e->getLine();
}
}
public function stopConexion(){
$conexionDb->close();
}
}
?>
用于准备语句的类。
<?php
require("conexion.php");
class RealizarConsulta extends Conexion{
public function RealizarConsulta(){
parent::__construct();
}
public function MostrarConsulta($consulta){
$resultado=$this->conexionDb->prepare($consulta);
$resultado->execute();
$final = $resultado->fetch(PDO::FETCH_ASSOC);
print_r($final);
$this->stopConexion();
}
}
?>
我的主要问题在于这一行,位于&#34; RealizarConsulta :: MostrarConsulta()&#34;。
$resultado=$this->conexionDb->prepare($consulta);
每次我调用函数(RealizarConsulta :: MostrarConsulta());
出现此错误:在非对象上调用成员函数prepare()。
我知道这个错误告诉我$ this-&gt; conexionDb不是一个对象,但我不明白为什么。我不理解错误的原因是$ conexionDb是在父类中创建的受保护变量,作为受保护变量&#34; RealizarConsulta&#34; class应该没有任何问题地继承它,我应该可以访问它。您可以看到$ conexionDb在调用constuctor时初始化,它应该保存与连接相关的信息。
正如您可以通过我的推理看到的那样,$ conexionDb应该是对属于&#34; Conexion&#34;的对象的引用。我和我应该可以在&#34; RealizarConsulta&#34;类。
我想知道我失败了什么,如何解决错误。感谢
答案 0 :(得分:0)
您正在声明您的类级别变量,但除非您省略某些代码,否则您不会将本地变量分配给类级别。在PHP中,您必须这样做。例如
class A {
protected $a;
public function __construct() {
$this->a = 'Hello';
}
public function echo() {
$a = 'World';
echo $this->a . ' ' . $a;
}
}
$a = new A();
$a->echo()
将回复Hello World
。这是因为在echo()
中,$a
是一个局部变量,而$this->a
是一个作用于该类的变量。它们是两个不同的变量,包含两个不同的值。
所以你的构造函数看起来应该是这样的
public function __construct() {
try {
$conexionDb= new PDO('mysql:host=localhost;dbname=euroburo', 'root', '');
$conexionDb->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
$conexionDb->exec("SET CHARACTER SET utf8");
$this->conexionDb = $conexionDb;
} catch(Exception $e) {
echo "Error: ".$e->getLine();
}
}
另外,作为旁注,强烈建议在PHP中使用public function __construct()
作为构造函数,而不是与类同名的函数