Adhiere dinámicamente params en $ bind_param (); Mysqli

Tengo la clase de base de datos que se ocupa de todas las consultas que se realizarán en la base de datos que he preparado para trabajar perfectamente. bind_param también funciona bien, pero el problema es que quiero definir el tipo de variable de forma dinámica. aquí está mi código

public function query($sql, $params = array()){ $this->_error = false; if($this->_query = $this->_mysqli->prepare($sql)){ $x = 1; if(count($params)){ foreach($params as $param){ $this->_query->bind_param($x, $param); $x++; } } 

En PDO el primer parámetro define la posición que supongo, así que esta función funciona bien estableciendo X = 1 y x ++ cada vez, pero en bind_param primer argumento define el tipo Supongo que el manual de php.net dice que hay alguna manera de que el usuario presione el valor integral que establecí x = i para la cadena x = s y así sucesivamente para los 4 tipos …

me gusta

 if((int)$param->){ x = i; } 

cualquier Idea chicos?

gracias por adelantado

Aquí hay un ejemplo que podría ayudar (la función de prepare() es un método de clase).

 function prepare( $query, $bind = array() ) { if ( !$stmt = $this->mysqli->prepare( $query ) ) throw new Exception( 'Query failed: ' . $query . PHP_EOL . $this->mysqli->error ); // if $bind is not an empty array shift the type element off the beginning and call stmt->bind_param() with variables to bind passed as reference if ( $type = array_shift( $bind ) ) call_user_func_array( array( $stmt, 'bind_param' ), array_merge( array( $type ), array_map( function( &$item ) { return $item; }, $bind ) ) ); if ( !$stmt->execute() ) throw new Exception( 'Execute failed: ' . PHP_EOL . $stmt->error ); // choose what to return here ( 'affected_rows', 'insert_id', 'mysqli_result', 'stmt', 'array' ) } 

Ejemplo de uso:

 $db->prepare( "SELECT * FROM user WHERE user_name = ? OR user_email = ?", [ 'ss', $user_name, $user_name ] ); 

Para los tipos es fácil. Solo use s todo el camino.

Hay un problema mucho más complejo: de hecho, no se puede enlazar en un bucle, entonces, tiene que usar call_user_func()

 public function query($sql, $params = array()) { if (!$params) { return $this->_mysqli->query($sql); } $stmt = $this->_mysqli->prepare($sql); $types = str_repeat("s", count($params)); if (strnatcmp(phpversion(),'5.3') >= 0) { $bind = array(); foreach($values as $key => $val) { $bind[$key] = &$params[$key]; } } else { $bind = $values; } array_unshift($bind, $types); call_user_func_array(array($stmt, 'bind_param'), $bind); $stmt->execute(); return $stmt->get_result(); } 

Tenga en cuenta que no debe asignar una instrucción a una variable local y tampoco se usa la variable de error. Las excepciones son mejores en todos los sentidos.

Si observa el código anterior, debe pensar dos veces antes de pasar el PDO, que solo tendrá tres líneas para dicha función:

 public function query($sql, $params = array()) { $stmt = $this->_pdo->prepare($sql); $stmt->execute($params); return $stmt; } 

Si no tiene experiencia con PDO, aquí hay un tutorial de PDO que escribí, del cual aprenderá que es la API de base de datos más simple pero potente, obteniendo datos en docenas de formatos diferentes, con muy poca cantidad de código.

    Intereting Posts