PHP - DOBLE SENTENCIA PREPARADA SIN $sttm->close();

 
Vista:
sin imagen de perfil
Val: 33
Ha aumentado su posición en 7 puestos en PHP (en relación al último mes)
Gráfica de PHP

DOBLE SENTENCIA PREPARADA SIN $sttm->close();

Publicado por Felipe De Jesus (16 intervenciones) el 06/04/2019 02:02:01
Mi problema es que necesito ejecutar dos sentencias preparadas pero usar la segunda en recursion de la primera esto sin haberla cerrado ante, el detalle es que no me permite ejecutar la segunda sentencia sin haber cerrado la anterior, pero debo de hacerlo de esta manera para que mi aplicación funcione.
Alguien sabe como poder hacer funcionar el siguiente codigo??
1
2
3
4
5
6
7
8
9
10
$sttm=$connect->prepare("SELECT id,session FROM `sessions` WHERE userid = ? AND `session` !=?");
$sttm->bind_param('is',$id,$mysession);
$sttm->execute();
$sttm->bind_result($session_id,$sesion_details);
while($sttm->fetch()){
	$sttm2=$connect->prepare("DELETE FROM `sessions` WHERE `sessions`.`id` =0");
	$sttm2->execute();
	$sttm2->close();
}
$sttm->close();


Me arroja el siguiente error:
Fatal error: Uncaught Error: Call to a member function execute() on boolean in C:\xampp\htdocs\pagos\php_action\login.php:102 Stack trace: #0 {main} thrown in C:\xampp\htdocs\pagos\php_action\login.php on line 102

Las dos sentencias estan correctas sintacticamente el problema es con el sttm->close()
¿Alguna idea para solucionar este problema?
Es un dolor de cabeza.. :c
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder
Imágen de perfil de joel
Val: 3.828
Oro
Ha mantenido su posición en PHP (en relación al último mes)
Gráfica de PHP

DOBLE SENTENCIA PREPARADA SIN $sttm->close();

Publicado por joel (1269 intervenciones) el 06/04/2019 11:20:44
Hola Felipe, cual es la linea 102? si es la primera linea del código que has publicado, comprueba que realmente estés conectado a la base de datos.. por alguna razón $sttm tiene un valor boleano en vez de un objeto.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
Imágen de perfil de italo_pm
Val: 920
Bronce
Ha mantenido su posición en PHP (en relación al último mes)
Gráfica de PHP

DOBLE SENTENCIA PREPARADA SIN $sttm->close();

Publicado por italo_pm (193 intervenciones) el 08/04/2019 02:23:01
Hola, el error esta en la linea que lo indica, pero no escribes cual es la linea.

Por otra parte, dices que una query es recursion de la otra, pero en la query de delete no tienes ningun parametro, la query es fija.

Has probado cada query en mysql y estas seguro que funcione? sea select y delete??

para tener una query recursiva de otra lo principal es que no se repitan los nombres de las variables hasta que se cierran los prepared statement y aparte de todo, mayormente se cuentan los records y luego haces loop.

podria quedar asi:

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
<?php
 
$sql = "SELECT id, session FROM sessions WHERE userid = ? AND session !=?";
 
$stmt = $connect->prepare($sql);
 
//controlo errores de conexion
if (!$stmt) {
  echo $connect->error;
}
 
$stmt->bind_param("is", $id, $mysession);
 
//controlo errores de la query.
if (!$stmt->execute()) {
  echo $stmt->error;
}
 
$stmt->bind_result($session_id, $sesion_details);
 
//si hay al menos un record.
if ($stmt->num_rows > 0) {
 
  while ($stmt->fetch()) {
 
    $sql = "DELETE FROM sessions WHERE sessions.id = 0";
    //$sql = "DELETE FROM sessions WHERE sessions.id = ?";
 
    $stmt2 = $connect->prepare($sql);
 
    //controlo errores de conexion
    if (!$stmt2) {
      echo $connect->error;
    }
 
    //$stmt2->bind_param("i", $tu_parametro); //$session_id
 
    //controlo errores de la query.
    if (!$stmt2->execute()) {
      echo $stmt2->error;
      exit;
    }
 
    //cierra prepared statement
    $stmt2->close();
 
  }
 
}
//cierra prepared statement
$stmt->close();

ten en cuenta que tu query de delete es:

1
$sql = "DELETE FROM sessions WHERE sessions.id = 0";

como te decia, esa query de delete no esta condicionada, controla, si necesitaras agregar parametros podria quedar:

1
2
$sql = "DELETE FROM sessions WHERE sessions.id = ?";
$stmt2->bind_param("i", $tu_parametro); //$session_id

prueba en test, con el database de test.

salud2.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
1
Comentar
sin imagen de perfil
Val: 33
Ha aumentado su posición en 7 puestos en PHP (en relación al último mes)
Gráfica de PHP

DOBLE SENTENCIA PREPARADA SIN $sttm->close();

Publicado por Felipe De Jesus (16 intervenciones) el 08/04/2019 22:45:39
Muchas gracias probare tu codigo, con respecto a el mio todo estaba bien incluso hice el siguiente cambio:
1
2
3
4
5
6
7
8
9
10
11
$sttm=$connect->prepare("SELECT id,session FROM `sessions` WHERE userid = ? AND `session` !=?");
$sttm2=$connect->prepare("DELETE FROM `sessions` WHERE `sessions`.`id` =1");}
 
$sttm->bind_param('is',$id,$mysession);
$sttm->execute();
$sttm->bind_result($session_id,$sesion_details);
while($sttm->fetch()){
	$sttm2->execute();
	$sttm2->close();
}
$sttm->close();
De la manera anterior no habia errores pero no se ejecutaba el DELETE asi que no se borraba mi registro con la ID 1, tambien probe probando lo siguiente:

1
2
3
4
5
6
7
8
9
10
11
$sttm=$connect->prepare("SELECT id,session FROM `sessions` WHERE userid = ? AND `session` !=?");
$sttm2=$connect->prepare("DELETE FROM `sessions` WHERE `sessions`.`id` =1");}
 
$sttm->bind_param('is',$id,$mysession);
$sttm->execute();
$sttm->bind_result($session_id,$sesion_details);
while($sttm->fetch()){
}
$sttm2->execute();
$sttm2->close();
$sttm->close();

De esta manera si se borraba el registro no entiendo por que denttro del while ignora la segunda sentencia, ¿tienes idea de por que?
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
Imágen de perfil de italo_pm
Val: 920
Bronce
Ha mantenido su posición en PHP (en relación al último mes)
Gráfica de PHP

DOBLE SENTENCIA PREPARADA SIN $sttm->close();

Publicado por italo_pm (193 intervenciones) el 09/04/2019 02:35:23
Hola, pues deberia de ejecutar el delete dentro del while, a lo que lleva mi pregunta por cual motivo deseas hacer el delete dentro del while? basta que hagas el select y luego si devuelve solo un record o mas, ejecuta el delete (sin necesidad del while)...por otra parte, es necesario que cierres el statement ($stmt->close();)?? ya que sin el close tambien funciona.

con el while y sin el close() podria hacerse asi:

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
<?php
 
//* file config database
 
$sql = "SELECT id, session FROM sessions WHERE userid = ? AND session !=?";
$stmt = $connect->prepare($sql);
 
$stmt->bind_param("is", $id, $mysession);
$stmt->execute();
 
$stmt->bind_result($session_id, $sesion_details);
 
  while ($stmt->fetch()) {
 
    $sql2 = "DELETE FROM sessions WHERE sessions.id = 1";
    $stmt2 = $connect->prepare($sql2);
 
    //$stmt2->bind_param("i", $session_id);
    $stmt2->execute();
 
    $records_eliminados = $stmt2->affected_rows;
 
    //controlo errores de la query.
    if ($records_eliminados == 0) {
      echo "<br>ATENCION: NINGUN RECORD ELIMINADO.<br>";
    } else {
      echo "<br>NUMERO RECORDS ELIMINADOS: ".$records_eliminados.".<br>";
    }
 
    //cierra prepared statement
    //$stmt2->close();
 
  }
 
//cierra prepared statement
//$stmt->close();

prueba.

salud2.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
1
Comentar