Soy nuevo programando en PHP y aun mas programando con POO, por eso quiero mostrarles un sencillo código que he realizado para que me aconsejen en que punto se puede mejorar o como lo haríais vosotros. Realmente el código funciona, pero no quiere decir que lo pueda estar haciendo bien y por eso pido vuestra colaboracion:
1ª página:
conexion.php
Código PHP:
class Conectar{
private $host, $user, $pass, $database, $charset;
public function __construct() {
require_once('db.php'); // Contiene las constantes de la conf. de la base de datos
$this->host = SERVIDORLOCAL;
$this->user = USUARIO;
$this->pass = CONTRASEÑA;
$this->database = BASEDATOS;
$this->charset = CHARSET;
}
public function conexion(){
try{
if(!$mysqli = new mysqli($this->host, $this->user, $this->pass, $this->database)) throw new Exception("No se ha podido conectar con la base de datos.");
// Codificacion de caracteres utf-8
$mysqli->set_charset("'" . $this->charset . "'");
}catch(Exception $e){
echo "Mensaje de error: " . $e->getMessage();
exit;
}
return $mysqli;
}
}
insertClass.php
Código PHP:
require_once 'conexion.php';
class InsertDataDb {
private $conectar;
private $con;
private $params = array();
private $type;
private $tableName;
private $columnName;
private $values;
public function __construct() {
$this->conectar = new Conectar();
$this->con = $this->conectar->conexion();
}
private function refValues($arr){
if (strnatcmp(phpversion(),'5.3') >= 0) //Reference is required for PHP 5.3+
{
$refs = array();
foreach($arr as $key => $value)
$refs[$key] = &$arr[$key];
return $refs;
}
return $arr;
}
//Setters
/* Bind parameters. Types: s = string, i = integer, d = double, b = blob */
public function setType($type){
$this->type = (string) $type;
}
public function setTableName($tableName){
$this->tableName = (string) $tableName;
}
public function setParams($bind_params){
//Obtiene los nombre de la columna de la tabla de la bd
if(!isset($this->columnName)){
$this->columnName = implode(" , ", array_keys($bind_params));
}
//Obtiene el número de datos que el cliente va a ingresar en la bd para convertirlo en una sentencia preparada ejem: (?,?,?)
if (!isset($this->values)) {
$c = count($bind_params);
$v ='';
for($i = 0; $i < $c; $i++){
$v .= '?,';
}
$this->values = rtrim($v,',');
}
//Crea la sql
if(!isset($this->sql)){
$this->sql = "INSERT INTO " . $this->tableName . " (" . $this->columnName . ") VALUES (" . $this->values . ")";
}
$params = $bind_params;
if (isset($params) && is_array($params)) {
/* Unimos los parametros */
array_unshift($params, $this->type);
$bp = array_values($params);
$this->params = $bp;
}
}
//Insertar datos
public function insertData(){
if($stmt = $this->con->prepare($this->sql)){
call_user_func_array(array($stmt, 'bind_param'), $this->refValues($this->params));
}else{
throw new Exception("No se ha podido introducir los datos en la base de datos " . $this->con->error);
}
if(!$stmt->execute()) throw new Exception("Se ha producido un fallo en la ejecución de almacenamiento de datos en la base de datos." . $this->con->error);
$this->close();
}
//Inserta el ultimo id registrado
public function insertId(){
return $this->con->insert_id;
}
public function close(){
return $this->con->close();
}
}
Código PHP:
try{
$data = array(
'cliente' => 'Manolito',
'email' => '[email protected]',
'password' => '1234');
$insert = new InsertDataDb();
$insert->setTableName('usuario'); // Nombre de la tabla de la bd
$insert->setType('sss'); // Types: s = string, i = integer ...
$insert->setParams($data);
$insert->insertData();
}catch(Exception $e){
echo "Mensaje de error: " . $e->getMessage();
exit();
}