¿Cómo puedo modificar esta consulta a la BD?

  • Autor Autor xcodex
  • Fecha de inicio Fecha de inicio
X

xcodex

Muy buenas!!
Les resumo: Tengo una consulta la cual puede variar según como el usuario lo filtra.

La consulta a la BD:
PHP:
$sql = "SELECT * FROM publicaciones WHERE publicado = 'si' AND seleccion = :seleccion";
$sentencia = $pdo->prepare($sql);
$sentencia->bindParam(':seleccion', $seleccion, PDO::PARAM_STR);

El problema es que si lo hago de esa manera y el usuario no filtra ningún dato me da error, porque no puede quedar el AND seleccion = solo en la consulta.
Intenté hacerlo una variable así:
PHP:
$variable: "AND seleccion = :seleccion";
y modificar $variable pero no me deja.

Espero se haya entendido jaja
 
Última edición por un moderador:
primero la variable $sql_ofertas no esta en el código que muestra deberia ser reemplaza por $sql y la variable $seleccion donde esta definida ?

por si la moscas si tu variable de seleccion es del tipo post debes verificar que exista el post de seleccion asi:

PHP:
$seleccion = isset($_POST['seleccion']) ? $_POST['seleccion'] : '';

PHP 7:
PHP:
$seleccion = $_POST['seleccion'] ?? '';
 
primero la variable $sql_ofertas no esta en el código que muestra deberia ser reemplaza por $sql y la variable $seleccion donde esta definida ?

por si la moscas si tu variable de seleccion es del tipo post debes verificar que exista el post de seleccion asi:

PHP:
$seleccion = isset($_POST['seleccion']) ? $_POST['seleccion'] : '';

PHP 7:
PHP:
$seleccion = $_POST['seleccion'] ?? '';

es $sql_ofertas, NO $sql, ahí lo edité.

y $seleccion en realidad la declaro antes de ese código, y su valor sería según lo que indique el usuario en el filtro.

Igual el problema en cuestión es como hacer si el usuario no filtra ningún dato para que no quede AND seleccion solo, ya que da error la consulta.
 
PHP:
$sql = "SELECT * FROM publicaciones WHERE publicado = 'si'";
if($_POST['seleccion']) $sql .= " AND seleccion = :seleccion";
$sentencia = $pdo->prepare($sql);
$sentencia->bindParam(':seleccion', $_POST['seleccion'], PDO::PARAM_STR);
 
PHP:
$sql = "SELECT * FROM publicaciones WHERE publicado = 'si'";
if($_POST['seleccion']) $sql .= " AND seleccion = :seleccion";
$sentencia = $pdo->prepare($sql);
$sentencia->bindParam(':seleccion', $_POST['seleccion'], PDO::PARAM_STR);

Disculpa pero soy nuevo haciendo consultas con PDO.
¿Exactamente que es lo que hace?, porque hasta donde intenté no me dejaba almacenar AND... en una variable.
 
Disculpa pero soy nuevo haciendo consultas con PDO.
¿Exactamente que es lo que hace?, porque hasta donde intenté no me dejaba almacenar AND... en una variable.

Lo hice de rapidez podria ser así:

PHP:
<?php
$var_post = "123";/* supongamos que esto es $_POST['xxx']  */

$sql = "SELECT * FROM publicaciones WHERE publicado = 'si'" . (isset($var_post) && !empty($var_post) ? ' AND seleccion = ?"' : '');
echo $sql;

$r = $pdo->prepare($sql);
if(!empty($var_post)){
    $r->bindValue(1, $var_post, PDO::PARAM_STR);
}
$r->execute();
?>
 
Lo hice de rapidez podria ser así:

PHP:
<?php
$var_post = "123";/* supongamos que esto es $_POST['xxx']  */

$sql = "SELECT * FROM publicaciones WHERE publicado = 'si'" . (isset($var_post) && !empty($var_post) ? ' AND seleccion = ?"' : '');
echo $sql;

$r = $pdo->prepare($sql);
if(!empty($var_post)){
    $r->bindValue(1, $var_post, PDO::PARAM_STR);
}
$r->execute();
?>

Enormemente agradecido por la ayuda. Ya está todo funcionando. 🙂 🙂
 
Disculpa pero soy nuevo haciendo consultas con PDO.
¿Exactamente que es lo que hace?, porque hasta donde intenté no me dejaba almacenar AND... en una variable.

Le agrega
PHP:
AND seleccion = :seleccion
a $sql, si $_POST['seleccion'] no está vacío. (Creo que es lo que querías hacer)

Y así se completa la consulta con lo faltante, usandose entonces solo un condicional.
 
Última edición:
Le agrega
PHP:
AND seleccion = :seleccion
a $sql, si $_POST['seleccion'] no está vacío. (Creo que es lo que querías hacer)

Y así se completa la consulta con lo faltante, usandose entonces solo un condicional.

Te gradezco enormemente!!, está todo funcionando :-D
 
Atrás
Arriba