Problemas con insert usando FluentPDO
Publicado por Juan Alvarenga (1 intervención) el 13/01/2017 02:38:01
Hola que tal, tengo una duda que me esta quebrando la cabeza desde ya un par de días, he utilizado la librería FluentPDO ara hacer mis peticiones al servidor, y tengo mi backend con php 5.6 (recien actualice a php 7 y el mismo problema), verán, al momento de hacer un insert con la librería, se ejecuta la petición 2 veces por lo que me lanza un error 23000 de duplicación de llave porque ya se registro anteriormente.
tengo una clase database.php que contiene la la declaracion del PDO
y una clase Login.php que contiene las funciones que interactúan con la base de datos (inserts y selects)
y la clase Auth.php en la que hago uso de la librería jwt para generar un token con la información que traiga o inserte en la base de datos
esto me funciona parcialmente pues, cuando ejecuto la url para hacer el insert sucede esto:
pero si veo la consola, aparece la doble petición, a pesar de haberla ejecutado solo una vez
agradeceria mucho su ayuda, si me explican que hago mal o que me hace falta y como corregir este problema, pues he empleado esta misma forma e trabajo en otros proyectos y funciona sin errores, aun estando de la misma forma.
Saludos.
tengo una clase database.php que contiene la la declaracion del PDO
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
<?php
require_once("vendor/autoload.php");
class DataBase
{
public static function Conectar()
{
try {
$pdo = new PDO('mysql:host=localhost;dbname=db_name;charset=utf8', 'root', '****');
$pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
$pdo->setAttribute(PDO::ATTR_DEFAULT_FETCH_MODE, PDO::FETCH_OBJ);
return new FluentPDO($pdo);
} catch (Exception $e) {
die($e->getMessage());
}
}
}
y una clase Login.php que contiene las funciones que interactúan con la base de datos (inserts y selects)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
<?php
include_once "config/database.php";
include_once "auth.php";
date_default_timezone_set('America/Tegucigalpa');
ini_set("displayerrors", 1);
class Login
{
private $db;
private $Fecha;
public function __CONSTRUCT()
{
$this->db = DataBase::Conectar();
$fecha_server = getdate();
$this->Fecha = $fecha_server['year'] . '/' . $fecha_server['mon'] . '/' . $fecha_server['mday'] . ' ' . $fecha_server['hours'] . ':' . $fecha_server['minutes'] . ':' . $fecha_server['seconds'];
}
public function Registro($correo, $nombre, $telefono, $pass)
{
$result = '';
$dataUsuario = array('Correo' => $correo, 'Nombre' => $nombre, 'Telefono' => $telefono, 'Pass' => password_hash($pass, PASSWORD_DEFAULT),
'Estado' => 1, 'FechaCreacion' => $this->Fecha);
$data = array('Correo' => $dataUsuario['Correo'], 'Nombre' => $dataUsuario['Nombre'], 'Estado' => $dataUsuario['Estado']);
try {
$this->db->insertInto('usuarios', $dataUsuario)->execute();
if ($this->db) {
$result = array('estado' => 'exito', 'response' => 'Se ha registrado exitosamente', 'token' => Auth::SignIn($data));
}
} catch (PDOException $e) {
$result = array('estado' => 'error', 'response' => $e->getMessage());
}
echo json_encode($result);
}
public function Ingreso($correo, $pass)
{
try {
$response = $this->db->from('usuarios')->where('usuarios.Correo', $correo)->fetch();
if ($response) {
$data = array('Correo' => $response->Correo, 'Nombre' => $response->Nombre, 'Estado' => $response->Estado);
if ($response->Estado == 1) {
if (password_verify($pass, $response->Pass)) {
echo json_encode(array('estado' => 'exito', 'token' => Auth::SignIn($data)));
} else {
echo json_encode(array('estado' => 'error', 'response' => 'Contraseña incorrecta, Verifique la informacion ingresada'));
}
} else
echo json_encode(array('estado' => 'exito', 'response' => 'Su usuario esta Inactivo, comuniquese con el proveedor para reactivarlo'));
} else
echo json_encode(array('estado' => 'error', 'response' => 'Usuario no registrado'));
} catch (Exception $e) {
echo json_encode(array('estado' => 'error', 'response' => $e->getMessage()));
}
}
public function GetData($token)
{
$data = Auth::GetData($token);
if ($data['codigo'] === 1)
print_r(json_encode(array("status" => "exito", "response" => $data)));
else
print_r(json_encode(array("status" => "error", "response" => $data)));
}
}
y la clase Auth.php en la que hago uso de la librería jwt para generar un token con la información que traiga o inserte en la base de datos
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
<?php
use Firebase\JWT\JWT;
date_default_timezone_set('America/Tegucigalpa');
class Auth
{
private static $secret_key = 'Fx)+(17Yr8d@KH*/';
private static $encrypt = ['HS256'];
private static $aud = null;
public static function SignIn($data)
{
$time = time();
$token = array(
'iat' => $time,
'exp' => $time + 3600,
'aud' => self::Aud(),
'data' => $data
);
return JWT::encode($token, self::$secret_key);
}
public static function Check($token)
{
if (empty($token)) {
throw new Exception("El token suministrado es invalido");
}
$decode = JWT::decode(
$token,
self::$secret_key,
self::$encrypt
);
if ($decode->aud !== self::Aud()) {
throw new Exception("Sesión iniciada por un usuario no válido.");
}
}
public static function GetData($token)
{
try {
$data = JWT::decode(
$token,
self::$secret_key,
self::$encrypt
)->data;
return array("codigo" => 1, 'data' => $data);
} catch (Exception $e) {
return array('codigo' => 0, 'msg' => $e->getMessage());
}
}
private static function Aud()
{
$aud = '';
if (!empty($_SERVER['HTTP_CLIENT_IP'])) {
$aud = $_SERVER['HTTP_CLIENT_IP'];
} elseif (!empty($_SERVER['HTTP_X_FORWARDED_FOR'])) {
$aud = $_SERVER['HTTP_X_FORWARDED_FOR'];
} else {
$aud = $_SERVER['REMOTE_ADDR'];
}
$aud .= @$_SERVER['HTTP_USER_AGENT'];
$aud .= gethostname();
return sha1($aud);
}
}
esto me funciona parcialmente pues, cuando ejecuto la url para hacer el insert sucede esto:
pero si veo la consola, aparece la doble petición, a pesar de haberla ejecutado solo una vez
agradeceria mucho su ayuda, si me explican que hago mal o que me hace falta y como corregir este problema, pues he empleado esta misma forma e trabajo en otros proyectos y funciona sin errores, aun estando de la misma forma.
Saludos.
Valora esta pregunta
0