Es un error de alcance. Está haciendo $DBH
una variable global. Entonces, cuando ingresas a la función, la variable global no está disponible. Tienes 5 opciones reales.
1. Usar la palabra clave mundial
function doSomething() {
global $DBH;
//...
Esto no es una buena idea, ya que hace que el mantenimiento y prueba de un PITA. Imagina intentar depurar esa llamada de función. Ahora tiene que ir a averiguar dónde $DBH
se define para tratar de averiguar lo que está pasando ...
2. Hacer $DBH
un parámetro a la función
function doSomething(MySQLi $DBH) {
Tiene la ventaja de ser explícito. Pero todavía no es excelente, ya que el código de llamada necesita realizar un seguimiento de la variable global.
3. Crear una función para "obtener" el objeto $DBH
function getDBH() {
static $DBH = null;
if (is_null($DBH)) {
$DBH = new mysqli(...);
}
return $DBH;
}
function doSomething() {
$DBH = getDBH();
}
Esto tiene la ventaja de moverse por el problema variable global completo. Pero también es difícil tener conexiones múltiples o reutilizar cualquiera de los códigos para otras conexiones.
4. Crear una clase para envolver el acceso de base de datos
class Database {
public function __construct($host, $user, $pass) {
$this->DBH = new MySQli($host, $user, $pass);
}
public function doSOmething() {
$this->DBH->foo();
}
}
Esto encapsula todo para usted. Todo el acceso a la base de datos pasará por una única clase, por lo que no tendrá que preocuparse por el acceso variable global o cualquier otra cosa.
5. Utilice una clase/marco pre-construidos
esta es la mejor opción, ya que no es necesario que preocuparse de hacerlo usted mismo.
clases de base de datos de acceso:
marcos completos:
Realmente, las opciones son infinitas. Encuentre algo que le guste y quédese con él. Realmente hará tu vida más fácil ...
¡Buena suerte!
+1 Bonito conjunto de opciones. –
no funcionó para mí: http://stackoverflow.com/questions/40080426/fatal-error-call-to-a-member-function-prepare-on-a-non-object-in-but-value – fresher