En PHP 4, las variables generalmente se declaran usando var, mientras que en PHP 5, puede usar las funciones de programación orientada a objetos (OOP) para personalizar la visibilidad de los datos, es decir, la accesibilidad aquí es muy similar al alcance de las variables. , pero proporciona un mejor mecanismo de control, hay tres tipos de modificadores de visibilidad:
Público (predeterminado): se puede acceder a las variables o modificarlas en el ámbito global.
Protegido: solo se puede acceder a las variables o modificarlas dentro de la propia clase y en clases derivadas directamente (mediante la instrucción extends).
Privado: solo se puede acceder a las variables o modificarlas dentro de la clase.
Al igual que las implementaciones de interfaces, violar estas reglas en un programa dará lugar a errores graves y, al igual que las interfaces, existen únicamente para comodidad de los programadores; Pero esto no significa que puedan ignorarse. Especificar la visibilidad de una determinada variable miembro de clase puede proteger los datos dentro del objeto de influencias externas.
Supongamos que hay una clase MySqlDB y una variable $link está declarada privada en ella, lo que significa que solo se puede acceder a esta variable desde dentro del objeto usando la variable $this. Esto evita la sobrescritura accidental por parte de otros objetos o funciones fuera de la clase. , usaremos el atributo de visibilidad para ayudarnos a crear un objeto de consulta.
Puede pensar en una consulta como una entidad separada que se puede ejecutar y devolver resultados. Algunos sistemas de bases de datos también tienen procedimientos almacenados. Los procedimientos almacenados son muy similares a las funciones. Almacenan declaraciones de consulta y aceptan los parámetros correspondientes cuando se llaman. Sin embargo, MySQL no proporcionó funciones similares antes de la versión 5.1, y algunos otros tipos de sistemas de administración de bases de datos tampoco.
En este artículo, las dos características anteriores se combinarán en el objeto de consulta del ejemplo. El ejemplo simulará un procedimiento almacenado básico y guardará el puntero de resultado internamente. Por ahora, la atención se centra en ejecutar la consulta desde el objeto, donde puede llamar a la función query() del objeto MySqlDB.
Las siguientes funciones públicas se pueden definir en el objeto de consulta:
__construct(): el constructor acepta un parámetro que contiene una referencia de instancia al objeto que implementa la interfaz DB.
prepare(): la función prepare() inicializa el procedimiento almacenado de consulta. Puede contener uno o más marcadores de posición limitados, que se pasarán como parámetros a la función ejecutar(). Un marcador de posición se define como dos puntos relacionados con el número de parámetros seguidos de un número entero y una letra relacionada con el tipo de parámetro.
Una consulta simple que contiene marcadores de posición se parece a lo siguiente:
SELECT col1,col2 FROM table_name WHERE col1=:1Ejecuto
(): la función ejecutar() ejecutará la consulta. Si la función prepare() lo inicializa prematuramente como un procedimiento almacenado, todos los parámetros pasados se usarán como parámetros de ejecución del procedimiento almacenado. De lo contrario, el primer parámetro solo se usará como texto de consulta. La función ejecutar() devolverá los resultados después de ejecutar la consulta.
compilar(): la función compilar() es similar a la función ejecutar(). De hecho, la consulta no se ejecuta, pero reemplaza todos los marcadores de posición en la cadena de consulta, acepta los parámetros del procedimiento almacenado y devuelve la versión compilada. de la consulta.
Miembros protegidos
Como se mencionó anteriormente, el concepto de visibilidad se puede utilizar para ocultar el funcionamiento interno de un objeto, protegiendo la integridad de los datos necesarios para el funcionamiento interno. Como se explicó anteriormente, el puntero de resultado devuelto por la consulta se guardará como un atributo protegido. El miembro protegido se utiliza aquí porque un objeto de consulta de base de datos específico derivado del objeto de consulta puede sobrecargar algunas funciones principales.
Ya basta de
profundizar en la teoría del código
, ahora comencemos a escribir código. Primero, cree una plantilla como se muestra en el Ejemplo 1:Ejemplo 1: una
clase de plantilla DBQuery
de la clase de consulta de base de datos.
{
/**
*Guardar una referencia a un objeto que implementa la interfaz DB.
*/
protegido $db
/**
*Si es un procedimiento almacenado, configúrelo en verdadero.
*/
protegido $procedimiento_almacenado = falso
/**;
*Guardar una consulta con todas las cadenas eliminadas.
*/
consulta $ privada
/**
* se utiliza para hacer coincidir comillas en SQL.
*/
estático privado $QUOTE_MATCH = "/(".*(?db = $db;
}
función pública preparar ($ consulta)
{
$this->stored_procedure = verdadero;
}
compilación de función pública ($args)
{}
ejecución de función pública ($ consulta)
{}
}
La función de preparación
es la plantilla del Ejemplo 1. Lo primero que debe hacer es construir la función preparar() Para garantizar que los caracteres sin comillas se analicen accidentalmente como marcadores de posición, la función debe eliminar todos los caracteres de la consulta. almacenarlos temporalmente en una matriz. La cadena en sí también será reemplazada por marcadores de posición, que generalmente se reconocen como secuencias de cadenas que no deberían aparecer en la declaración SQL. Durante la compilación de la consulta, primero se reemplaza el marcador de posición del procedimiento y luego la cadena se vuelve a colocar en la consulta. Esto se hace a través de la función preg_replace() y otra función de devolución de llamada auxiliar utilizada como función preg_replace().
Ejemplo 2: función preparar()
/**
* Preparar la consulta como procedimiento almacenado.
* @param string $query Texto de consulta preparado
* @retorno nulo
*/
función pública preparar ($ consulta)
{
$this->stored_procedure = verdadero;
$this->quote_store = array(); //Borrar comillas $this->query = preg_replace(self::$QUOTE_MATCH, '$this->sql_quote_replace("1"?"1":'2')', $ consulta);
}
función privada sql_quote_replace($match)
{
$número = recuento($this->query_strings);
$this->query_strings[] = $coincidencia;
devolver "$||$$número";
}
Tenga en cuenta aquí el uso del atributo estático QUOTE_MATCH privado, así como el atributo quote_store y la función sql_quote_replace(). En comparación con protegido, definirlo como privado aquí garantiza que cualquier subclase que anule el método prepare() de la clase de consulta utilice su propio mecanismo para eliminar comillas.
Función de compilación
El siguiente paso es construir las funciones compilar() y ejecutar().
La función compilar(), como se muestra en el Ejemplo 3, tiene las siguientes funciones:
·El número de parámetros aceptados es variable (es decir, parámetros variables), que coincidirán con los marcadores de posición en la consulta.
· Compruebe que el marcador de posición sea del tipo de datos correcto y reemplácelo con el valor del parámetro.
·Devuelve la consulta como una cadena pero no la ejecutas.
·Si el objeto de consulta no se inicializa como un procedimiento almacenado usando la función prepare(), se generará una excepción.
Ejemplo 3: función compilar()
/**
* Devuelve la consulta compilada, pero no la ejecuta.
* @param mixto $args,... Parámetros de consulta
* @return string Consulta compilada
*/
compilación de función pública ($params)
{
si (! $this->procedimiento_almacenado) {
throw new Exception ("¡El procedimiento almacenado no se ha inicializado!");
}
/* Parámetros de sustitución*/
$params = func_get_args(); // Obtener los parámetros de la función $query = preg_replace("/(?query);
return $this->add_strings($query); // Volver a poner la cadena en la consulta
}
/**
* Vuelva a insertar la cadena eliminada por la función prepare().
*/
función privada add_strings($cadena)
{
$números = array_keys($this->query_strings);
$cuenta = cuenta($números);
$búsquedas = matriz();
para($x = 0; $x < $cuenta; $x++) {
$búsquedas[$x] = "$||${$números[$x]}";
}
return str_replace($búsquedas, $this->query_strings, $string);
}
/**
* Cada vez que se ejecuta, se reemplaza un marcador de posición en el procedimiento almacenado.
*/
función protegida compile_callback($params, $index, $tipo)
{
--$index;
/* Lanzar una excepción */
si (! isset($params[$index])) {
throw new Exception ("¡El procedimiento almacenado no recibió la cantidad requerida de parámetros!");
}
/* Puede agregar otros tipos aquí, como fecha y hora. */
cambiar ($tipo) {
caso 'S':
return '"' . $this->db->escape_string($params[$index]) . '"';
romper;
caso 'yo':
return (int) $params[$índice];
romper;
caso 'N':
return (flotante) $params[$index];
por defecto:
throw new Exception ("El tipo de datos '$type' especificado en el procedimiento almacenado no se reconoce.");
}
}
Se utilizan dos funciones adicionales en la función compile(). La función compile_callback() se utiliza como función de devolución de llamada en la llamada a la función preg_replace(). Cada vez que se encuentra un marcador de posición en la consulta, se reemplaza con el valor pasado. Al compilar el valor de una función, esta se ejecutará.
Función ejecutar
Finalmente, necesita construir la función ejecutar(). La función ejecutar() compila la consulta y la ejecuta utilizando el objeto DB, que se utiliza aquí para inicializar el objeto DBQuery. Tenga en cuenta en el Ejemplo 4 cómo se utiliza la función call_user_func_array() para obtener la consulta compilada. La razón de esto es que la función ejecutar() no puede determinar la cantidad de argumentos que se le pasan hasta el tiempo de ejecución.
Ejemplo 4: función ejecutar()
/**
*
* Ejecute la consulta actual y reemplace los marcadores de posición con los parámetros proporcionados.
*
* @param mixto $queryParams,... Parámetro de consulta
* @return recurso Una referencia al recurso que representa la consulta ejecutada.
*/
función pública ejecutar ($queryParams = '')
{
//Por ejemplo: SELECCIONAR * DE la tabla DONDE nombre=:1S Y tipo=:2I Y nivel=:3N
$args = func_get_args();
si ($this->stored_procedure) {
/* Llamar a la función de compilación para obtener la consulta */
$consulta = call_user_func_array(array($this, 'compilar'), $args);
} demás {
/* Si el procedimiento almacenado no se ha inicializado, ejecútelo como una consulta estándar. */
$consulta = $queryParams;
}
$this->resultado = $this->db->query($consulta);
return $this->resultado;
}
Junte todo
para demostrar cómo usar el objeto de consulta, a continuación se construye un pequeño ejemplo, que utilizará el objeto DBQuery como procedimiento almacenado y verificará si se ingresaron el nombre de usuario y la contraseña correctos. Consulte el Ejemplo 5:
Ejemplo. 5:
requiere 'mysql_db.php5';
require_once 'query2.php5';
$db = nuevo MySqlDb;
$db->connect('host', 'nombre de usuario', 'contraseña');
$db->query('use content_management_system');
$query = new DBQuery($dbquery);
$query->prepare('SELECT fname,sname FROM usuarios DONDE nombre de usuario=:1S AND pword=:2S AND expire_time<:3I ');
if ($resultado = $consulta->ejecutar("visualad", "delantal", tiempo())) {
si ($db->num_rows($resultado) == 1) {
echo('Las credenciales son correctas.');
} demás {
echo('Las credenciales son incorrectas y la sesión ha caducado.');
}
} demás {
echo('Se produjo un error al ejecutar la consulta:' . $db->error());
}
En este artículo, ha visto cómo proteger datos y limitar la visibilidad de los objetos de datos utilizando los modificadores de acceso privado, protegido y público al declarar variables de clase. Al mismo tiempo, en PHP 5, estos conceptos también se pueden utilizar. otra clase de datos para proteger sus datos internos importantes.