variable utilizar pasar insertar funciones datos como php mysqli prepared-statement

utilizar - Llamada a una función miembro prepare() en una Ayuda PHP no objeto



pasar variable laravel a javascript (8)

Estoy tratando de escribir una función PHP. Es muy simple. Es solo una declaración preparada que consulta la base de datos, pero no puedo hacer que funcione. Sigo recibiendo el error Llamar a una función de miembro prepare () en un no objeto. aquí está el código:

$DBH = new mysqli("host", "test", "123456", "dbname"); function selectInfo($limit, $offset){ $stmt = $DBH->prepare("SELECT * FROM information LIMIT ?,?"); $stmt->bind_param("ii", $limit, $offset); $stmt->execute(); } selectInfo();

Cada vez que llamo a la función, obtengo ese error. ¿Puede ayudarme alguien, por favor?


Asegúrate de que la conexión sea exitosa.

$DBH = @new mysqli("host", "test", "123456", "dbname"); if ($DBH->connect_errno) { die(''Connect Error: '' . $DBH->connect_errno); }

o

$DBH = @mysqli_connect("host", "test", "123456", "dbname"); if (!$DBH ) { die(''Connect Error: '' . mysqli_connect_errno()); }


Intenta agregar global $DBH; en la función, o agregarlo a los parámetros de la función.


Es un error de alcance. Estás haciendo $DBH una variable global. Entonces, cuando ingresas a la función, la variable global no está disponible. Tienes 5 opciones reales.

1. Use la palabra clave global

function doSomething() { global $DBH; //...

Esta no es una buena idea, ya que hace que el mantenimiento y las pruebas sean un PITA. Imagina intentar depurar esa llamada de función. Ahora necesita averiguar dónde se define $DBH para tratar de descubrir qué está pasando ...

2. Haga $DBH un parámetro para 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. Crea 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 sortear por completo el problema de la variable global. Pero también es difícil tener conexiones múltiples o reutilizar cualquiera de los códigos para otras conexiones.

4. Cree una clase para ajustar el acceso a la 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 ti. 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 ni por ninguna otra cosa.

5. Usa una clase / marco preconstruido

Esta es la mejor opción, ya que no necesita preocuparse por hacerlo usted mismo.

Clases de acceso a la base de datos:

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!


Eso es simplemente. $DBH no existe dentro de la función selectInfo() . La variable definida en el alcance global no será visible dentro de la función y viceversa. Lea más sobre el alcance de las variables en las páginas del manual.

¿Cómo resolverlo? Pase esa variable como argumento de la función:

$dbh = new MySQLi(...); function selectInfo(MySQLi $dbh, $limit, $offset) { $stmt = $dbh->prepare(...); ... }


selectInfo($DBH); function selectInfo($DBH,$limit, $offset){ $stmt = $DBH->prepare("SELECT * FROM information LIMIT ?,?"); $stmt->bind_param("ii", $limit, $offset); $stmt->execute(); }


Hacer que $ DBH global no sea saludable ... excepto que puede proteger su $ DBH en clase y establecerlo en nulo ... y usarlo ...


class PDOconnect extends PDO{

protected $ con = null;

public function __construct(){ try { $this->con= new PDO( DB_DSN, DB_USERNAME, DB_PASSWORD ); //our new PDO Object $this->con->setAttribute( PDO::ATTR_ERRMODE, PDO::ERRMODE_SILENT ); $this->con->setAttribute( PDO::ATTR_ERRMODE, PDO::ERRMODE_WARNING ); $this->con->setAttribute( PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION ); echo "hi.. you are connected succcessfully..."; }


$DBH no está en el alcance. O desea definir $DBH como global en la función:

$DBH = new mysqli("host", "test", "123456", "dbname"); function selectInfo($limit, $offset){ global $DBH; $stmt = $DBH->prepare("SELECT * FROM information LIMIT ?,?"); $stmt->bind_param("ii", $limit, $offset); $stmt->execute(); }

o como ircmaxell señaló en su excelente respuesta, tiene una función que devuelve una instancia estática de $DBH .